编辑 1:请参阅@Ori 的精彩回答,了解 Microsoft 如何签署这些可执行文件的捆绑包。我将这个答案留在这里,因为我相信我关于乳清文件没有单独使用 Authenticode 签名的论点(VirusTotal 报告的内容)仍然有效。结束添加
我找不到微软的官方答案,但我有一个关于为什么这个程序(和其他类似的程序)没有直接签名的理论。
我检查了我的几台计算机和虚拟机,发现这个文件没有经过 Authenticode 签名,至少在我认识的情况下没有。我确实有这个文件的几个不同版本(可以追溯到 8 年前)。Windows 10(不同版本)的干净副本具有不同的版本和时间戳,因此微软似乎确实更新了此文件。
好的,那么微软为什么不签署这个文件呢?我认为答案在 rundll32.exe 的目的中找到了。Rundll32.exe 用于运行具有所需功能但没有运行它们的 exe 的 dll。您可以在这篇 How To Geek 文章中看到一些示例。
Authenticode 签名强制执行身份,确定 UAC 提示中出现的内容并帮助确保文件不被篡改。如果作为进程一部分的 dll 请求提升,则 exe 的签名用于 UAC 提示,因为这是正在运行的进程,而不是 dll。
现在来做一些关于为什么文件没有签名的猜测工作。因为 rundll32.exe 执行未知的第 3 方代码作为其目的的一部分,所以签名对安全性不利。用户模式级别的代码可以请求 rundll32.exe 运行它们的 dll。如果 dll 请求提升,弹出窗口将显示 rundll32.exe,这是由 Microsoft 签名和验证的,要求管理员权限。如果一个未知作者的程序请求许可,这将使人们更有可能说是,这是它当前的行为。由于微软无法合理保证rundll32.exe运行的代码的功能或安全性,直接对其进行签名是很危险的。
编辑 1: @Ori 已经弄清楚 Windows 如何验证这些文件。最后一段仅用于历史。结束添加
现在这并不意味着 Windows 操作系统不验证 run32dll.exe。它可以(更多的猜测工作)比较文件的哈希以确定是否有东西被篡改。然后仅当它是有效文件时才执行它。