【问题标题】:Programmatically verify signed dll's C++以编程方式验证签名 dll 的 C++
【发布时间】:2012-08-26 07:07:47
【问题描述】:

我有一个签名的 dll 并想在使用它之前验证它的签名。 我的应用程序是由 C++ 编写的。如何以编程方式获取 dll 的签名?

【问题讨论】:

  • 将 dll 作为文件读入,注意签名的开头(通过位置或特定字符/标记开头的字符集),读入所有字符直到结尾将签名放入缓冲区,将其与您已经加载到程序中的签名进行比较,完成。

标签: c++ visual-studio-2010 dll digital-signature


【解决方案1】:

您可以使用WinVerifyTrust function
Dlls 和 PE 几乎相同,只是头部有 2 到 3 个字节的差异。
完整的代码示例是here(也适用于 dll)。

【讨论】:

  • 感谢您的回复。 VerifyEmbeddedSignature(LPCWSTR pwszSourceFile) 期望得到什么? dll 的名称?
  • DLL文件是PE(Portable Executable)格式,没有区别。
【解决方案2】:

MSDN 推荐的方法是运行作为 CryptoAPI 一部分的 SignTool -

SignTool 返回说明签名检查结果的命令行文本。此外,SignTool 返回退出代码为零表示成功执行,一表示执行失败,二表示执行完成但出现警告。

详情请见Using SignTool to Verify a File Signature

【讨论】:

    【解决方案3】:

    其中一个选项是 CAPICOM library,它是来自 Microsoft 的 available as 32-bit redistributable。验证码可以很简单:

    CComPtr<Capicom::ISignedCode> pSignedCode;
    ATLENSURE_SUCCEEDED(pSignedCode.CoCreateInstance(__uuidof(Capicom::SignedCode)));
    ATLENSURE_SUCCEEDED(pSignedCode->put_FileName(CComBSTR(pszPath)));
    HRESULT nVerifyResult = pSignedCode->Verify(ATL_VARIANT_FALSE);
    

    您还可以轻松获取其他信息,例如签名者、证书等。

    如果您不想使用 CAPICOM,MSDN 建议在上面的代码 sn-p 中使用 alternate options to SignedCode class

    【讨论】:

      猜你喜欢
      • 2014-06-30
      • 2010-11-25
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多