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

How to enforce licensing restrictions for an SDK

本文关键字:许可 可限制 SDK 强制执行      更新时间:2023-10-16

这是我研究了几个月的一个问题,需要社区的帮助:

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

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

我过去写过多个许可方案,这些方案限制软件在运行时只有在存在正确的许可证持有者的情况下才能工作(基于时间、节点锁定、浮动)。然而,这个项目需要在链接时进行许可检查:当开发人员试图将他们的代码链接到我的.lib文件时,只有当他们有有效的许可证时,这种林塞检查才允许链接器通过。

因此,我想知道CL.exe(ms-visionstudio)中是否有任何链接器挂钩可用,允许我调用自定义许可证检查模块。

同样重要的是,最终用户不需要许可证即可运行最终产品。

我研究了所有可用的链接选项,但没有发现任何有用的东西。

问题:

据我所知,许可证强制执行不是MS链接器的一个功能。即使这样,也不会阻止您的客户使用另一个不使用的链接器,因为库文件有一个已知的定义。

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

潜在解决方案

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

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

在Windows上,你甚至可以更进一步:在exe文件的清单或属性中,有几个供应商特定的字段适合控件(版权、发布者、公共keu令牌…)。你可以在生成许可证库文件时询问这些信息,并在第一次调用库函数时,您可以交叉检查这些信息与嵌入您的图书馆中的许可证信息的一致性。

附加信息

1) 静态数据不够:

仅仅在库文件中包含信息是不够的。您的客户可以简单地用伪信息替换您的许可证信息,或者将其删除。因此,以符合特殊校验和的方式加密数据是很重要的。然后,您的库必须实现一个单例控制函数,第一步是控制许可证数据的有效性。

2) 你的客户是开发人员,所以他们和你一样聪明

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

结论

当然有一些方法可以强制执行这种方案,但它们对您来说代价高昂(额外的开发、复杂的分发),只要付出足够的努力,就有可能禁用它们。

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

如果我是你,我真的会三思而后行。powerfull图书馆的快乐客户往往忠于他们的供应商。尤其是在提供响应式支持的情况下!那为什么要麻烦呢?为什么不从一开始就建立一种信任客户的关系呢?