【问题标题】:exe checksum different after each recompile每次重新编译后exe校验和不同
【发布时间】:2011-04-26 18:43:24
【问题描述】:

所以我试图弄清楚如何让我的 exe 在重新编译时具有相同的哈希码/校验和。我正在使用 FastSum 生成校验和。目前,没有进行任何代码更改,我只是在 VS 中重建项目,校验和结果不同。代码是用c++编写的。

我不熟悉以这种方式使用哈希码和/或校验和,但我做了一些研究并阅读了一些关于需要一致 GUID 的内容。但我不知道这将如何与校验和生成程序联系起来......

好吧,我先不说了,先谢谢了。

【问题讨论】:

    标签: c++ hash checksum portable-executable recompile


    【解决方案1】:

    你检查过exe之间的差异吗?我怀疑编译器/链接器正在将日期或时间插入二进制文件中,因此每个二进制文件都会与另一个不同。或者可能更糟,有时编译器/链接器在自己的系统内存中构建静态表,然后将其复制到二进制文件中,假设你有 9 个字节的东西,出于对齐原因,编译器选择在二进制文件中使用 12 个字节,我已经看到编译器/链接器获取该计算机系统内存中的任何 3 个字节并将其复制到文件中。理想情况下,您希望工具将它们用于此类事情的内存清零,以便获得可重复的结果。

    基本上在文件之间做一个二进制差异,然后你应该找出它们不匹配的原因。

    【讨论】:

    • 此外,即使编译器/链接器没有插入日期/时间信息,代码中对__DATE__ 的任何引用也会产生相同的效果。
    • 伙计,我希望它与编译器/链接器的决定无关!我知道在我们编写的代码中没有提到 [code]__DATE__[/code],但这并不意味着我猜它没有被使用。我会做一个二进制差异,看看会发生什么,谢谢大家。
    • 我做了一个二进制差异,有两个不同的部分。一开始是正确的,我认为它是标题的一部分,但我不知道如何确定它到底是什么。有一行“此程序不能在 DOS 模式下运行”。换行符,然后是“$00000000000000”,下一个块是第一个区别所在的位置。第二个主要由文本组成,大约是数据的一半,并且必须与编译器移动内容有关,只是因为感觉像它......
    • 使用 hexdump -C 或类似的东西来检查那个区域,如果它是 ascii 日期和时间,它应该会跳出来并且很明显。
    • 嗯,它似乎不是日期/时间,在该部分中唯一突出的是 PE,我认为它是可移植的可执行文件,这是否重要我不知道.但我认为如果中途数据的其他部分发生变化,我无能为力。
    【解决方案2】:

    据我回忆,EXE 格式包含一个构建时间戳,因此 exe 的哈希值(包括该时间戳)会在每次重新编译时发生变化。

    【讨论】:

    • 嗯,好的,我可能会考虑修复时间戳。谢谢!
    【解决方案3】:

    这是托管二进制文件吗?托管二进制文件有一个 GUID 部分,该部分在构建之间会发生变化,您无能为力。

    您可以通过运行“link /dump /all [filename]”或“link /dump /disasm [filename]”来更好地查看二进制文件中的更改。 /all 选项将向您显示所有十六进制值以及它们的 ascii 等效项,而 /disasm 选项将反汇编代码并以汇编形式显示给您,这可能更易于阅读,但可能会忽略一些可能存在的细微差异导致哈希发生变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多