保持.exe时间戳不改变

问题描述 投票:0回答:4

有人知道如何防止可执行文件的时间戳更改吗?我正在尝试为 .exe 生成一致的哈希代码,但我认为时间戳可能会阻止这种情况发生。每次我重新编译代码 (VS C++) 时,FastSum 都会生成不同的校验和。

谢谢!

c++ hash timestamp checksum recompile
4个回答
3
投票

PE 文件格式(如 EXE 中)具有时间戳字段。 通过此链接查看“表 2. IMAGE_FILE_HEADER 字段”:http://msdn.microsoft.com/en-us/library/ms809762.aspx

如果你真的想的话,你可以在十六进制编辑器中编辑

TimeDateStamp
,或者编写一个小程序来为你完成它。 如果我正确地阅读了上面的文档,看起来它在偏移量 10 处有 4 个字节。

我不确定改变这一点会产生什么后果。 我的猜测是它可能会让你在调试程序时找不到符号。 也许您应该对 PE 标头之外的区域进行哈希处理,而不是更改二进制文件中的此字段。 (我提供的链接可能会帮助您确定这样做的意义。)


2
投票

根据您需要校验和的内容,您可以去掉 COFF 标头(时间戳所在的位置)或可选标头。在后一种情况下,您只需保存节表和节数据(可执行文件的二进制内容)。如果您确保源代码未更改并且编译和链接标志未更改,则节数据应保持不变。如果您想在校验和中包含版本号或代码大小,则必须包含可选标头。

要查找可选标头的开头,请按照以下步骤操作:

  1. 从0x3c读取4字节签名基地址。
  2. 转到签名偏移量。
  3. 偏移20字节。这是可选标头的开始。
  4. 如果是 32 位 exe 文件,则应为 0x10b;如果是 64 位,则应为 0x20b。

要查找节表的开头,请按照以下步骤操作:

  1. 从0x3c读取4字节签名基地址。
  2. 转到签名偏移量。
  3. 偏移16字节。
  4. 在此处读取 2 字节可选标头大小。
  5. 转到可选标题。
  6. Offset 可选标头大小字节。这是节表的开始。
  7. 您应该在这里看到一个节名称(如“.text”、“.data”等)。

有关 PE 和 COFF 格式的完整规范,请下载:Microsoft PE 和 COFF 规范


0
投票

我在 QT C++ 应用程序中遇到了这个问题。我想要可重复的、确定性的构建。

我发现在我的MinGW的bin文件夹中,有一个名为“strip.exe”的应用程序,它是GNU strip工具。您可以使用这样的标志来调用它,以生成时间戳归零的二进制文件(以及 UID、GID 和文件模式):

strip.exe --enable-deterministic-archives <your_executable.exe>

-3
投票

文件时间戳是由操作系统控制和维护的 - 它们不是文件(包括可执行文件)本身的内部。

© www.soinside.com 2019 - 2024. All rights reserved.