有人知道如何防止可执行文件的时间戳更改吗?我正在尝试为 .exe 生成一致的哈希代码,但我认为时间戳可能会阻止这种情况发生。每次我重新编译代码 (VS C++) 时,FastSum 都会生成不同的校验和。
谢谢!
PE 文件格式(如 EXE 中)具有时间戳字段。 通过此链接查看“表 2. IMAGE_FILE_HEADER 字段”:http://msdn.microsoft.com/en-us/library/ms809762.aspx
如果你真的想的话,你可以在十六进制编辑器中编辑
TimeDateStamp
,或者编写一个小程序来为你完成它。 如果我正确地阅读了上面的文档,看起来它在偏移量 10 处有 4 个字节。
我不确定改变这一点会产生什么后果。 我的猜测是它可能会让你在调试程序时找不到符号。 也许您应该对 PE 标头之外的区域进行哈希处理,而不是更改二进制文件中的此字段。 (我提供的链接可能会帮助您确定这样做的意义。)
根据您需要校验和的内容,您可以去掉 COFF 标头(时间戳所在的位置)或可选标头。在后一种情况下,您只需保存节表和节数据(可执行文件的二进制内容)。如果您确保源代码未更改并且编译和链接标志未更改,则节数据应保持不变。如果您想在校验和中包含版本号或代码大小,则必须包含可选标头。
要查找可选标头的开头,请按照以下步骤操作:
要查找节表的开头,请按照以下步骤操作:
有关 PE 和 COFF 格式的完整规范,请下载:Microsoft PE 和 COFF 规范。
我在 QT C++ 应用程序中遇到了这个问题。我想要可重复的、确定性的构建。
我发现在我的MinGW的bin文件夹中,有一个名为“strip.exe”的应用程序,它是GNU strip工具。您可以使用这样的标志来调用它,以生成时间戳归零的二进制文件(以及 UID、GID 和文件模式):
strip.exe --enable-deterministic-archives <your_executable.exe>
文件时间戳是由操作系统控制和维护的 - 它们不是文件(包括可执行文件)本身的内部。