【问题标题】:Check if a DLL is signed C++检查 DLL 是否已签名 C++
【发布时间】:2017-12-24 03:52:34
【问题描述】:

我正在尝试检查是否根据文件路径对 DLL 进行了签名。我看到使用 WinVerifyTrust 有针对此类问题的预先存在的解决方案,但是,当我尝试对照“C:\Windows\System32\kernel32.dll”检查它时,它说:“文件”C:\Windows\System32 \kernel32.dll" 未签名。"虽然 kernel32 应该是一个签名的 dll。我在 Windows 7 上,仅供参考。

这是我调用的函数的源代码:https://msdn.microsoft.com/en-us/library/windows/desktop/aa382384(v=vs.85).aspx

如何修复该功能?

【问题讨论】:

  • 当我在 Windows 10 上运行该应用程序时:The file "c:\windows\system32\kernel32.dll" is signed and the signature was verified.
  • fwiw,如果您将该代码编译为 32 位(Visual Studio 的默认设置),但在 64 位操作系统上运行,则 c:\windows\system32 的文件访问将被重定向到 c :\windows\syswow64.您可以手动检查 syswow64 中的 kernel32.dll 是否经过代码签名?此外,由于 kernel32.dll 可能是一个非常特殊的 DLL,受其他可能的重定向内容的影响,请手动将其复制到另一个目录并重命名它。然后在复制的文件上再次运行代码,看看是否有任何差异。
  • 当我在 syswow 中尝试 kernel32.dll 时,我必须将其编译为 32 位,同样的消息“文件“C:\Windows\SysWOW64\kernel32.dll”未签名”。我尝试将 dll 放在 C:\ 和相同的消息中。我正在寻找一个全局解决方案,所以它可能不适用于 Windows 7,但需要适用于 vista 之后的所有操作系统。
  • 您实际上是在尝试专门验证 kernel32.dll,还是任何其他 DLL? (该 winverifytrust api 是否适用于来自其他产品的其他代码签名二进制文件,这些产品内置于 Windows 中?)
  • 任何已签名的 dll。我尝试了一个覆盖 dll,它说“文件“C:\overlay.x64.dll”已签名并且签名已验证。”。但是,即使它是 Windows dll,我也需要该函数返回 true。

标签: c++ windows dll windows-7 digital-signature


【解决方案1】:

是的,WinVerifyTrust 是正确使用的函数,但您必须准备好调用它两次。

首先你用WTD_CHOICE_FILE 调用它,如果调用成功,那么你就完成了。如果没有,你必须用WTD_CHOICE_CATALOGCryptCATAdminCalcHashFromFileHandle+CryptCATAdminEnumCatalogFromHash+CryptCATCatalogInfoFromContext)再次调用它,因为某些Windows文件没有嵌入证书信息(尤其是非PE文件)。 (您也可以尝试find the catalog info first 避免调用两次,但我认为这会更慢)

Sysinternals 论坛上的各种主题(thisthis)也许是解决与此相关问题的最佳资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    相关资源
    最近更新 更多