在高度模板化的库中进行代码混淆

Code obfuscation in heavily templated library

本文关键字:代码 高度      更新时间:2023-10-16

我们商业C++库的很大一部分依赖于模板。我们计划将我们的产品作为头文件和动态链接库(闭源(出售,但由于我们的大部分代码库都集中在头文件中,我们实际上会将其作为开源发布,缺少小的、易于替换的块。

下面是一个来自库接口的类的示例:

template<class ItInput, class ItOutput>
struct serialize{
ItOutput operator() (ItInput first, ItInput last, ItOutput d_first) {
// operation on pointers (assuming that ++, -- and * operators work as expected for pointers) 
} 

有没有办法为我们的模板化代码提供等于或优于常规代码编译的混淆级别(即技术上可逆但无利可图,也不最佳(?

编辑:澄清一下,我们的目标是防止用户阅读实现,而不是防止非法复制我们的工作。为了这个问题,请假设我们有正当理由提出此要求。

我们实际上会将其作为开源发布

错了。"开源"意味着您的许可证与 OSI 兼容,并且很可能不兼容。

请咨询您的律师。

您错误地寻求法律问题的技术答案。

有没有办法为我们的模板化代码提供等于或优于常规代码编译的混淆级别

如果你有时间花,你可以用一些无用的垃圾替换库中的每个标识符。例如,如果您使用secret标识符,请添加类似

#define secret s_1eovFxBcc2F

在任何其他代码之前。稍后,您甚至可以运行一个脚本,将每次出现的secret替换为s_1eovFxBcc2F。当然,您的secret不应出现在您使用的任何系统标头中。

恕我直言,这将是浪费时间,但可能会让你的经理满意。

真正重要的是适用于您的客户的许可证。任何严肃的企业(当然也不是大企业(都不能违反法律。

澄清一下,我们的目标是防止用户阅读实现,

然后,仅提供一组类似 C 的(可能声明为extern "C"(函数作为库的已发布接口,仅提供不透明的数据类型。

顺便说一句,你有没有考虑过相反的方法,让你的库开源,也许有一个GPL许可证(并出售替代的,不太自由的软件友好的许可证(,这样使用它的每个(分布式(程序也必须是GPL编辑的(或者必须购买你广泛的其他许可证(?

(我坚持认为,法律问题通常没有技术解决方案(