比较从相同源构建的两个可执行文件的校验和

问题描述 投票:0回答:3

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

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

预先感谢您的投入, 问候

c++ c visual-studio checksum
3个回答
5
投票

无法保证 Visual C++ 在连续构建中构建相同的源文件时会生成相同的二进制图像。 校验和不打算以这种方式使用,经过一些研究后,这似乎很困难实现。相反,诸如这篇知识库文章之类的资源可以帮助比较文件。

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


1
投票

如果您也有 pdb 文件,则可以使用 DIA sdk 查询用于构建可执行文件的所有源文件。基本上枚举所有 IDiaSourceFile 并且每个

IDiaSourceFile
都有一个 get_checksum 方法。您可以生成一个主校验和,它是用于生成可执行文件的源文件的所有校验和的组合。如果任何源文件的任何校验和已更改,您可以假设可执行文件也已更改。

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


0
投票

使用

deterministic
构建,打开以忽略元数据标头中的时间戳。请参阅https://github.com/icsharpcode/ILSpy/issues/2220#issuecomment-753407015。因此,只要两个源代码相同,最终您将通过 Powershell 中的
Get-FileHash
生成相同的校验和。希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.