我们有一些代码使用 LoadLibrary 和 GetProcAddress 来为我们的一个产品实现插件架构。我们确保即将加载的 DLL 使用我们的代码签名密钥进行签名。
我们正在更改插件架构以改用 COM。实例化 COM 对象时,有没有办法强制执行代码签名(最好使用我们的证书)?
我们有一些代码使用 LoadLibrary 和 GetProcAddress 来为我们的一个产品实现插件架构。我们确保即将加载的 DLL 使用我们的代码签名密钥进行签名。
我们正在更改插件架构以改用 COM。实例化 COM 对象时,有没有办法强制执行代码签名(最好使用我们的证书)?
您需要使用 Authenticode API 在 DLL 级别执行此操作。标准 API 被称为WinVerifyTrust()并且那里记录了示例。还有另一个知识库文章编号 323809,它提供了一个示例,说明如何从附加到 DLL 的验证码信息中剥离其他细节。
当然,这些 API 期望获得 DLL 本身的路径,而在 COM 插件场景中,您通常不会直接接触它,而是依靠注册来找到正确的二进制文件。您可以手动滚动您的加载方案(即使用 LoadLibrary() 加载 DLL 并自己调用DllGetClassObject()),或者只是要求您的 API 用户遵守其他规则,例如将 DLL 放置在特定位置而不管注册。
或者像 Rob Walker 建议的那样,自己在注册表中查找 CLSID 注册,并使用它来查找正确的 DLL 进行验证。
我认为您不能直接执行此操作,但您可以在注册表中查找 CLSID 使用的 DLL 并在发出 CoCreateInstance 调用之前检查其签名。