1

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

谢谢!

4

4 回答 4

2

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

看起来如果你真的想要,你可以TimeDateStamp在十六进制编辑器中编辑,或者编写一个小程序来为你做。如果我正确阅读了上述文档,它看起来像是偏移 10 处的 4 个字节。

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

于 2011-04-26T19:30:15.040 回答
1

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

要查找 Optional Header 的开头,请执行以下过程:

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

要查找节表的开头,请执行以下过程:

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

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

于 2011-04-29T00:30:35.700 回答
0

哪个时间戳?最后访问?如果您正在访问它,您无法阻止这种更改 - 但是您可以记下它然后将其更改回来?

对于哈希 - 你是什么意思?确保 .exe 没有更改的方法?我会使用CRC。

于 2011-04-26T19:24:23.503 回答
-2

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

于 2011-04-26T19:25:29.987 回答