[原创]用IDA SDK开发的Delphi字符串(string类型)识别插件(plugins
发表于:
2009-4-15 23:11
14014
[原创]用IDA SDK开发的Delphi字符串(string类型)识别插件(plugins
用IDA SDK开发的Delphi字符串(string类型)识别插件(plugins)功能:
AutoDelphiString.plw可以用于识别所有Delphi字符串。
Delphi字符串的数据存储格式为:
0FFFFFFFFh // Delphi 字符串标志
string_length // 字符串长度(不包括尾部的字节0)
C-style_string // 以字节0为结尾的C语言字符串
例如,在Delphi中有一个字符串'Delphi String', 编译后在可执行文件中的结果为:
dd 0FFFFFFFFh
dd 0Dh
db 'Delphi String',0
当IDA能够自动识别时,其形式如下:
CODE:00455948 dd 0FFFFFFFFh ; _top
CODE:00455948 dd 13 ; Len
CODE:00455948 db 'Delphi String',0 ; Text
它实际上是一个结构体:
_strings struc ; (sizeof=0x8, variable size)
_top dd ? ; base 16
Len dd ? ; base 10
Text db 0 dup(?) ; string(C)
_strings ends
但有相当多的Delphi字符串并没有识别出来(特别是中文字符串),而且即便识别为如上形式,在程序引用时也不够直观,其一般形式为
mov edx, offset stru_455948.Text
还不如将其改为如下形式:
CODE:00455948 dd 0FFFFFFFFh, 0Dh
CODE:00455950 aPascalString db 'Pascal String',0
这时在程序中的引用形式为
mov edx, offset aPascalString ; "Pascal String"
这样字符串的引用就更加直观,便于阅读。
AutoDelphiString.plw能对整个程序的所有Delphi字符串进行成片地识别。可以从光标当前地址开始到文件结尾,也可以从文件开始到文件结尾。使用:
将AutoDelphiString.plw复制到IDA5.2的安装文件夹plugins下,用IDA PRO 5.2打开一个用Delphi编译的32-bit可执行文件,然后按快捷键
“Ctrl-Alt-P”运行AutoDelphiString.plw,这时会出现对话框选择从哪里开始:0表示从程序的起始地址开始识别整个文件;1表示从当前光标所在地址开始识别到文结束。默认选项为0。单击OK按钮后将提示是否要将识别信息存盘,单击Yes即可存盘。等识别结束后,如果没有错误,即可在已经打开文件的当前文件夹下找到一个.log信息记录文件。根据该文件提供的地址在IDA中找到相应位置(用G命令,然后输入该地址),这时即可看到识别结果了。操作:
以自己用Delphi开发的小程序cdsize.exe为例给出操作过程,见附件中的“AutoDelphiString操作说明.pdf”。限制:
只能在IDA 5.2下运行,识别没有加壳的(或脱过壳的)Delphi程序。举例:
某个加壳程序脱壳后的一小段识别结果对比:
识别前的情况
.text:00589F1C dd 0FFFFFFFFh, 4
.text:00589F24 dword_589F24 dd 0E5CCDABAh, 0
.text:00589F2C dd 0FFFFFFFFh, 6
.text:00589F34 aTitle1 db 'Title1',0
.text:00589F3B align 4
.text:00589F3C dd 0FFFFFFFFh, 6
.text:00589F44 aTitle2 db 'Title2',0
.text:00589F4B align 4
.text:00589F4C byte_589F4C db 0
.text:00589F4D align 10h
.text:00589F50 dd 0FFFFFFFFh, 0Bh
.text:00589F58 dword_589F58 dd 0E5CCACBFh, 3242475Fh, 323133h, 0FFFFFFFFh, 6
.text:00589F6C aTitle3 db 'Title3',0
.text:00589F73 align 4
.text:00589F74 dd 0FFFFFFFFh, 5
.text:00589F7C aText1 db 'Text1',0
.text:00589F82 align 4
.text:00589F84 dd 0FFFFFFFFh, 5
.text:00589F8C aText2 db 'Text2',0
识别后的结果
.text:00589F1C dd 0FFFFFFFFh, 4
.text:00589F24 asc_589F24 db '黑体',0
.text:00589F29 align 4
.text:00589F2C dd 0FFFFFFFFh, 6
.text:00589F34 aTitle1 db 'Title1',0
.text:00589F3B align 4
.text:00589F3C dd 0FFFFFFFFh, 6
.text:00589F44 aTitle2 db 'Title2',0
.text:00589F4B align 4
.text:00589F4C byte_589F4C db 0
.text:00589F4D align 10h
.text:00589F50 dd 0FFFFFFFFh, 0Bh
.text:00589F58 aMX_gb2312 db '楷体_GB2312',0
.text:00589F64 dd 0FFFFFFFFh, 6
.text:00589F6C aTitle3 db 'Title3',0
.text:00589F73 align 4
.text:00589F74 dd 0FFFFFFFFh, 5
.text:00589F7C aText1 db 'Text1',0
.text:00589F82 align 4
.text:00589F84 dd 0FFFFFFFFh, 5
.text:00589F8C aText2 db 'Text2',0
本插件的识别率非常高,但也难免会有bug,请多提宝贵意见。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
上传的附件: