每次重新编译后的Exe校验和不同

exe checksum different after each recompile

本文关键字:Exe 校验和 编译 新编译      更新时间:2023-10-16

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

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

好吧,我就讲到这里,提前谢谢你。

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

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

根据我的回忆,EXE格式包括一个构建时间戳,因此EXE的哈希值,包括该时间戳,将在每次重新编译时更改。

这是一个托管二进制文件吗?托管二进制文件有一个GUID部分,它会随着构建的不同而改变,你无法阻止它。

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