每次重新编译后,exe校验和不同

时间:2011-04-26 18:43:25

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

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

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

好吧,我会留下来的,谢谢你。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这是托管二进制文件吗?托管二进制文件的GUID部分从构建版本更改为构建版本,并且您无法阻止它。

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