【问题标题】:Only creating a COM object if the DLL that implements it is signed?只有在实现 COM 对象的 DLL 被签名时才创建 COM 对象?
【发布时间】:2010-09-15 18:46:50
【问题描述】:

我们有一些代码使用 LoadLibrary 和 GetProcAddress 为我们的一种产品实现插件架构。我们确保即将加载的 DLL 使用我们的代码签名密钥进行签名。

我们正在更改插件架构以改用 COM。实例化 COM 对象时,有没有办法强制执行代码签名(最好使用我们的证书)?

【问题讨论】:

    标签: com code-signing


    【解决方案1】:

    您需要使用 Authenticode API 在 DLL 级别执行此操作。标准 API 被称为 WinVerifyTrust() 并且那里记录了示例。还有另一个KB article number 323809 提供了一个示例,说明如何从附加到您的 DLL 的验证码信息中剥离其他细节。

    当然,这些 API 期望获得 DLL 本身的路径,而在 COM 插件场景中,您通常不会直接接触它,而是依靠注册来找到正确的二进制文件。您可以手动滚动您的加载方案(即使用 LoadLibrary() 加载 DLL 并自己调用DllGetClassObject())或简单地要求您的 API 用户遵守附加规则,例如将 DLL 放置在某个位置而不考虑注册。

    或者按照 Rob Walker 的建议,自己在注册表中查找 CLSID 注册,并以此作为查找正确 DLL 进行验证的方法。

    【讨论】:

    • 我们的 COM 加载项,如果在 .NET 中开发,似乎可以验证自己(在签名时)。我们的未托管主机现在间接执行 WinVerifyTrust。我们遇到了详细的知识库文章 #936707 的问题。对于那些走这条路的人来说可能值得一读。
    【解决方案2】:

    我认为您不能直接执行此操作,但您可以在注册表中查找 CLSID 使用的 DLL,并在发出 CoCreateInstance 调用之前检查其签名。

    【讨论】:

      猜你喜欢
      • 2017-10-30
      • 2013-04-10
      • 1970-01-01
      • 2015-03-20
      • 2011-09-10
      • 2020-08-22
      • 2017-02-15
      • 1970-01-01
      • 2011-03-05
      相关资源
      最近更新 更多