验证加载的DLL具有有效证书的最安全的方法是什么?

时间:2013-07-17 00:03:27

标签: c++ winapi digital-signature

我有一个二进制'api.dll',它使用另一个二进制'helper.dll'。我想使用数字签名验证每个DLL的真实性,但我不确定正确的方法。对于上下文,DLL使用visual studio 2010构建,并通过依赖项选项卡进行链接。链接通过stub helper.lib发生,所以我没有在api.dll代码中显式调用LoadLibrary。这个问题的部分原因是我不知道从哪里加载 helper.dll。我最初的想法是:

  1. 获取当前流程的句柄
  2. 枚举所有已加载的模块
  3. 找到名为'helper.dll'的人(如果此信息可通过 enum modules apis),并使用某些东西验证它的签名 like this
  4. 这是解决这个问题的最好方法吗?

    其次,根据我对数字签名/证书的模糊理解,在我看来,验证需要连接到证书颁发机构,或者证书需要已在计算机上列为可信任。当外部连接被不赞成或明确禁止时,通常如何处理?是应用程序“安装”的东西吗?或者在这种情况下是否需要另一种不太安全的验证方法?

1 个答案:

答案 0 :(得分:7)

您希望在加载DLL之前验证签名 。加载后,他们已经有时间在您的流程中运行任意代码(请参阅DllMain),并且您已经丢失了。

你可能想要delay-load这些DLL。这样,您不需要为每个函数手动执行LoadLibrary / GetProcAddress,但是在加载DLL之前仍然有机会运行一些代码,如果验证失败,则会挽救。 / p>

不,WinVerifyTrust不需要实时Internet连接。每台Windows计算机都有一个受信任的根证书列表。验证的作用是提取签名和附加到二进制文件的证书,验证签名是否有效(文件内容实际上与签名的内容相匹配),以及证书是否形成了导致其中一个受信任根的有效链。

请注意,WinVerifyTrust不会验证该文件是否由您的公司签名 - 只是它是由从其中一个已知CA购买证书的人签名的,并且之后没有被篡改过。如果您想确认该文件实际上是您的,则需要采取其他步骤。