Windows PE可执行文件CRC计算问题

时间:2011-08-27 22:45:25

标签: visual-studio-2008 file executable crc portable-executable

让我解释一下我想要完成的事情。我想从我的Windows可执行文件中知道它是否在构建后被篡改。为此,我决定从内部计算其自己文件的CRC值,并将其与预定义值进行比较。但我遇到的是,一旦构建了可执行文件,CRC就会保持不变,但只有在我重新构建它之前(不对源代码进行任何更改)。这就是CRC改变的时候。这里有什么魔力?编译器是否在exe文件中添加了一些任意字节?

PS。我正在使用Microsoft Visual Studio C ++ 2008并在Windows 7 Ultimate上运行我的测试。

2 个答案:

答案 0 :(得分:2)

可能是编译器/链接器自动嵌入的某个时间戳或版本号...

为了解释这一点,我建议一些不同的东西(基于这些是原生的EXE / DLL):

只是对生成的文件进行后处理 - 在生成文件之前不要假设生成文件的CRC32 ...

Windows在加载EXE / DLL时有一个非常“好”的功能:它只是忽略文件末尾不属于那里的任何东西。

您可以使用此优势:在文件中附加一个字节块(例如256个字节)。这个块可以包含你喜欢的任何内容(文件的哈希值,文件长度等),甚至可以加密...当你想检查你需要的信息时(比如你的CRC ......)并将它与那个文件块......

为了让你更难,你可以包含不同的哈希并随机选择你检查的那个...你甚至可以将一些随机字节洒入该块... 还要检查一下,确保只有一个这样的块存在...所以你可以中止或任何你想要的东西,如果没有这样的块,多个这样的块或你的检查和该块的保存信息不匹配。

答案 1 :(得分:1)

您是否考虑过使用数字签名?签名可以在编译后应用,并允许您验证EXE尚未编辑。这是一个完美的案例。

您可以使用"SignTool.EXE"签署您的EXE。

要验证您是否可以使用以下代码:
Verify whether an executable is signed or not (signtool used to sign that exe)

我相信你必须购买代码签名证书(如果你想要完全验证)。我认为GoDaddy提供了最便宜的(现在)。我也听说如果你有一个开源项目,你可以获得一个免费的签名证书。来自某些当局。