Delphi反编译

|                                                                                                                   关闭。这个问题需要更加集中。它当前不接受答案。                                                      
已邀请:
有一些事情可以帮助逆转delphi程序: 您将获得完整的表单数据,包括事件处理程序方法的名称 所有可见度为“ 0”的成员都具有与RTTI一起使用的元数据 编译器在优化方面非常糟糕。它并没有对整个程序进行优化,而汇编通常只是对原始源代码的直接翻译,只有少量的优化。 (至少在我使用的版本中,此后可能有所改善) 所有类,甚至那些在关闭RTTI的情况下都可以使用的元数据。特别是可以得到
classes
的名称和继承结构。对于碰巧在调试器中看到的类的任何实例,您都可以获取其VMT以及类名称。 Delphi使用文本文件描述表单的内容,并按名称连接事件处理程序。这种方法显然需要足够的元数据来反序列化from的文本表示形式,并按名称连接事件处理程序。 一些其他GUI工具箱使用的替代方法是自动生成代码,该代码将初始化表单并使用代码连接事件处理程序。由于此代码直接使用指向事件处理程序的指针,并直接分配给属性/调用设置程序,因此不需要任何元数据。这样做的副作用是,反转变得有点困难。 创建一个将dfm文件转换为一系列硬编码指令以创建表格的程序应该不太困难。因此,像DeDe这样的工具将无法正常运行。但这在实践中并不会给您带来什么好处。 但是找出哪个evenhandler对应于哪个控制/事件仍然很容易。特别是因为FLIRT之类的东西可以识别大多数库函数。因此,您只需要断点感兴趣的代码,然后进入用户代码即可。     
您所做的陈述是错误的。与其他主流编译器生成的代码相比,Delphi并不是特别容易反编译。 对于.net语言,有Reflector。 这个堆栈溢出问题涵盖了C ++。 解释了Python / Perl / Ruby等。 如果您能够证明与其他广泛使用的语言相比,对Delphi可执行文件进行反编译的结果的质量明显更高,则您的问题将具有更大的重要性。     
战from中的故事:反编译一个微型Delphi DLL 我本人经历了Delphi反编译会话。这是那些听起来很假的“我丢失了源文件”之一,我确实确实丢失了一个微小的Firebird UDF库的源文件。现在,我没有更好的选择,因为库太小了,所以我没有立即进入反编译阶段,而且我知道重写会更快。 此DLL导出的函数如下所示:
function udf_do_some_math(Number1, Number2:Currency): Currency;
做完合理的事情并重写函数并进行了回归测试之后,我发现了一些晦涩的极端情况,其中新函数的结果与旧函数的结果不同!麻烦的是,新功能的结果是正确的结果,旧的DLL包含一个BUG,我不得不重现该BUG-这种功能的一致性比准确性更重要。 再次,做了理智的事情,并试图在BUG上“猜测”。我知道这是一个四舍五入的问题,但根本无法弄清楚它是什么。最后,我决定给反编译器尝试。毕竟这只是一个小图书馆,切入点很简单,我真的不需要可重新编译的代码,也不需要100%的反编译:我只需要弄清楚旧的BUG即可重现它! 反编译失败!我尝试了许多不同的反编译器,包括几个“商业”反编译器。从表面上看,大多数生成的数据看起来不错,但不足以找出旧错误。最有前途的一个是,它具有VCL和RTL的特定于版本的知识,这会带来最严重的失败:当然,它找到了RTL调用,给了它们名称,但是找不到导出的函数!我感兴趣的一个函数没有在入口点列表中显示,它应该是直接导出的,因为它是导出的函数。 这种反编译尝试应该很容易,因为: 该代码非常简单,但不是很多。 这是一个带有导出功能的DLL,没有您期望的事件驱动exe那样的复杂性。 我对可重新编译的代码不感兴趣,我只是想找到一个旧错误,以便可以重现它。 我没有要求Pascal代码,汇编程序已经足够好了。 我确切地知道代码在做什么以及它是如何做的。这不是神秘的第三方代码。 我的解决方案 在反编译器使我失败之后,我转向了自己可靠的Delphi IDE进行调试。我写了一个小Delphi程序,直接从DLL导入函数,创建了一个伪造的Firbird内存管理器DLL,以便我的DLL可以加载,使用我知道会带来不好结果的参数调用我的旧函数,并使用调试器进入代码密切关注FPU寄存器。经过几次失败的尝试之后,我终于注意到从FPU堆栈中弹出一个不应为整数的值,因此我没有使用BUG:我错误地定义了一个应该使用Currency的Integer局部变量。有了这些知识,我就能重现该错误。     
在Delphi中唯一更容易的事情是检索VCL。 使用DeDe等反编译器后,您将获得应用程序用户界面,但没有任何逻辑。 因此,如果您只想检索表单和按钮-Delphi比其他编译器更容易,但是如果您想知道单击按钮后发生了什么,则需要使用ollydbg或其他(调试器/反汇编器)其他创建可执行文件的语言。     
有优点也有缺点。我不确定您指的是哪个角度更容易。 1形式的简单应用程序与具有许多形式和大量类和功能的非常深入的应用程序相比,还存在巨大差异。就像记事本与Office 2013一样(假设它们是用delphi编码的,这只是一个比较复杂性而不是语言的示例)。 在小型应用程序中,拥有“通常” Delphi应用程序包含的额外信息可以使您轻而易举。但是,在大型应用程序中,它可能会“有所帮助”,但是您有上百万个电话需要挖掘。他们可能会帮助您到达附近,但在通话内部的通话中,然后是多次跳跃的多次回呼...使您感到头晕。然后,如果“打包”或保护了应用程序,则某些事情仍然可能是乱码。尽管它可以明智地进行编程,但阅读起来可能会困难得多。前一天,所有的字符串都被加密了,所以“引用文本字符串”没有帮助,而且加密不是简单的md5或base64,而是一些自定义算法。也许带有盐的MD5,然后用base64编码?我永远无法获得关于字符串的确切方法。我知道其中一些应该是什么,但是无法重现该方法,即使它看起来像是base64,它也是已经加密过的字符串的base64,但我如何加密...我不依赖于文本字符串,但是在大型的大型应用中,一点点帮助。 当然,我对此问题的解释是在OllyDbg中查看Delphi exe。我可能不在你们讨论这个话题的基础上,但是我对Olly和Reversing的看法是正确的(如果那是您的意思)。     

要回复问题请先登录注册