代码之家  ›  专栏  ›  技术社区  ›  Nalu

如何比较delphi.exe

  •  0
  • Nalu  · 技术社区  · 12 年前

    我有两个delphi生成的exe相同的项目。一个exe是很久以前生成的,第二个exe是最近使用当前源代码生成的。现在这两个exe在大小上有所不同。是否有任何方法可以找出大小不同的原因,以及是否有任何新功能错误地添加到新的exe中。因为exe是二进制的。我们能转换成任何可读的格式吗?或者有其他建议/意见吗?谢谢你的帮助。

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

    2 回复  |  直到 12 年前
        1
  •  2
  •   dthorpe    12 年前

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

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

    残酷的事实是,如果你没有一个了解英特尔asm指令和Delphi编译器代码生成模式的人,即使是这个反汇编步骤也不太可能产生太多有用的信息来帮助你理解为什么这两个ex的大小不同。在一个exe大小为500k的非平凡应用程序中,10k的差异可能是由使用不同的编译器选项编译引起的,例如使用堆栈帧与删除堆栈帧,或者在调试模式与非调试模式下编译。

    即使在新的exe中添加对Writeln()的引用,也可能占到这10k的大部分——RTL中的文本IO例程会智能地链接到你的exe之外,除非有人使用它,而触摸Writeln会接触到RTL内的整个支持例程林。如果旧的exe没有使用Writeln,但新的exe使用了,那么新的exe将携带Writeln支持例程,我隐约记得这些例程的权重是“几个K以上”。

        2
  •  1
  •   pani    12 年前

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