Delphi反编译
|
关闭。这个问题需要更加集中。它当前不接受答案。
没有找到相关结果
已邀请:
5 个回复
钨蜡唤喉晤
的名称和继承结构。对于碰巧在调试器中看到的类的任何实例,您都可以获取其VMT以及类名称。 Delphi使用文本文件描述表单的内容,并按名称连接事件处理程序。这种方法显然需要足够的元数据来反序列化from的文本表示形式,并按名称连接事件处理程序。 一些其他GUI工具箱使用的替代方法是自动生成代码,该代码将初始化表单并使用代码连接事件处理程序。由于此代码直接使用指向事件处理程序的指针,并直接分配给属性/调用设置程序,因此不需要任何元数据。这样做的副作用是,反转变得有点困难。 创建一个将dfm文件转换为一系列硬编码指令以创建表格的程序应该不太困难。因此,像DeDe这样的工具将无法正常运行。但这在实践中并不会给您带来什么好处。 但是找出哪个evenhandler对应于哪个控制/事件仍然很容易。特别是因为FLIRT之类的东西可以识别大多数库函数。因此,您只需要断点感兴趣的代码,然后进入用户代码即可。
超可林
淑灯
做完合理的事情并重写函数并进行了回归测试之后,我发现了一些晦涩的极端情况,其中新函数的结果与旧函数的结果不同!麻烦的是,新功能的结果是正确的结果,旧的DLL包含一个BUG,我不得不重现该BUG-这种功能的一致性比准确性更重要。 再次,做了理智的事情,并试图在BUG上“猜测”。我知道这是一个四舍五入的问题,但根本无法弄清楚它是什么。最后,我决定给反编译器尝试。毕竟这只是一个小图书馆,切入点很简单,我真的不需要可重新编译的代码,也不需要100%的反编译:我只需要弄清楚旧的BUG即可重现它! 反编译失败!我尝试了许多不同的反编译器,包括几个“商业”反编译器。从表面上看,大多数生成的数据看起来不错,但不足以找出旧错误。最有前途的一个是,它具有VCL和RTL的特定于版本的知识,这会带来最严重的失败:当然,它找到了RTL调用,给了它们名称,但是找不到导出的函数!我感兴趣的一个函数没有在入口点列表中显示,它应该是直接导出的,因为它是导出的函数。 这种反编译尝试应该很容易,因为: 该代码非常简单,但不是很多。 这是一个带有导出功能的DLL,没有您期望的事件驱动exe那样的复杂性。 我对可重新编译的代码不感兴趣,我只是想找到一个旧错误,以便可以重现它。 我没有要求Pascal代码,汇编程序已经足够好了。 我确切地知道代码在做什么以及它是如何做的。这不是神秘的第三方代码。 我的解决方案 在反编译器使我失败之后,我转向了自己可靠的Delphi IDE进行调试。我写了一个小Delphi程序,直接从DLL导入函数,创建了一个伪造的Firbird内存管理器DLL,以便我的DLL可以加载,使用我知道会带来不好结果的参数调用我的旧函数,并使用调试器进入代码密切关注FPU寄存器。经过几次失败的尝试之后,我终于注意到从FPU堆栈中弹出一个不应为整数的值,因此我没有使用BUG:我错误地定义了一个应该使用Currency的Integer局部变量。有了这些知识,我就能重现该错误。
吐兄
娠侈脚惮顽