首先,让我简单介绍一下为什么我提出这个问题:
我目前在从事严格受监管的行业,因此我们的代码受到官方测试机构的严密审核。这些测试机构希望能够构建代码并生成一个完全相同的 .exe 或 .dll 文件(显然不更改任何代码!)。他们检查所创建的可执行文件的 MD5 和 SHA1 值以确保其相同。
迄今为止,我主要使用 C++ 进行编程,在进行一些项目设置调整后,我设法使项目每次重建时都具有相同的 MD5/SHA1 值。现在我正在使用 C# 进行一个项目,但在重新构建后很难使 MD5 值匹配。我知道在文件的 PE 头中有 "时间戳",它们已经被清零为 0。我还知道 .exe 的 GUID,它也已经被清零为“00 00 00...”等。但是文件仍然无法匹配。
我使用 CFF Explorer 查看和编辑 PE 头以删除时间和日期戳。使用二进制比较工具后,.exe 中只有 2 个字节块是不同的(两者都非常小)。
一个不一致的块出现在二进制代码之前,该代码在 ASCII 中详细描述了 *Project*\obj\Release\xxx.pdb 文件的路径。
编辑:现在已知这是 *.pdb 文件的 GUID,但我仍然不知道是否可以修改它而不会导致任何错误!?
另一个块出现在函数名称中间,例如(典型部分)AssemblyName.GetName.Version.get_Version.System.IO.Ports.SerialPort.Parity.Byte.<PrivateImplementationDetails>{
然后是不同的代码块:
4A134ACE-D6A0-461B-A47C-3A4232D90816
接着是:
"}.ValueType.__StaticArrayInitTypeSize=7.$$method0x60000ab-1.RuntimeFieldHandle.InitializeArray`... 等等。
欢迎提出任何想法或建议!