简要说明
一、 功能介绍:
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编写的程序作过一些测试,因此不可避免程序可能还包含有很多错误。如果你有兴趣修正这些错误或者在此基础上做更多扩展功能,非常欢迎。只希望你能把更新后的版本也传我一份 :-)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
上传的附件: