有没有可以反编译Delphi程序的软件?

30

有人给我发送了一个程序的反编译 C 代码。这是一个非常好的反编译,产生了漂亮的、大部分可读的C代码(如果你忽略变量和函数都没有人类可读名称的事实),看起来它基本上可以编译通过。

但是有一个很大的问题。我碰巧知道他正在反编译的程序是用 Delphi 写的,Delphi 充满了难以转化为 C 的概念。但我真的很受这个反编译器的输出感动,这让我想知道。有什么工具可以为 Delphi 做到这一点吗?

我见过的最好的 Delphi 反编译工具是 DeDe。它可以做很多事情,但它甚至不试图将其输出作为 Object Pascal 代码,并且它自 Delphi 6 以来就没有更新了。有更好的工具吗?


你有反编译Delphi应用程序为C源伪代码的程序名称吗?我想看看一个旧的1999程序是如何实现算法的。我无法运行该应用程序以确定其行为,因为图形处理中存在资源泄漏问题,需要重新启动大约十分钟的使用时间。 - AMissico
根据邮件,它是使用IDA Pro制作的,使用了一个名为“Hex Rays Decompiler”的插件。 - Mason Wheeler
谢谢您的回复。我想这是Hex-Rays反编译器。这是我找到的唯一能做到您所描述的事情的工具。 - AMissico
4个回答

13
您可以使用IDR进行反编译Delphi程序,它是一个优秀的程序,支持当前的Delphi版本,并拥有许多功能。

看起来IDR只能在D2009及以下版本中使用(理论上支持D2010,但它的上下文数据归档已经被密码保护),并且不支持XE或更高版本,也无法将代码反编译回Pascal。 - Mason Wheeler
@MasonWheeler D2010现在已经免费且无需密码保护。 - Hanan N.
1
IDR反编译器似乎不支持64位软件包。 - Ben

12

我认为目前没有任何将机器代码转换成Pascal代码的反编译器。大多数所谓的“Delphi反编译器”只是解析窗体和RTTI数据,而并非真正的反编译机器代码。我唯一能推荐的是使用类似DeDe(或类似的软件)来提取符号信息,结合C语言反编译器,然后将反编译的C代码转换为Delphi代码(有许多源代码转换器可用)。


2
就我所知,在 Delphi 的早期版本中有一个完整的反编译器。不过多年来我已经没有看到或听说过它了。 - mj2008
@mj2008 有人对此更了解吗?我有一个 Delphi 4/5 项目,这可能在现在看来是“早期阶段” :-) - Daniel Alder
Delphi使用不同的函数调用语义(而不是__stdcall)。在与retdec.com的测试中,它“忘记”保留返回值,并没有正确地检测函数的开始和结束,导致结果无法使用。 - Daniel Alder
@DanielAlder 好久不见,但我记得调用约定是特定于编译器后端而非语言的 - 因此,在 Borland 的 C 编译器中也会看到相同的调用约定。 - Vladimir Panteleev

7

3
Delphi、C 和 C++ 等语言编译成处理器本地机器代码,输出的可执行文件几乎没有元数据。这与 Java 或 .Net 不同,它们编译成面向对象的平台无关字节码,保留方法名称、方法参数、类和命名空间以及其他元数据。
因此,Delphi 或 C 代码可以进行的有用反编译要少得多。 然而,Delphi 通常为项目中的任何表单嵌入表单数据(由 $R * .dfm 行生成),并且它还具有所有已发布属性的元数据,因此 Delphi 特定工具能够提取此信息。

1
即使它不是反射丰富的托管代码,读取Delphi生成的ASM并在我的头脑中将其转换回Object Pascal代码并不是非常困难。我经常在那个级别上进行调试。你失去的只是名称,而你可以大多数情况下从上下文中推断出它们。 - Mason Wheeler
8
提示:如果你认为这很简单,那就开始自己实施吧。 - Jim McKeeth
3
梅森:你在进行那个代码测试的时候开启了优化吗? - Marco van de Voort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接