首页
社区
课程
招聘
[原创]用IDA SDK开发的超强Delphi对象识别插件(plugins)
发表于: 2009-3-31 03:06 31691

[原创]用IDA SDK开发的超强Delphi对象识别插件(plugins)

2009-3-31 03:06
31691

用IDA SDK开发的超强Delphi对象识别插件(plugins)

功能:FindDelphiClass.plw可以用于查找所有Delphi对象的地址,DecodeDelphiClass.plw对光标当前地址的Delphi对象进行成片地识别,然后给出详尽的注释信息并对所涉及到的对象成员函数尽可能地给出其名称。这是一个初始测试版本,但功能已足够强大,用了就知道。可能会有许多bug。

使用:将DecodeDelphiClass.plw和FindDelphiClass.plw复制到IDA5.2的安装文件夹plugins下,用IDA PRO 5.2打开一个用Delphi编译的32-bit可执行文件,然后按快捷键“Ctrl-Alt-F”运行FindDelphiClass.plw,这时会出现对话框选择从哪里开始:0表示从程序的起始地址开始搜索整个文件;1表示从当前光标所在地址开始搜索到文结束。默认选项为0。单击OK按钮后将提示是否要将搜索信息存盘,单击Yes即可存盘。等搜索结束后,如果没有错误,即可在已经打开文件的当前文件夹下找到一个.log信息记录文件。根据该文件提供的地址在IDA中找到相应位置(用G命令,然后输入该地址),这时按快捷键“Ctrl-Alt-S”运行DecodeDelphiClass.plw即可出现想要的结果了。

实例:以自己用Delphi开发的小程序cdsize.exe为例给出结果。操作见“操作说明.pdf”。

限制:只能在IDA 5.2下运行,目前不能识别Delphi 2.0的对象(如TotalCommander),其他版本似乎都可以。

附件:已经升级


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (37)
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢分享
2009-3-31 11:33
0
雪    币: 2506
活跃值: (1030)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
3
不错。不过好像是按快捷键“Ctrl-Alt-X”运行DecodeDelphiClass.plw吧?
2009-3-31 16:00
0
雪    币: 178
活跃值: (159)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
只能膜拜了,学习~~
2009-3-31 16:10
0
雪    币: 141
活跃值: (1135)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
5
3楼说得对,现已改正。
2009-3-31 16:38
0
雪    币: 141
活跃值: (1135)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
6
修正了一些bug,识别更准确并给出了一个识别前后的对比的例子。
可以用
http://www.ieinspector.com/httpanalyzer/downloadV4/HttpAnalyzerFullV4_Trial.exe

http://www.vlsoftware.net/files/expt.zip
来试试其威力,当然任何其他Delphi编译的未加壳程序(除1楼中给出的限制以外)也是可以的。请感兴趣的朋友多提宝贵意见。
上传的附件:
2009-4-2 22:35
0
雪    币: 141
活跃值: (1135)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
7
第四次升级,又修正了一些错误。
上传的附件:
2009-4-10 17:15
0
雪    币: 2506
活跃值: (1030)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
8
这里可不可以改成按快捷键“Ctrl-Alt-S”直接读取 log 文件的数据后自动解析?手工解析太慢。
2009-4-15 23:27
0
雪    币: 141
活跃值: (1135)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
9
这个实现起来有点难度,本来最初是想自动识别,但遇到诸多困难。因为Delphi的对象存在多种变体,不像Delphi string那样规矩,但是要精准地识别Delphi string已经实属不易。

自动识别Delphi对象的plugin目前还没有调试通过,等以后有时间再努力把。不知是否存在能够用idc脚本来调用plugin的方法。如果有的话,倒是可以考虑用idc脚本读取.log文件中的地址,然后再调用plugin。

不过FindDelphiClass.plw几乎可以列出整个程序的全部对象起始地址,如果只是关心局部内容的话,现在的版本以已经足够强大,因为DecodeDelphiClass.plw可以成片地识别Delphi对象,而不是某一个。这个问题的难点在于如何准确地确定成片对象的末地址,从而确定其地址空间。
2009-4-16 21:26
0
雪    币: 2506
活跃值: (1030)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
10
嗯,等你的新版。不过你那个字串识别插件我今天在分析一个 Delphi 的木马中试了一下,有好几个字串没能识别出来。
2009-4-17 23:01
0
雪    币: 141
活跃值: (1135)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
11
可否提供未分析出Delphi string的样本?
2009-4-18 09:55
0
雪    币: 2506
活跃值: (1030)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
12
是个木马资源中捆绑的 dll,完成木马主要功能的。密码是 muma
上传的附件:
2009-4-18 12:43
0
雪    币: 141
活跃值: (1135)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
13
经检查你所提供的样本,没有发现漏掉的Delphi string。有些情况
0FFFFFFFFh 后面不一定就是Delphi string,如

