有谁知道一种方法来防止可执行文件的时间戳发生改变吗?我试图为.exe生成一致的哈希码,但我认为时间戳可能会阻止这种情况发生。每次我重新编译代码(VS C++)时,FastSum都会生成不同的校验和。保持.exe的时间戳不会改变
谢谢!
有谁知道一种方法来防止可执行文件的时间戳发生改变吗?我试图为.exe生成一致的哈希码,但我认为时间戳可能会阻止这种情况发生。每次我重新编译代码(VS C++)时,FastSum都会生成不同的校验和。保持.exe的时间戳不会改变
谢谢!
根据您必须进行的校验和,您可以剥离COFF头(时间戳所在的位置)或Optional Header。在后一种情况下,您只保存节表和节数据(可执行文件的二进制内容)。如果确保源代码未更改且编译链接标志未更改,则部分数据应保持不变。如果要在校验和中包含版本号或代码的大小,则必须包含可选标题。
要查找可选报头的开始,执行下列步骤:
要找到节表的开始,执行下列步骤:
COFF格式的完整规格,请下载:Microsoft PE and COFF Specification。
真棒:D,谢谢你的信息。这应该是诀窍,我不知道你可以删除标题的那一部分...今天学习新东西。 – 2011-05-06 03:05:15
哪个时间戳?上次访问?如果你正在访问它,你无法阻止这种改变 - 但是你可以记下它然后再改回来?
对于散列 - 你是什么意思?一种确保.exe没有改变的方法?我会使用CRC。
我使用FastSum来验证散列。那么,我还不完全确定,如果它是重新编译时添加到.exe中的时间戳,或者是否有其他内容导致哈希出现不同。但是,是的,我想我不确定“上次访问”是否与我重新编译代码时可能会更改的属性相同。 – 2011-04-26 19:30:43
确实,文件系统具有用于上次写入时间等的元数据,但EXE文件格式在文件内容中有时间戳。这可能是什么意思。 – asveikau 2011-04-26 19:34:29
@asveikau - 对,这对我来说最有意义,文件格式被改变,而不是元数据。 – 2011-04-26 19:43:14
文件时间戳由操作系统控制和维护 - 它们不在文件内部(包括可执行文件)本身。
我认为他意味着PE头中的时间戳,而不是文件系统元数据。 – asveikau 2011-04-26 19:34:45
PE文件格式(如在您的EXE中)有一个时间戳字段。请查看“表2 IMAGE_FILE_HEADER字段”在此链接:http://msdn.microsoft.com/en-us/library/ms809762.aspx
好像如果你真的愿意,你可以在十六进制编辑器编辑TimeDateStamp
,或者写一个小程序来为你做它。如果我正确地阅读了上述文档,它看起来像是在偏移量为10的4个字节。
我不确定改变它的后果是什么。我的猜测是,它可能会使您在调试程序时无法找到符号。也许不是在你的二进制文件中改变这个字段,你应该散列PE头之外的区域。 (我提供的链接可以帮助您确定哪里有意义。)
我做了一个二元差异,有两个不同的部分。一开始就是对的。有一行“这个程序不能在DOS模式下运行”。换行符,然后是“$ 00000000000000”,下一个块是第一个区别。第二个是关于数据的一半,并且必须与编译器移动东西有关,只是因为它感觉像...... – 2011-04-26 19:55:48
对不起,以前的回复被错误地放置。感谢您的链接。我会研究一下。但是我越想到这一点,我越是觉得毫无意义,我的意思是,基本上他们希望我根据哈希码生成一个exe文件,而不是其他方式,这是哈希码的一个要点。 – 2011-04-26 20:46:39
你为什么要这么做?什么是你需要解决的实际问题? – Johnsyweb 2011-04-26 19:27:52
嗯,我不完全肯定是诚实的,我开始认为我已经被送上了兔子的踪迹。这是我的经理的要求... – 2011-04-26 20:40:43