我有一个二进制'api.dll',它使用另一个二进制'helper.dll'。我想使用数字签名验证每个DLL的真实性,但我不确定正确的方法。对于上下文,DLL使用visual studio 2010构建,并通过依赖项选项卡进行链接。链接通过stub helper.lib发生,所以我没有在api.dll代码中显式调用LoadLibrary
。这个问题的部分原因是我不知道从哪里加载 helper.dll。我最初的想法是:
这是解决这个问题的最好方法吗?
其次,根据我对数字签名/证书的模糊理解,在我看来,验证需要连接到证书颁发机构,或者证书需要已在计算机上列为可信任。当外部连接被不赞成或明确禁止时,通常如何处理?是应用程序“安装”的东西吗?或者在这种情况下是否需要另一种不太安全的验证方法?
答案 0 :(得分:7)
您希望在加载DLL之前验证签名 。加载后,他们已经有时间在您的流程中运行任意代码(请参阅DllMain
),并且您已经丢失了。
你可能想要delay-load这些DLL。这样,您不需要为每个函数手动执行LoadLibrary
/ GetProcAddress
,但是在加载DLL之前仍然有机会运行一些代码,如果验证失败,则会挽救。 / p>
不,WinVerifyTrust
不需要实时Internet连接。每台Windows计算机都有一个受信任的根证书列表。验证的作用是提取签名和附加到二进制文件的证书,验证签名是否有效(文件内容实际上与签名的内容相匹配),以及证书是否形成了导致其中一个受信任根的有效链。
请注意,WinVerifyTrust
不会验证该文件是否由您的公司签名 - 只是它是由从其中一个已知CA购买证书的人签名的,并且之后没有被篡改过。如果您想确认该文件实际上是您的,则需要采取其他步骤。