在其他逆向工程论坛上阅读一些线程时,我了解到在Delphi中编译的可执行程序具有特殊的属性。我不确定这些特殊属性是什么,但我认为这会使它们更难以逆向工程。有谁知道这些特殊属性是什么?

#1 楼

Delphi使用基于Pascal的面向对象的语言,它在很多方面都类似于反转C ++。在反转此类应用程序时,我发现有一些重要的知识,这些知识我知道是很重要的。这导致具有大量功能的大型二进制文件。组件代码通常由编译器放在可执行文件的开头,而用户代码放在后面。正确地识别和命名库函数可以为您节省大量时间,如果使用IDA,请确保已应用适当的FLIRT签名(可能是最近使用的bds签名之一)。 IDR还具有自己的签名集,有时可以提供其他有用的信息,例如类名和反编译的代码。可以将数据从IDR导出到IDC脚本并将其加载到IDA中,之后应重新应用IDA签名,因为IDC会删除一些函数名称。购买了Delphi的Embarcadero的公司(不要浪费时间在Borland网站上进行搜索)。

Delphi使用fastcall约定,但是它不同于Windows fastcall。参数按以下顺序传递:EAX,EDX,ECX,其他在堆栈上。对于类,此指针在EAX中传递。调用构造函数时,将在EAX中传递类的结构,并在EAX中返回this指针。构造函数可以在调用System :: ClassCreate()时进行标识。

Delphi使用Pascal样式的字符串。字符串的长度在字符串的开头指定。二进制文件中存储的字符串为C样式格式,首先需要通过调用LStrAsg方法进行转换。要了解程序中使用字符串的位置,您需要跟随转换后的字符串,典型的调用应如下所示:

mov     eax, ds:off_497050        ; Pascal string
mov     edx, offset a1_37 ; C-style string "1.37"
call    @System@@LStrAsg$qqrpvpxv ; System::LStrAsg(void*,void*)


#2 楼

有许多特定于Delphi的“编程元素”,例如类,单元,VCL库等。有关更多信息,您可能需要参考Delphi编程新手指南。

如果用Delphi编写逆向工程应用程序(并提取有关这些“编程元素”的信息),则DeDe工具非常有用。

#3 楼

对Delphi / C ++构建器目标进行反向工程时,我总是使用IDR工具。
一个非常有用的功能是IDR可以为Ida Pro生成一个映射文件。交互式Delphi Reconstructor)–可执行文件的反编译器(EXE)和动态库(DLL),用Delphi编写并在Windows32环境中执行。

首先,该程序旨在为公司从事反病毒软件的开发。它还可以帮助程序员
适当地恢复丢失的程序源代码。

当前版本的程序可以处理由Delphi编译器编译的文件(GUI和控制台
应用程序)。版本的Delphi2 –
DelphiXE2。

最终项目目标是开发能够从编译文件中还原大部分初始Delphi源代码的程序。 IDR以及其他Delphi反编译器还无法做到这一点。
但是,IDR处于相当大的便利这种
过程的状态。与其他著名的Delphi反编译器相比,IDR分析的结果具有最大的完整性和可靠性。
此外,交互性确实使程序运行舒适,并且(我们
不用害怕这个词)令人愉快。是危险的还是不理想的。

该程序不需要任何安装活动,并且不需要Windows注册表中的任何记录。

下面显示IDR主窗口的屏幕截图。您可以在单独的页面上找到
IDR工作结果的示例。要详细了解IDR,有一个CHM格式的帮助文件,该文件可以为
在下载页面上下载或直接从此链接下载。