首页
社区
课程
招聘
[原创]IDAPython脚本: 自动识别DELPHI6中的类型信息
发表于: 2008-7-21 23:42 6442

[原创]IDAPython脚本: 自动识别DELPHI6中的类型信息

2008-7-21 23:42
6442
简要说明

一、        功能介绍:
IDA有良好的反汇编功能,但是却不能自动识别DELPHI中的TypeInfo,而象Virtual Member Table ( VMT ) 等结构又存在于大多数DELPHI程序中,IDA在识别时通常仅能识别出一些简单信息(如偏移地址),而对于结构本身却没有详细注释和定义。由此导致我们在用IDA分析DELPHI程序时,常常会为找一些按钮或者控件的事件地址而头疼,因此很多人都希望能够让IDA吸收DeDe的优点,针对DELPHI程序在反汇编时提供更详细有用的信息。在网上已经有一些IDC脚本(后面将提供我搜索到的一些参考资料)可以解析TypeInfo,参考这些资料我也写了一个简单的脚本,可以输出所有控件的事件及地址。当然还可以进一步开发出类似DeDe的更多功能,但时间有限,先做这个自己觉得最需要的功能了。

二、        运行环境:
2.1 ) IDA ( www.datarescue.com )
2.2 ) Python ( www.python.org )
2.3 ) IDAPython ( idapython.googlecode.com )
2.4 ) psyco ( psyco.sourceforge.net )
其中IDA 、Python 、IDAPython 必须正确安装后才能使用本程序。psyco是Python的一个扩展功能库,可以加速Python的运行速度。如果你的机器性能不错,可不必安装。
本程序为IDAPython环境下的脚本文件,主程序为Delphi.py,其它Python文件是其相关模块。运行时选择主程序Delphi.py即可。

三、        如何使用:
在IDA反汇编窗口中,按下Alt+9键或者选择菜单Edit / Plugins / IDAPython 。此时将弹出文件选择窗口,选择Delphi.py文件即可。如果你反汇编的程序较大而机器性能不佳的话,可能会出现几分钟的假死现象,稍等片刻即可。
    如果你对Python有一定的了解,可以修改代码以适合你自己的需要。代码中有些功能被屏蔽,主要考虑到自己的操作习惯不一定适合其他人的需要,为避免引起别人使用上的困惑,所以只提供最基础的功能及提示。

四、        结果对比:
以DeDe.exe为例,使用IDA反汇编后的结果如下:

CODE:005897D0 off_5897D0      dd offset dword_58981C  ; DATA XREF: sub_58EF8C+97D r
CODE:005897D0                                         ; CODE:00590F74 r
CODE:005897D4                 dd 2 dup(0)
CODE:005897DC                 dd offset dword_58981C
CODE:005897E0                 dd 4 dup(0)
CODE:005897F0                 dd offset aTclassesdumper ; "TClassesDumper"
CODE:005897F4                 dd 20h, 401114h, 403FD4h, 403FE0h, 403FE4h, 403FE8h, 403FDCh
CODE:005897F4                 dd 403D24h, 403D40h, 58D654h
CODE:0058981C dword_58981C    dd 0Eh, 10000h, 97AC0000h, 40058h
CODE:0058981C                                         ; DATA XREF: CODE:off_5897D0 o
CODE:0058981C                                         ; CODE:005897DC o
CODE:0058982C                 db 2 dup(0)
CODE:0058982E aTclassesdumper db 14,'TClassesDumper'  ; DATA XREF: CODE:005897F0 o
CODE:0058983D                 align 10h
CODE:00589840 off_589840      dd offset off_58988C    ; DATA XREF: CODE:005A6233 r
CODE:00589844                 dd 2 dup(0)
CODE:0058984C                 dd offset dword_58997C
CODE:00589850                 dd offset aTdedemainformm ; "\a\rTDeDeMainForm寴X"
CODE:00589854                 dd offset byte_5899B6
CODE:00589858                 dd offset unk_58A280
CODE:0058985C                 align 10h
CODE:00589860                 dd offset aTdedemainform ; "\rTDeDeMainForm\x1B"
CODE:00589864                 dd 595h, 466440h, 426538h, 469128h, 4692D0h, 403FE8h, 46B66Ch
CODE:00589864                 dd 403D24h, 403D40h, 469338h
CODE:0058988C off_58988C      dd offset @Controls@TWinControl@AssignTo$qqrp19Classes@TPersistent
CODE:0058988C                                         ; DATA XREF: CODE:off_589840 o
CODE:0058988C                                         ; Controls::TWinControl::AssignTo(Classes::TPersistent *)
CODE:00589890                 dd offset @Forms@TCustomForm@DefineProperties$qqrp14Classes@TFiler ; Forms::TCustomForm::DefineProperties(Classes::TFiler *)
CODE:00589894                 dd offset @Classes@TPersistent@Assign$qqrp19Classes@TPersistent ; Classes::TPersistent::Assign(Classes::TPersistent *)
CODE:00589898                 dd offset @Forms@TCustomForm@Loaded$qqrv ; Forms::TCustomForm::Loaded(void)
CODE:0058989C                 dd offset @Forms@TCustomForm@Notification$qqrp18Classes@TComponent18Classes@TOperation ; Forms::TCustomForm::Notification(Classes::TComponent *,Classes::TOperation)
CODE:005898A0                 dd offset @Forms@TCustomForm@ReadState$qqrp15Classes@TReader ; Forms::TCustomForm::ReadState(Classes::TReader *)
CODE:005898A4                 dd offset @Controls@TControl@SetName$qqrx17System@AnsiString ; Controls::TControl::SetName(System::AnsiString)
CODE:005898A8                 dd offset sub_426550

    运行Delphi.py后的结果如下:

