2011-04-26 65 views
2

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

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

嗯,我会离开它,在此先感谢。

回答

0

从我记得,EXE格式包含一个构建时间戳记,因此包含该时间戳记的exe的散列值在每次重新编译时都会发生变化。

+0

Hrm,好的,我会考虑修复时间戳。谢谢! – 2011-04-26 18:48:59

3

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

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

+0

另外,即使编译器/链接器没有插入日期/时间信息,代码中对'__DATE__'的任何引用都会产生相同的效果。 – Clifford 2011-04-26 18:53:18

+0

男人,我希望它不会与编译器/链接器决定有关!我知道在我们编写的代码中没有提及[code] __ DATE __ [/ code],但这并不意味着我没有使用它。我会做一个二进制差异,看看会发生什么,谢谢你们。 – 2011-04-26 19:05:16

+0

我做了一个二进制差异,有两个不同的部分。一开始是正确的,我认为它是标题的一部分,但我不知道如何确切地确定它是什么。有一行“这个程序不能在DOS模式下运行”。换行符,然后是“$ 00000000000000”,下一个块是第一个区别。第二部分大部分是文本,大概是数据的一半,并且必须与编译器移动东西有关,只是因为它感觉像... – 2011-04-26 19:56:43

0

这是一个托管二进制文件吗?托管的二进制文件有一个GUID部分,从构建到构建都有变化,您可以做的很多事情来阻止它。

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