我将很快发布一个付费的静态库,我想知道是否可以构建任何形式的复制保护,以防止开发人员复制库.
理想情况下,我想防止库被链接到可执行文件中,如果(并且只有!)库被非法复制到开发人员的机器上.这可能吗?
或者,如果与图书馆的非法副本相关的申请根本不起作用,则可以接受; 但是,非常重要的是,这不会给这些应用程序的用户带来负担(例如输入许可证密钥,使用加密狗,甚至需要Internet连接).
该库是用C++编写的,目标是许多平台,包括Windows和Mac.
我有什么选择吗?
我同意其他答案,即傻瓜式保护根本不可能.然而,作为温柔的轻推 ......
如果您的库已预编译,则可以通过在API中要求自定义许可证信息来阻止过度的非法使用.
更改功能如:
jeastsy_lib::init()
至:
jeastsy_lib::init( "Licenced to Foobar Industries", "(hex string here)" );
第一个参数标识客户,第二个参数是MD5或带盐的第一个参数的其他哈希值.
购买库时,您将向客户提供这两个参数.
需要明确的是,对于聪明而又雄心勃勃的人来说,这是一个容易避免的保护.考虑到这是盗版道路上的减速带.这可能会让潜在客户相信购买软件是最简单的方法.
C++静态库是一个非常糟糕的可再发行组件.
它是机器人切线,但IMO应该在这里提到.有许多编译器选项需要与调用者匹配:
ANSI/Unicode的,
静态/动态CRT链接,
异常处理启用/禁用,
成员函数指针的表示
LTCG
调试/发布
这最多64个配置!
即使您的C++代码与平台无关,它们也无法跨平台移植 - 它们甚至可能无法在同一平台上使用未来的编译器版本!LTCG创建了巨大的 .lib文件.因此,即使您可以省略一些选择,您也拥有庞大的构建和分发大小,以及用户的通用PITA.
这是我不会考虑购买任何仅带有静态库的东西的主要原因,更不用说添加任何类型的复制保护了.
实施思路
我想不出比Shmoopty的建议更好的基本机制.
您还可以对您的构建进行"水印",这样,如果您"在野外"检测到某个库,您就可以确定将该对象出售给谁.(但是,您要做什么?将愤怒的电子邮件写给潜在的无辜客户?)此外,这需要一些努力,使用不影响执行的易于定位的字节序列将无济于事.
你需要再次保护自己的LIB"拆包工具".但是,链接器仍应能够删除未使用的函数.
一般的想法
实施一个体面的保护机制需要非常谨慎和一些创造力,我还没有看到一个不会产生额外支持成本并需要艰难的社会决策的单一机制.花在复制保护上的每小时花费一小时不用于改进产品.C++代码的市场并不是很大,我看到了很多客户必须付出的代价.
当我购买代码时,我很乐意支付文档,支持,源代码和其他"未来证明"的迹象.许可证并非如此.