【发布时间】:2010-09-15 18:46:50
【问题描述】:
我们有一些代码使用 LoadLibrary 和 GetProcAddress 为我们的一种产品实现插件架构。我们确保即将加载的 DLL 使用我们的代码签名密钥进行签名。
我们正在更改插件架构以改用 COM。实例化 COM 对象时,有没有办法强制执行代码签名(最好使用我们的证书)?
【问题讨论】:
标签: com code-signing
我们有一些代码使用 LoadLibrary 和 GetProcAddress 为我们的一种产品实现插件架构。我们确保即将加载的 DLL 使用我们的代码签名密钥进行签名。
我们正在更改插件架构以改用 COM。实例化 COM 对象时,有没有办法强制执行代码签名(最好使用我们的证书)?
【问题讨论】:
标签: com code-signing
您需要使用 Authenticode API 在 DLL 级别执行此操作。标准 API 被称为 WinVerifyTrust() 并且那里记录了示例。还有另一个KB article number 323809 提供了一个示例,说明如何从附加到您的 DLL 的验证码信息中剥离其他细节。
当然,这些 API 期望获得 DLL 本身的路径,而在 COM 插件场景中,您通常不会直接接触它,而是依靠注册来找到正确的二进制文件。您可以手动滚动您的加载方案(即使用 LoadLibrary() 加载 DLL 并自己调用DllGetClassObject())或简单地要求您的 API 用户遵守附加规则,例如将 DLL 放置在某个位置而不考虑注册。
或者按照 Rob Walker 的建议,自己在注册表中查找 CLSID 注册,并以此作为查找正确 DLL 进行验证的方法。
【讨论】:
我认为您不能直接执行此操作,但您可以在注册表中查找 CLSID 使用的 DLL,并在发出 CoCreateInstance 调用之前检查其签名。
【讨论】: