保持.exe时间戳不变

时间:2011-04-26 19:11:38

标签: c++ hash timestamp checksum recompile

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

谢谢!

4 个答案:

答案 0 :(得分:2)

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

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

我不确定改变这种情况的后果是什么。我的猜测是,在调试程序时可能会使您无法找到符号。也许您应该在PE标头之外散列区域,而不是在二进制文件中更改此字段。 (我提供的链接可以帮助您确定哪些方面有意义。)

答案 1 :(得分:1)

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

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

  1. 从0x3c读取4字节签名基址。
  2. 转到签名偏移。
  3. 偏移20个字节。这是Optional Header的开始。
  4. 如果它是32位exe文件,你应该期望0x10b,如果是64位,你应该期望0x20b。
  5. 要查找部分表的开头,请按照以下步骤操作:

    1. 从0x3c读取4字节签名基址。
    2. 转到签名偏移。
    3. 偏移16个字节。
    4. 在此处阅读2字节可选标题大小。
    5. 转到可选标题。
    6. 偏移量可选标头大小字节。这是节表的开头。
    7. 您应该在这里看到一个部分名称(例如“.text”,“。data”等)。
    8. 完整的PE& amp;的规格COFF格式,请下载:Microsoft PE and COFF Specification

答案 2 :(得分:0)

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

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

答案 3 :(得分:-2)

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