CODE:005897D0 TClassesDumper_VMT dd offset TClassesDumper_InitTable
CODE:005897D0                                         ; DATA XREF: TDeDeMainForm_PreBtnClick+97D r
CODE:005897D0                                         ; TDeDeMainForm_FormCreate+26C r
CODE:005897D0                                         ; vmtSelfPtr
CODE:005897D4                 dd 0                    ; vmtIntfTable
CODE:005897D8                 dd 0                    ; vmtAutoTable
CODE:005897DC                 dd offset TClassesDumper_InitTable ; vmtInitTable
CODE:005897E0                 dd 0                    ; vmtTypeInfo
CODE:005897E4                 dd 0                    ; vmtFieldTable
CODE:005897E8                 dd 0                    ; vmtMethodTable
CODE:005897EC                 dd 0                    ; vmtDynamicTable
CODE:005897F0                 dd offset TClassesDumper_ClassName ; vmtClassName
CODE:005897F4                 dd 20h                  ; vmtInstanceSize
CODE:005897F8                 dd offset TObject_VMT   ; vmtParent
CODE:005897FC                 dd offset @System@TObject@SafeCallException$qqrp14System@TObjectpv ; vmtSafeCallException
CODE:00589800                 dd offset nullsub_33    ; vmtAfterConstruction
CODE:00589804                 dd offset nullsub_100   ; vmtBeforeDestruction
CODE:00589808                 dd offset @System@TObject@Dispatch$qqrpv ; vmtDispatch
CODE:0058980C                 dd offset nullsub_49    ; vmtDefaultHandler
CODE:00589810                 dd offset @Comctrls@TTreeNodes@GetFirstNode$qqrv ; vmtNewInstance
CODE:00589814                 dd offset sub_403D40    ; vmtFreeInstance
CODE:00589818                 dd offset sub_58D654    ; vmtDestroy
CODE:0058981C TClassesDumper_InitTable dw 0Eh         ; DATA XREF: CODE:TClassesDumper_VMT o
CODE:0058981C                                         ; CODE:005897DC o
CODE:0058981C                                         ; X
CODE:0058981E                 dd 0                    ; Size
CODE:00589822                 dd 1                    ; Count
CODE:00589826                 dd offset _7_TypeInfoPtr ; TypeInfo, Index: 0000
CODE:0058982A                 dd 4                    ; Offset
CODE:0058982E TClassesDumper_ClassName db 14,'TClassesDumper' ; DATA XREF: CODE:005897F0 o
CODE:0058983D                 align 10h
CODE:00589840 TDeDeMainForm_VMT dd offset TDeDeMainForm_SelfPtr ; DATA XREF: CODE:005A6233 r
CODE:00589840                                         ; vmtSelfPtr
CODE:00589844                 dd 0                    ; vmtIntfTable
CODE:00589848                 dd 0                    ; vmtAutoTable
CODE:0058984C                 dd offset TDeDeMainForm_InitTable ; vmtInitTable
CODE:00589850                 dd offset TDeDeMainForm_TypeInfo ; vmtTypeInfo
CODE:00589854                 dd offset TDeDeMainForm_FieldTable ; vmtFieldTable
CODE:00589858                 dd offset TDeDeMainForm_MethodTable ; vmtMethodTable
CODE:0058985C                 dd 0                    ; vmtDynamicTable
CODE:00589860                 dd offset TDeDeMainForm_ClassName ; vmtClassName
CODE:00589864                 dd 595h                 ; vmtInstanceSize
CODE:00589868                 dd offset TForm_VMT     ; vmtParent
CODE:0058986C                 dd offset @Classes@TComponent@SafeCallException$qqrp14System@TObjectpv ; vmtSafeCallException
CODE:00589870                 dd offset @Forms@TCustomForm@AfterConstruction$qqrv ; vmtAfterConstruction
CODE:00589874                 dd offset @Forms@TCustomForm@BeforeDestruction$qqrv ; vmtBeforeDestruction
CODE:00589878                 dd offset @System@TObject@Dispatch$qqrpv ; vmtDispatch
CODE:0058987C                 dd offset @Forms@TCustomForm@DefaultHandler$qqrpv ; vmtDefaultHandler
CODE:00589880                 dd offset @Comctrls@TTreeNodes@GetFirstNode$qqrv ; vmtNewInstance
CODE:00589884                 dd offset sub_403D40    ; vmtFreeInstance
CODE:00589888                 dd offset @Forms@TCustomForm@$bdtr$qqrv ; vmtDestroy
CODE:0058988C TDeDeMainForm_SelfPtr dd offset @Controls@TWinControl@AssignTo$qqrp19Classes@TPersistent
CODE:0058988C                                         ; DATA XREF: CODE:TDeDeMainForm_VMT o
CODE:0058988C                                         ; CODE:0058AA7F o
CODE:0058988C                                         ; Offset: 0000
CODE:00589890                 dd offset @Forms@TCustomForm@DefineProperties$qqrp14Classes@TFiler ; Offset: 0004
CODE:00589894                 dd offset @Classes@TPersistent@Assign$qqrp19Classes@TPersistent ; Offset: 0008
CODE:00589898                 dd offset @Forms@TCustomForm@Loaded$qqrv ; Offset: 000C
CODE:0058989C                 dd offset @Forms@TCustomForm@Notification$qqrp18Classes@TComponent18Classes@TOperation ; Offset: 0010
CODE:005898A0                 dd offset @Forms@TCustomForm@ReadState$qqrp15Classes@TReader ; Offset: 0014
CODE:005898A4                 dd offset @Controls@TControl@SetName$qqrx17System@AnsiString ; Offset: 0018
CODE:005898A8                 dd offset sub_426550    ; Offset: 001C
CODE:005898AC                 dd offset @Forms@TCustomForm@ValidateRename$qqrp18Classes@TComponentx17System@AnsiStringt2 ; Offset: 0020
CODE:005898B0                 dd offset sub_426230    ; Offset: 0024
CODE:005898B4                 dd offset @Forms@TCustomForm@QueryInterface$qqsrx5_GUIDpv ; Offset: 0028
CODE:005898B8                 dd offset @Forms@TCustomForm@$bctr$qqrp18Classes@TComponent ; Offset: 002C
CODE:005898BC                 dd offset sub_457290    ; Offset: 0030

