【问题标题】:How can I stop someone from calling my COM interfaces APIs?如何阻止某人调用我的 COM 接口 API?
【发布时间】:2009-07-15 19:07:30
【问题描述】:

我有一个我们在产品中使用的 COM inproc DLL。 现在,如果有人发现我们从 DLL 中公开了哪些接口和 API,那么这些 API 可以很容易地被调用。

有没有办法阻止未知应用程序调用我的 API?

我们可以在 COM 中添加一些签名吗?

【问题讨论】:

  • 要获得更相关的答案,您应该指定 COM 服务器和可能的客户端使用的语言/技术。
  • 我在客户端和服务器端都使用 c++
  • ATL 还是类似的?然后,您可以简单地采用“早期绑定,无类型库”的方式 - 这将正常工作,没有人能够调查您拥有哪些接口。

标签: com


【解决方案1】:

控制对象使用的正式方法是在创建 COM 对象的类工厂上实现 IClassFactory2。

这是 MSDN 上解释界面的链接。

IClassFactory2 at MSDN

创建实现的好处是没有人可以在不通过 IClassFactory2 清除注册障碍的情况下获取实例。

缺点是您必须检查创建对象的所有位置,以确保它们没有损坏。创建实例变得更加繁重,尽管某些语言已经具备使该过程不那么痛苦的功能(例如 VB6)。

如果您尝试保护具有大量实例化活动的对象,您可能希望使用 Mastermind 添加关键参数的方法,或者向您的接口添加某种解锁方法,该方法必须在之前正确调用后面的组件就可以使用了。

【讨论】:

    【解决方案2】:

    您可以使您的接口直接从 IUnknown 继承(没有 IDispatch),并且不将类型库包含到 DLL 中。这样,只有那些有权访问类型库的人才能找到支持的接口,而发现接口的唯一其他方法就是猜测。如果您采用这种方式,您可能还希望最大限度地减少向注册表公开的类的数量(可以使用 CoCreateInstance() 创建的类),并改用一些专用的注册表公开类的一组工厂方法。

    这意味着只有 vtable 早期绑定才能与您的组件一起使用。您也将无法使用此组件的默认调用封送处理(因为不包含类型库)。而这并不是真正的保护,只是一种隐藏东西的方式。

    【讨论】:

      【解决方案3】:

      没有什么可以阻止您向方法中添加“key”参数,如果密钥错误,该参数将返回。

      非常简单,但适合初学者。

      【讨论】:

      • 好吧,我认为有人专门寻找调用 API 的然后密钥可以很容易地进行逆向工程..还有其他解决方案吗?
      【解决方案4】:

      除了某种“关键”参数之外,您无法阻止好奇者发现您的函数然后调用它。只需要一个调试器和一些耐心。为了完全安全,您必须需要某种类型的证书,授权代码可以获得但所有其他人都无法获得,但这意味着您的代码必须能够验证证书。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-25
        • 2011-03-28
        • 1970-01-01
        • 2021-05-14
        • 2015-11-18
        • 2019-02-13
        • 2015-08-15
        • 2011-07-17
        相关资源
        最近更新 更多