与使用其他编程语言/编译器构建的其他可执行文件相比,为什么反编译 delphi exe 如此容易?
有一些东西可以帮助逆向delphi程序:
- 您可以获得完整的表单数据,包括事件处理程序方法的名称
- 所有成员均具有
published
可见性具有与 RTTI 一起使用的元数据
- 编译器在优化方面非常糟糕。它没有对整个程序进行优化,并且汇编通常是原始源代码的直接翻译,仅进行了较小的优化。 (至少在我使用的版本中是这样,从那时起可能有所改进)
- 所有类,甚至那些关闭 RTTI 编译的类,都具有一定程度的可用元数据。特别是可以获得名称和继承结构
classes
。对于您在调试器中碰巧看到的类的任何实例,您都可以获得其 VMT 及其类名。
Delphi 使用文本文件描述表单的内容并按名称连接事件处理程序。这种方法显然需要足够的元数据来反序列化 from 的文本表示并按名称连接事件处理程序。
其他一些 GUI 工具包使用的另一种方法是自动生成代码,用于初始化表单并使用代码连接事件处理程序。由于此代码直接使用指向事件处理程序的指针并直接分配给属性/调用设置器,因此不需要任何元数据。这有一个副作用,就是倒车变得有点困难。
创建一个将 dfm 文件转换为一系列创建表单的硬编码指令的程序应该不会太难。所以像 DeDe 这样的工具将不再那么好用了。但这在实践中并没有给你带来太多好处。
但是弄清楚哪个事件处理程序对应于哪个控件/事件仍然相当容易。特别是像 FLIRT 这样的东西可以识别大多数库函数。因此,您只需在您感兴趣的断点处设置断点,然后单步执行用户代码即可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)