五、        参考资料
5.1 ) IDA -- idc delphi 类表的建立 作 者: gzgzlxg
5.2 ) IDA-IDC 建立 PE Header作 者: gzgzlxg
5.3 ) Typeinfo IDC scripts collection 作 者: Igor Skochinsky
5.4 ) Typeinfo parsing for Borland/C++ Builder 作 者: Dmitry Friesen

六、最后
程序编写比较匆忙,没有做足够多的测试,目前仅针对DELPHI 6编写的程序作过一些测试,因此不可避免程序可能还包含有很多错误。如果你有兴趣修正这些错误或者在此基础上做更多扩展功能,非常欢迎。只希望你能把更新后的版本也传我一份 :-)

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 97697
活跃值: (200824)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
Thanks for share.
2008-7-21 23:46
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
3
ljtt老大还是代表着先进生产力啊,最近也研究用idapython做cfg+dfg了
2008-7-22 09:42
0
雪    币: 260
活跃值: (102)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
学习大牛的作品。
2008-7-23 22:11
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
有时间要学python~
2008-7-24 20:33
0
雪    币: 13
活跃值: (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
ljtt// what version of python do you use?
python24?
on my python25, error occurred.
name error "IsValidAddress is not defined " .
2008-7-25 00:52
0
雪    币: 1241
活跃值: (160)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
我用的也是python2.5,这个函数定义在utils.py文件中,错误提示可能由于没有找到delphi.py同目录下的这个文件引起的。试着把delphi.py所在目录加入到系统的环境变量path中看看。
2008-7-25 01:53
0
雪    币: 13
活跃值: (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
in my opinion,
it is better idea to change the "utils.py" to "myutils.py".
because "utils named module" may exist already so can`t load your utils.py.
i tested it.
after change the "utils.py" to "myutils.py"
new error occurred

name error MakeUnknown is not defined.

where is defined MakeUnknown in?
in python ? or in imported idautils and idc?
maybe same name MakeUnknown exist at the same time
上传的附件:
2008-7-25 13:59
0
雪    币: 13
活跃值: (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
sorry,
i have updated idapython from 0.9.00 to 0.960.
every problems have gone away.
anyway thanks for kind comments.
上传的附件:
2008-7-25 15:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
牛.会Python,会Delphi,还是看不懂.再看.
2008-7-27 13:03
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢,收藏了!
2008-7-30 08:13
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
下来用用。。。。。
2008-8-3 22:12
0
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
不错谢谢
2008-8-4 13:15
0
雪    币: 201
活跃值: (105)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
喔嘚神啊,这弄出来的东西直逼源码了
2009-5-7 11:08
0
游客
登录 | 注册 方可回帖
返回
//