File Offset
00000900 F9 8B F4 C7 44 24 08 FF FF FF FF 33 C9 89 4C 24
00000910 0C 89 44 24 10 03 54 24
这里的0FFFFFFFFh是汇编指令的立即数;

再如
File Offset
0000EC00 00 00 00 00 FF FF FF FF 00 00 00 00 0B 55 6E 69
0000EC10 74 5F 63 6F 6D 66 75 6E 55 8B EC 81 C4 C4 FB FF
这里的0FFFFFFFFh 是名字为".2" 的 Delphi type 对象的一部分... 等等。

你可否指出“有好几个字串没能识别出来”的具体情况?以便找出bug,提高识别准确率。0FFFFFFFFh 仅仅是判断 Delphi string的必要条件,而非充分条件。
我前面提到要准确识别 Delphi string 并不是那末简单就是指这个“充分条件”不太好把握。谢谢你提出宝贵意见。

另外需要补充说明一点就是.log文件中记录的是某一组(group)Delphi string中的第一个,而不是全部。我这里是以组(连续的一个或若干个Delphi string为一组)为单位进行记录的。跟前面Delphi对象搜索结果不同。如果你认为有必要也可以改为记录所有的Delphi string。
2009-4-18 14:36
0
雪    币: 2506
活跃值: (1030)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
14
例如这样的:
CODE:00415E94 dword_415E94    dd 61505C0Ch, 656D6172h, 73726574h, 5Ch
CODE:00415E94                                         ; DATA XREF: Install+307o

如果在 OllyDBG 中看调用的话,会类似这样:
00885AF3  |.  BA 945E8800   MOV EDX,00885E94                         ;  ASCII 0C,"\Parameters\"

对这个字串的识别类似这样:
00885E94   .  0C            DB 0C
00885E95   .  5C 50 61 72 6>ASCII "\Parameters\"
00885EA1      00            DB 00

不过 IDA 和你的插件都无法把这个 ASCII 字串识别出来,只能手工在 IDA 中设置。这个可能要求高了一点,呵呵
2009-4-18 15:17
0
雪    币: 141
活跃值: (1135)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
15
你说的应该是Pascal string (length+string 不以0字节结尾) 而不是 Delphi string (0FFFFFFFFh+length+C_string),我这里是专门识别Delphi string,没考虑 Pascal string。的确Pascal string 的识别难度更大一些,但最难的是C string。正因为难度太大,IDA才给出了C-style, DOS style, Pascal style, Wide pascal, Delphi, Unicode, Unicode pascal, Unicode wide pascal 和 Character terminated 这么多选项,电脑无论如何也比不上人脑,这也是IDA以thinking为核心的具体体现。
2009-4-18 17:01
0
雪    币: 2506
活跃值: (1030)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
16
嗯,Pascal string 识别不了也无所谓,用到的时候自己改一下就行了。还是多谢你的插件。
2009-4-18 18:56
0
雪    币: 141
活跃值: (1135)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
17
对版本兼容性作了调整,重编译后可以在IDA 4.9(4.9 Free版除外)到IDA 5.2下运行,目前不能识别Delphi 2.0的对象(如TotalCommander),其他版本似乎都可以。
上传的附件:
2009-4-19 19:19
0
雪    币: 255
活跃值: (49)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
18
很cool的东东 感谢分享
2009-5-28 16:47
0
雪    币: 200
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
挺好的,支持一下。
能自动完成ctrl+alt+s的功能会更好,log里面几百条项目,部分替换也需要慢慢找
2009-6-4 12:45
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
很cool的东东 感谢分享
2009-9-2 09:30
0
雪    币: 4560
活跃值: (1002)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
很好的插件,顶了
2009-9-2 09:55
0
雪    币: 66
活跃值: (960)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22


Ctrl+Alt+s
那两个放到了plugins

用了一下,可能是不会用。放到里同,竟然出这样的错

Detecting Delphi classes...
Start from address UnPackEr:0048EA1C ...
Delphi class not found.
2009-9-21 05:19
0
雪    币: 88
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
l lov you ~!!!
2009-9-21 23:49
0
雪    币: 89
活跃值: (187)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
大大 請教一各問題   如果要識別 自行宣告的CLASS 要怎麼做
2009-9-24 19:08
0
雪    币: 141
活跃值: (1135)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
25
大大 請教一各問題 如果要識別 自行宣告的CLASS 要怎麼做


请提供具体实例。
2009-11-8 10:43
0
游客
登录 | 注册 方可回帖
返回
//