Delphi程序逆向

Delphi是是使用Pascal语言的一种开发工具,类似于MFC,是一种封装好的界面开发环境。

函数调用约定

Delphi遵循_fastcall调用约定,但是与Windows的_fastcall略有不同,参数顺序为eax为第一个参数、edx为第二个参数、ecx为第三个参数,大于3个的参数通过堆栈传递,大于三个的堆栈顺序从左到右依次压栈,堆栈由被调用者恢复。

变量结构定义

Delphi常用的字符串的内存布局不同于C/C++的char*或则string对象,Delphi使用的字符串都是Pascal的字符串,在原始字符串前面存放的是字符串的长度.

逆向建议

  • 控件绑定着响应回调函数,可以在Delphi程序的RCDATA资源中查看到。
  • 因为IDA针对Delphi库函数识别不高,使用专用反汇编工具解析。使用IDR解析后生成idc脚本文件供IDA导入函数。
  • IDA里边设置函数识别库为对应版本的语言函数库
  • 手动微调:
    • Load a new file,取消勾选的Analysis下的两个自动分析选项
    • Options–>Compiler:Compiler(Delphi)、Calling convention(FastCall)
    • Options–>General–>String:Default string literal type(Pascal/Pascal16)
    • View–>View–>Open Subviews–>Type libraries, remove the defaults
    • View–>Open Subviews–>Signatures–>Apply new Signatures:选择delphi相关Signatures
    • Edit–>Select all,在IDA View区域右键Analyze selected area

使用IDR的原因

  • 得益于多个版本的符号bin文件,IDR能够识别大部分Delphi库函数,比IDA的识别率高很多
  • 默认设置直接解析delphi程序的字符串信息,在IDR Strings可以查看和搜索这些字符串
  • 可视化查看delphi的RCDATA信息Form界面信息,并且能够直接获得按钮等元素的响应函数地址
  • ClassViewer窗口可直接查看部分类及函数名称,猜测这部分函数为RCDATA中声明的函数或则类似C++的RTTI信息

参考链接

Delphi程序逆向反汇编技巧小记

Dephi逆向工具Dede导出函数名MAP导入到IDA中的实现方法_python_脚本之家