2011-04-26 23 views
1

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

谢谢!

+0

你为什么要这么做?什么是你需要解决的实际问题? – Johnsyweb 2011-04-26 19:27:52

+0

嗯,我不完全肯定是诚实的,我开始认为我已经被送上了兔子的踪迹。这是我的经理的要求... – 2011-04-26 20:40:43

回答

1

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

要查找可选报头的开始,执行下列步骤:

  1. 读4字节的签名为0x3C基址。
  2. 转到签名偏移量。
  3. 偏移20个字节。这是可选标题的开始。
  4. 如果是32位exe文件,则应该在此处指定0x10b;如果是64位,则应该指定0x20b。

要找到节表的开始,执行下列步骤:

  1. 读4字节的签名为0x3C基址。
  2. 转到签名偏移量。
  3. 偏移16个字节。
  4. 此处读取2字节可选标题大小。
  5. 转到可选标题。
  6. 偏移量可选的标头大小字节。这是节表的开始。
  7. 你应该在这里预计一个部分名称(如“.text”,“.data”等)。

COFF格式的完整规格,请下载:Microsoft PE and COFF Specification

+0

真棒:D,谢谢你的信息。这应该是诀窍,我不知道你可以删除标题的那一部分...今天学习新东西。 – 2011-05-06 03:05:15

0

哪个时间戳?上次访问?如果你正在访问它,你无法阻止这种改变 - 但是你可以记下它然后再改回来?

对于散列 - 你是什么意思?一种确保.exe没有改变的方法?我会使用CRC。

+0

我使用FastSum来验证散列。那么,我还不完全确定,如果它是重新编译时添加到.exe中的时间戳,或者是否有其他内容导致哈希出现不同。但是,是的,我想我不确定“上次访问”是否与我重新编译代码时可能会更改的属性相同。 – 2011-04-26 19:30:43

+2

确实,文件系统具有用于上次写入时间等的元数据,但EXE文件格式在文件内容中有时间戳。这可能是什么意思。 – asveikau 2011-04-26 19:34:29

+0

@asveikau - 对,这对我来说最有意义,文件格式被改变,而不是元数据。 – 2011-04-26 19:43:14

-2

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

+3

我认为他意味着PE头中的时间戳,而不是文件系统元数据。 – asveikau 2011-04-26 19:34:45

2

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

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

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

+0

我做了一个二元差异,有两个不同的部分。一开始就是对的。有一行“这个程序不能在DOS模式下运行”。换行符,然后是“$ 00000000000000”,下一个块是第一个区别。第二个是关于数据的一半,并且必须与编译器移动东西有关,只是因为它感觉像...... – 2011-04-26 19:55:48

+0

对不起,以前的回复被错误地放置。感谢您的链接。我会研究一下。但是我越想到这一点,我越是觉得毫无意义,我的意思是,基本上他们希望我根据哈希码生成一个exe文件,而不是其他方式,这是哈希码的一个要点。 – 2011-04-26 20:46:39