比较从同一个确切来源构建的两个可执行文件的校验和

时间:2011-12-28 02:37:16

标签: c++ c visual-studio checksum

我有一个关于验证可执行文件的问题,使用visual studio编译,使用校验和: 如果我从src构建一个项目,我最终得到一个可执行文件,称之为exec1.exe,其中包含一些元数据。 如果我以后重建相同的src,我会得到另一个可执行文件,比如exec2.exe,它也有自己的元数据部分。

如果我为这两个文件中的每一个创建校验和,则它们会有所不同,因为两个文件之间的元数据信息不同。 当我对文件进行校验和时,是否有人知道绕过元数据的方法,因此无论元数据如何,对两个文件进行校验和将导致相同的校验和值?或者如何编译二进制文件,这样只要src完全相同,我最终会得到相同的可执行文件?

提前感谢您的意见, 此致

2 个答案:

答案 0 :(得分:5)

There is no guarantee that Visual C++ will generate the same binary image when building the same source files on successive builds.校验和不打算以这种方式使用,经过一些研究后,似乎很难实现。相反,this kb article等资源可以帮助比较文件。

校验和通常用于查找因发送/存储数据而导致的错误,而不是用于比较可执行文件的版本/版本。

答案 1 :(得分:0)

如果您还有pdb文件,则可以使用DIA sdk查询用于构建可执行文件的所有源文件。基本上枚举所有 IDiaSourceFile ,每个IDiaSourceFile都有一个get_checksum方法。您可以生成一个主校验和,它是用于生成可执行文件的源文件的所有校验和的组合。如果任何源文件的任何校验和已更改,您可以假设可执行文件也已更改。

这与Visual Studio用于确定源文件是否与pdb同步的机制相同,以便可以将其用于调试目的。