【问题标题】:Comparing the Checksums of Two executables built from the same exact source比较从相同确切源构建的两个可执行文件的校验和
【发布时间】:2011-12-28 02:37:16
【问题描述】:

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

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

提前感谢您的意见, 问候

【问题讨论】:

  • 此元数据存储在 PE 数据的什么位置?你隔离了吗?

标签: c++ c visual-studio checksum


【解决方案1】:

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 等资源可以帮助比较文件。

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

【讨论】:

    【解决方案2】:

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

    这与 Visual Studio 用于确定源文件是否与 pdb 同步的机制相同,以便可以单步执行它以进行调试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多