与使用其他编程语言/编译器构建的其他可执行文件相比,为什么反编译delphi exe是如此简单?
解决方法
有一些东西可以帮助逆转delphi程序:
>您将获得完整的表单数据,包括事件处理程序方法的名称
>已发布可见性的所有成员都具有与RTTI一起使用的元数据
>编译器在优化方面非常糟糕.它没有完整的程序优化,并且汇编通常是原始源的直接转换,只需要很少的优化. (至少在我使用的版本中,从那时起可能有所改进)
>所有类,甚至是使用RTTI编译的类都具有一定级别的元数据可用.特别是可以获得类的名称和继承结构.对于您在调试器中碰巧看到的任何类的实例,您可以获得其VMT,从而获得其类名.
Delphi使用描述表单内容的文本文件,并按名称挂钩事件处理程序.这种方法显然需要足够的元数据来反序列化from的文本表示,并按名称连接事件处理程序.
一些其他GUI工具包使用的替代方法是自动生成代码,该代码初始化表单并使用代码连接事件处理程序.由于此代码直接使用指向事件处理程序的指针并直接分配给属性/调用setter,因此它不需要任何元数据.这有副作用,倒转变得有点困难.
创建一个程序将dfm文件转换为一系列硬编码指令来创建表单应该不会太难.因此像DeDe这样的工具将不再适用.但这在实践中并没有给你带来太多好处.
但是找出哪个evenhandler对应哪个控件/事件仍然相当容易.特别是因为像FLIRT这样的东西可以识别大多数库函数所以你只需要断开你感兴趣的那个,然后进入用户代码.