【问题标题】:Keep .exe timestamp from changing保持 .exe 时间戳不变
【发布时间】:2011-04-26 19:11:37
【问题描述】:

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

谢谢!

【问题讨论】:

  • 你为什么要这么做?您需要解决的实际问题是什么?
  • 嗯,我不完全确定是诚实的,而且我开始认为我是被送上了兔子的踪迹。这是我的经理的要求...

标签: c++ hash timestamp checksum recompile


【解决方案1】:

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

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

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

【讨论】:

  • 我做了一个二进制差异,有两个部分是不同的。一开始是正确的。有一行“此程序不能在 DOS 模式下运行”。换行符,然后是“$00000000000000”,下一个块是第一个区别所在的位置。第二个大约是数据的一半,必须与编译器移动东西有关,只是因为感觉像它......
  • 抱歉,之前的回复放错了。感谢您的链接。我会调查的。但是我越想越觉得没意义,我的意思是,基本上他们是想让我根据哈希码生成一个exe,而不是反过来,这就是哈希码的意义所在。
【解决方案2】:

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

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

  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 and COFF Specification

【讨论】:

  • 太棒了:D,感谢您提供的信息。这应该可以解决问题,我不知道您可以删除标题的那部分...今天学习一些新东西。
【解决方案3】:

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

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

【讨论】:

  • 我正在使用 FastSum 来验证哈希。好吧,我还不能完全确定是重新编译时添加到 .exe 的时间戳,还是有其他原因导致哈希值不同。但是,是的,我想我不确定“上次访问”是否是相同的属性,当我重新编译代码时可能会改变..
  • 文件系统确实具有上次写入时间等的元数据,但 EXE 文件格式在文件内容中具有时间戳。大概就是这个意思。
  • @asveikau - 是的,这对我来说最有意义,文件格式正在改变,而不是元数据。
  • 我做了一个二进制差异,有两个部分是不同的。一开始是正确的。有一行“此程序不能在 DOS 模式下运行”。换行符,然后是“$00000000000000”,下一个块是第一个区别所在的位置。第二个主要由文本组成,大约是数据的一半,并且必须与编译器移动内容有关,只是因为感觉像它..
【解决方案4】:

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

【讨论】:

  • 我认为他指的是 PE 标头中的时间戳,而不是文件系统元数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 2017-09-20
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
相关资源
最近更新 更多