如何阻止某人调用我的COM接口API?

如何阻止某人调用我的COM接口API?,com,Com,我有一个COM inproc DLL,我们正在我们的产品中使用。 现在,如果有人发现我们从DLL中公开了哪些接口和API,那么这些API可以很容易地调用 有没有办法阻止未知应用程序调用我的API 我们可以在COM中添加一些签名吗?没有任何东西可以阻止您向方法添加一个“key”参数,如果key错误,该参数将返回 非常简单,但对初学者来说就可以了。没有什么可以阻止您向方法添加一个“key”参数,如果key错误,该参数将返回 非常简单,但对初学者来说就可以了。除了某种“key”参数之外,你不能阻止好奇

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

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


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

没有任何东西可以阻止您向方法添加一个“key”参数,如果key错误,该参数将返回


非常简单,但对初学者来说就可以了。

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


非常简单,但对初学者来说就可以了。

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

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

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

下面是MSDN上的一个链接,解释该接口

创建一个实现的好处是,如果不清除通过IClassFactory2注册的障碍,任何人都无法获取实例

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


如果您试图保护一个具有大量实例化活动的对象,您可能需要使用Mastermind添加关键参数的方法,或者向接口添加某种解锁方法,在使用其背后的组件之前必须正确调用该方法。

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

下面是MSDN上的一个链接,解释该接口

创建一个实现的好处是,如果不清除通过IClassFactory2注册的障碍,任何人都无法获取实例

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


如果您试图保护一个具有大量实例化活动的对象,您可能需要使用Mastermind添加关键参数的方法,或者向接口添加某种类型的解锁方法,在使用其背后的组件之前必须正确调用该方法。

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


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

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


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

我认为有些人专门寻找调用API的then键可以轻松反向工程。还有其他解决方案吗?我认为有些人专门寻找调用API的then键可以轻松反向工程。有其他解决方案吗?要获得更相关的答案,您应该指定什么语言/技术既适用于COM服务器,也适用于可能的客户端。我使用C++来为客户端和Servaltl或类似的用户使用C++。然后你可以简单地去做“早期绑定,没有类型化”的方式——这将是有效的,没有人能够调查你有哪些接口。为了得到更多的相关答案,你应该指定什么语言/技术被使用,或者COM服务器和可能的客户端。我用C++来为客户端和Servaltl或类似的东西使用C++。然后,您可以简单地使用“早期绑定,无类型库”的方式——这只会起作用,没有人能够调查您有什么接口。