如何强制执行SDK的许可限制

时间:2014-09-24 05:25:31

标签: c++ visual-c++ sdk linker

以下是我一直在研究几个月并需要社区帮助的问题:

我正在Windows上构建一个原生SDK(.lib和.h文件),这是一个可销售的产品,我的客户会购买并使用它为最终客户构建有用的应用程序(.exe文件):一个非常常见的用例对于大多数SDK供应商。

我想制定许可方案,以便我的客户无法与其他人共享他们的SDK副本。但是,他们可以使用此SDK自由分发他们构建的最终应用程序,而无需向我询问每个最终客户的许可证。

我过去曾编写过多种许可方案,只有在存在正确的被许可人(基于时间,节点锁定,浮动)时才能限制运行时的软件。但是,此项目需要在链接时进行许可检查:当开发人员尝试将其代码链接到我的.lib文件时,此lincese检查应允许链接器仅在具有有效许可证时才能通过。

所以我想知道在CL.exe(ms visual studio)中是否有可用的链接器钩子允许我调用自定义许可证检查模块。

最终用户不需要许可证来运行最终产品也很重要。

我研究了所有可用的链接选项,但无法发现任何有用的内容。

1 个答案:

答案 0 :(得分:3)

问题:

据我所知,许可证实施不是MS链接器的功能。即使它会这样做,也没有什么能阻止你的客户使用另一个没有的链接器,因为库文件有一个已知的定义。

问题是库分发所固有的:在基于库的SDK中,您可以为客户提供构建漂亮应用程序所需的一切,而无需为您提供帐户。没有什么能阻止开发人员将您提供给他的所有内容复制到其他人身上。让他们依赖你的唯一想法是你将提供给他们的支持和保证。

潜在的解决方案

您可以将您客户的许可信息存储在库中,并告知相关信息。开发人员仍然可以填写许可证,但他们会知道你会发现泄漏并可以起诉他们。这会让他们更不愿意分享你的作品。

难点在于您的分发基础架构必须能够为每个客户生成不同的lib文件。从实际的角度来看,我建议使用两个lib文件:一个用于真实库,一个用于许可信息(也包含全局外部变量的定义,包含加密许可证信息)。

在Windows上,您甚至可以更进一步:在exe文件的清单或属性中,有几个适用于控件的供应商特定字段(版权,发布者,公共keu令牌......)。您可以要求生成许可证lib文件的此信息,并且首先调用库函数,您可以使用库中嵌入的许可证信息交叉检查这些信息的合规性。

其他信息

1)静态数据不够:

仅仅拥有库文件中的信息是不够的。您的客户可以简单地用虚拟信息替换您的许可证信息,或者将其删除。因此,以符合特殊校验和的方式加密数据非常重要。然后,您的库将实现单例控制功能,第一步是控制许可证数据的有效性。

2)您的客户是开发人员,因此他们和您一样聪明

是什么阻止他们对您的库进行逆向工程并修补您的控制功能?或者找出您使用的校验和并计算虚拟许可证信息?

<强>结论

有一些方法可以强制执行这种方案,但它们对您来说很昂贵(额外的开发,复杂的分发),并且通过足够的努力,可以禁用它们。

另一方面,如果它对您的客户来说太过限制,他们只会使用另一个库。

如果我是你,我真的会考虑两次。强大的图书馆的快乐客户往往忠于他们的供应商。特别是如果提供响应支持!那为什么要这么麻烦?为什么不从一开始就建立一个信任客户的关系?