【问题标题】:how to compare delphi exe如何比较delphi exe
【发布时间】:2012-08-06 15:42:03
【问题描述】:

我有两个 delphi 生成的同一个项目的 exe。一个exe是很久以前生成的,第二个exe是最近使用当前源代码生成的。现在这两个exe之间存在大小差异。有什么方法可以找出大小不同的原因,以及是否有任何新功能错误地添加到新 exe 中。因为exe是二进制的。我们可以转换成任何可读的格式吗?或任何其他提示/ cmets?感谢您的帮助。

注意:我没有生成第一个 exe 的源代码。所以无法比较源代码。 :(

【问题讨论】:

  • 这两个可执行文件是用相同版本的 Delphi 创建的吗?现代 Delphis 生成更大的可执行文件。大小差异有多大?你怎么能没有原始的源代码?你不使用修订控制吗?既然你没有原始源代码,为什么还要关心旧的 exe?
  • 是的,两个 exe 都使用相同的版本开发,两个 exe 之间的大小差异约为 10kb。我们使用版本控制,但代码不是由很久以前修改过的人签入的。 :( 因为所有企业都使用原始源代码 exe。所以试图找到原始源代码的副本,以便我可以在其上添加新功能。
  • 很难看到你在这方面走得很远。你甚至不知道 exe 是如何构建的,编译器选项是什么等等。尝试反编译这两个可执行文件并查看差异。然后你可能会意识到你的任务的重要性!如果我是你,我会使用源代码并编写你想要的逻辑。如果您依赖于一个您不了解并且不知道它在做什么的程序,那么您的状态就很糟糕。收回控制权。
  • 另一个影响 exe 大小的因素是第三方库。如果您在此过程中升级了组件或库,则可以重新编译相同的源并获得不同的结果。即之前,你有 VCLZip 3.0,现在你有 4.5。在没有其他源代码更改的情况下,如果您的应用使用 VCLZip,则大小会有所不同。
  • 比较exe是没有意义的,尤其是另一个exe是很久以前构建的,来源和编译器设置未知。从很久以前开始,任何事情都可能发生。即使你可以比较两个 exe,你能得到什么值?请记住,它们是 exe,而不是源代码。相反,对两个 exe 进行功能测试更有价值。

标签: delphi exe


【解决方案1】:

有一些工具可以反汇编本机 Intel x86 或 x64 可执行文件并输出文本汇编程序指令,但由于在编译为本机代码时保留的原始源代码文本很少,因此该反汇编程序生成的文本很可能是机器生成的字母汤。机械上正确,但人为胡言乱语。

您可以尝试将新旧 exe 都反汇编为 asm 文本,然后使用文本差异工具比较 asm 文本之间的差异。这将有助于减少创建巨大差异日志的小更改的差异工具噪音,因为小更改会导致所有全局偏移量在其后发生变化。反汇编后的 asm 文本应该有更少的全局偏移依赖。

事实是,如果您没有一个了解 Intel asm 指令和 Delphi 编译器代码生成模式的人,那么即使这个反汇编步骤也不太可能产生很多有用的信息来帮助您理解为什么这两个 exe 是不同的尺寸。在一个 exe 大小为 500k 的重要应用程序中,10k 的差异可能是由使用不同的编译器选项进行编译引起的,例如使用堆栈帧与删除堆栈帧,或以调试模式与非调试模式编译。

即使在新的 exe 中添加对 Writeln() 的引用也可能占到这 10k 的大部分 - RTL 中的文本 IO 例程智能链接到您的 exe 中,除非有人使用它,并且触摸 Writeln 会触及整个森林RTL 内的支持例程。如果旧的 exe 不使用 Writeln 而新的 exe 使用,那么新的 exe 将携带 Writeln 支持例程,我隐约记得重量“超过几 K”。

【讨论】:

    【解决方案2】:

    您可以使用http://corelabs.coresecurity.com/index.php?module=Wiki&action=view&type=tool&name=turbodiff 中的turbodiff 查看两个可执行文件之间的差异。当然你还需要IDA 5.0的免费版本,你可以从http://www.hex-rays.com/products/ida/support/download_freeware.shtml

    下载

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 2011-12-16
      • 2010-12-28
      相关资源
      最近更新 更多