签名的可执行文件能否在保持签名完整性的同时被篡改?

Can signed executables be tampered with while retaining the integrity of the signature?

我想知道在决定文件是否被篡改时,我可以在多大程度上依赖文件上的数字签名(又名来自 Verisign、Simantec 等的数字证书)。

假设我想下载一个应用程序版本,该版本不再位于原始开发者的网站上,但可以在第三方网站(如 cnet、oldapps.com 或 filehippo)上获得。我通常会搜索旧的论坛条目,其中有人列出了 MD5 或 SHA1 散列签名,看看它们是否与我下载的散列相匹配。这只适用于软件广泛使用的真正大型开发人员。

我想知道验证文件的数字签名是否是确保文件来自开发人员并且未被第三方更改的另一种可靠方法?

我要问的是:如果黑客向已签名的 DLL 或 EXE 中注入恶意代码,从而有效地更改文件的哈希值,它是否会破坏数字签名,因为签名嵌入了某种摘要?还是签名会完全不受影响?

以任何方式更改可执行文件当然会使签名无效。
这里有一些链接可以查找有关其工作原理的详细信息: https://msdn.microsoft.com/en-us/library/windows/desktop/aa382384(v=vs.85).aspx

很难找到可执行签名所做的良好证据,因为您怀疑它的主要功能,而且大多数事情似乎都假定它实际上在进行签名验证。 或许是这样:

For example, the Software Publisher Trust Provider can verify that an executable image file comes from a trusted software publisher and that the file has not been modified since it was published. In this case, the pWinTrustData parameter specifies the name of the file and the type of file, such as a Microsoft Portable Executable image file.

来自 https://msdn.microsoft.com/en-us/library/windows/desktop/aa388208(v=vs.85).aspx

我决定使用经验方法来回答我自己的问题,而不是相信数字证书颁发机构的话。

我设计了一个实验,我使用十六进制编辑器修改 wdksetup.exe(来自 Microsoft 网站的签名 WDK Web 安装程序)的副本,并研究了数字签名是如何受到影响的。我将 1byte 一直替换为 25KB,并在每次替换时制作一个新副本。我还使用 ResourceHacker 将一个图标组添加到一个图标组,该组向文件添加了额外的 400KB。

结果:

  • 替换 1 个单字节将更改文件的 SHA1 摘要,但也会导致其签名检查失败。签名仍会存在,但会无法通过任何检查。如果您将文件发送到 VirusTotal,如果您转到属性并单击签名的详细信息,或者如果您尝试 运行 它并查看 Publisher 行,您将收到签名无效的通知。 1个单字节。杰出的!

  • 话虽如此,我强调签名并没有丢失(即使我进行了高达 25KB 的替换),所以当您转到文件属性时,仍然会有数字签名选项卡,它仍然会显示 Microsoft。这是非常具有误导性的,您必须小心不要在那里结束检查,因为无论签名是否有效,该选项卡仍会存在。为了确保您有一个好的签名,您必须select 签名并单击详细信息。然后您将看到一个对话框,告诉您该签名是否有效。这描述了我在 Windows 7 中观察到的行为,我手边没有 8 或 10 的副本来查看属性对话框在那里的行为。

  • 对文件进行大量大小更改修改将导致签名被完全破坏。

(编辑:我很好奇大小的影响。我在一个 250mb 的文件上重复了 1byte 替换实验,结果相同。我也很好奇是否大小会影响计算摘要时发生冲突的可能性。我在 3.5GB DVD iso 中进行了 1 字节替换,这导致了不同的 MD5 和 SHA1 哈希值。)

不保留完整性,但仍然可以运行!


OS 版本:Windows 10,2004 版,也称为 Windows 2020 年 5 月 10 日更新


integrity exe file: 您从某处下载的exe文件。

tampered exe file:使用十六进制编辑器修改“完整exe文件”程序中的1字节(8位)描述文字,注意不要破坏程序代码。


右键单击 xxx.exe - Properties - Digital Signatures - select 一个 Signatures list 项目 - 单击 Details 按钮

完整的exe文件-> 这个数字签名就OK了

被篡改的 exe 文件 -> 此数字签名无效。


双击 xxx.exe(需要“运行 作为管理员”权限):

用户帐户控制 (UAC) 提示:您希望此应用对您的设备进行更改吗?

完整性 exe 文件 -> 蓝色 已验证发布者:xxx

被篡改的 exe 文件 -> 黄色 发布者:未知

点击Yes -> 运行!


双击xxx.exe(不需要“运行作为管理员”权限):

完整的exe文件/被篡改的exe文件 -> 运行!