5

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

  1. 获取当前进程的句柄
  2. 枚举所有加载的模块
  3. 找到名为“helper.dll”的(如果此信息可通过枚举模块 api 获得),并使用 类似这样的方式验证它的签名

这是解决这个问题的最好方法吗?

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

4

1 回答 1

7

您想在加载 DLL之前验证签名。一旦它们被加载,它们就已经有时间在您的进程中运行任意代码(请参阅 参考资料DllMain),而您已经输了。

您可能想要延迟加载DLL。这样,您不需要为每个函数手动执行LoadLibrary/ GetProcAddress,但您仍然有机会在加载 DLL 之前运行一些代码,并在验证失败时退出。

不,WinVerifyTrust不需要实时互联网连接。每台 Windows 机器都有一个受信任的根证书列表。验证所做的是提取签名和附加到二进制文件的证书,验证签名是否有效(文件内容实际上与签名的内容匹配),并且证书形成一个有效链,通向一个受信任的根。

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

于 2013-07-17T01:00:01.103 回答