该工具将扫描可执行文件中的Delphi数据,包括RTTI和虚拟功能表。它输出一个带有有关已识别类和功能的信息的JSON文件,例如:
提供一个可以将输出加载到IDA的IDAPYTHON脚本。
该脚本的编写是为了补充其他用于反向工程Delphi的工具。
NCC Group plc -http://www.nccgroup.com/发行作为开源。
由David Cannings(@edeca)开发[email protected]
http://www.github.com/nccgroup/pythia
该项目根据AGPL许可发布。请参阅许可证以获取更多信息。
高水平流量是:
Delphi Vftables有充分的记录。最新版本的信息可从Embarcadero获得。 Delphi 2005可以使用非官方文档(请参阅此处)。
免费pascal的源代码也很有用(github镜像)。
Vftable中的第一项是vmtSelfPtr ,指向虚拟函数表的开始。脚本将PE文件中的每个代码段扫描,以指向前方的任何位置+0x4C字节。请注意,Delphi编译器将VFTABLE对准4个字节边界(用于优化)。
例如,以下VA 0x0046E1C8包含偏移0x0046E214 ,即比当前位置前0x4C 。如IDA所示:
.text:0046E1C8 ; Classes::TComponent *vftable_TDCP_misty1
.text:0046E1C8 14 E2 46 00 vftable_TDCP_misty1 dd offset off_46E214
此方法可以产生误报,因此,检查VFTABLE中的其他字段是否有明智的值。例如,检查vmtInstanceSize ,以确保它不会过多,并且功能指针被验证为可执行的部分。在测试期间,尽管使用了蛮力搜索方法,在测试假阳性率很低。
检查Vftable中发现的每个函数,以查看其是否从父遗传或过载中继承。 Delphi不支持多个继承,因此可以通过检查父vftable中的指针与相同偏移量来实现这一目标。
如果两个指针都将其继承的相同函数引用。如果孩子有不同的指针,那么它已被超载。
该工具的主要输出是一个JSON文件,可以将其输入后续处理 /工具中。但是,还包括其他一些输出格式。
使用--save-tree选项生成类似的文件:
TObject (at 0x0040112c)
|-- Exception (at 0x004081f8)
| |-- EAbort (at 0x00408260)
| |-- EAbstractError (at 0x00408ad4)
| |-- EAssertionFailed (at 0x00408a74)
| |-- EBcdException (at 0x004bd110)
| | +-- EBcdOverflowException (at 0x004bd16c)
| |-- EBitsError (at 0x0041ab04)
| |-- EComponentError (at 0x0041abbc)
| |-- EConvertError (at 0x00408850)
| |-- EDCP_cipher (at 0x0046a0ac)
| | +-- EDCP_blockcipher (at 0x0046a29c)
| |-- EDCP_hash (at 0x00469f20)
.. etc ..
PACKAGEINFO或DVCLAL资源),并对不同的Vftable布局进行调整。call [ecx+3Fh]与实例方法)TComparer<System.Bindings.EvalProtocol.TPair<System.IInterface,System.Pointer>>等名称,在IDA中相当难以理解。请给我发送该工具不起作用的二进制文件的示例,以便对其进行改进。