如何隐藏客户的C ++源代码

时间:2010-10-13 06:05:51

标签: c++

我希望向客户发送一些组件。我想提供源代码的原因是:

1)我的班级是模板化的。客户可能使用任何模板参数,因此我无法预编译并发送.o文件。

2)客户可能对gcc使用不同的编译器版本而不是我的。所以我希望他在他的最后编辑。

现在,由于显而易见的原因,我无法透露我的源代码。我能做的最大化就是显示.h文件。任何想法我怎么可能实现这一点。我正在考虑gcc中的一些钩子,它们在编译之前支持解密等等。这可能吗?

简而言之,我希望他能够编译这段代码而无法窥探内部。

7 个答案:

答案 0 :(得分:11)

合同=好,混淆= ungood。

也就是说,你总是可以做一种PIMPL习惯用来为你的客户提供二进制文件和标题中的模板包装器。然后,我们的想法是使用“无类型”单独编译的实现,其中模板化的包装器只为客户端代码提供类型安全性。这就是在编译器开始理解如何优化模板之前经常做的事情,也就是说,为了避免机器代码级代码膨胀,但它只提供了一些关于琐碎的复制和粘贴盗窃的保护措施,而不是任何针对某人的保护愿意深入研究机器代码。

但也许这种努力不仅仅是重塑你的功能?

答案 1 :(得分:5)

只需在Alf的答案中添加一些术语:精简模板习惯用法就是您可能会看到的内容。它基本上模拟了泛型的功能。不要被谷歌弹出的维基百科文章搞糊涂,你不必使用void* ......

当然,这并不能保证二进制兼容性。像往常一样使用'native'c ++,你可以自己为客户平台编译组件并部署二进制文件,或者给他们你的代码......纯通用组件代码的不同之处在于你可以完成前者。

答案 2 :(得分:4)

使用一些c ++混淆器可能有帮助吗?:http://www.semdesigns.com/products/obfuscators/CppObfuscationExample.html
Magle It

答案 3 :(得分:3)

首先,如果您要提供源代码,那么您必须提供源代码。当然,你可以加密它,但即使GCC有“编译前解密”选项,它也需要解密代码,如果GCC可以解密代码,那么你的客户也可以。

你问的是不可能的。 (如果你找到了一种方法,我相信电影行业可能会为你提供数百万的合约。他们目前不得不使用昂贵的定制硬件来防止人们破坏内容,而这只能在有限的程度上起作用)

至于你的“显而易见的原因”,为什么你不想提供源代码,我不明白为什么它们是显而易见的。如果您提供源代码会发生什么?

您有两种选择:

  • 完整提供源代码,或
  • 编译可以预编译到(静态或动态)库中的所有内容,并为您的客户提供该文件以及头文件。

答案 4 :(得分:1)

pimpl s怎么办?

答案 5 :(得分:1)

  

1)我的班级是模板化的。客户可能使用任何模板参数,因此我无法预编译并发送.o文件。

     

2)客户可能对gcc使用不同的编译器版本而不是我的。所以我希望他在他的最后编辑。

     

现在,由于显而易见的原因,我无法透露我的源代码。我能做的最大化就是显示.h文件。任何想法我怎么可能实现这一点。我正在考虑gcc中的一些钩子,它们在编译之前支持解密等等。这可能吗?

     

简而言之,我希望他能够编译这段代码而无法窥探内部。

上述考虑2)包括A)ABI差异,使得在同一平台上使用不同编译器版本/供应商编译的相同代码是不兼容的,以及B)系统库,内核版本等的差异,代码可能要依赖。唯一的通用解决方案是在特定平台上进行编译。您可以为所有平台执行此操作,也可以为其提供所有源代码并执行此操作。这不仅仅是标题和模板实现,这也是你的外部函数。你可以通过构建一个更具互操作性的外部“C”函数的墙来缓解A),但是当涉及到B)时你基本上被卡住了。

那么,您可以在编译期间解密吗?只有当您将自己的黑客GCC二进制文件发送给它们时,才为它们的特定系统构建,这可能比提供自己库的不同版本更麻烦(尽管它可能解决模板/标题暴露问题)。

或者,您可以使用源代码混淆技术。这可能 - 实际上 - 和它一样好。我不知道那里有什么工具,但这是人们追求数十年的方法(虽然我还没有听到有人推荐它),所以肯定会有一些成熟的工具。

重新模板化的代码 - 其他人建议将模板化的前端作为预编译对象提供给C风格的通用实现。这可能是也可能不实用(显然存在性能下降的风险,并且您必须捕获所需的特定于类型的操作集 - 例如,通过实例化从抽象操作基类派生的特定于类型的类)但是仍然预编译的对象仍然存在与B)发生冲突。

另一个想法......客户可能会采用您的源代码,但不太可能像您一样理解它。即使他们构建了更多依赖于其版本的系统,他们也会越来越多地锁定,并且可能在将来对您的服务有更多需求。而且,如果你发现他们没有公平竞争,你会在适当的时候给他们充电。

答案 6 :(得分:0)

似乎gcc 4.5支持插件。因此,您可以提供自己的.so,例如,在编译阶段开始之前调用它。所以你可以在那里拥有各种技巧(解密源文件),整齐地隐藏起来。这也是便携式解决方案,因为g ++本身没有变化。

这正是我想要的。你可以在这里阅读更多: http://www.codesynthesis.com/~boris/blog/2010/05/03/parsing-cxx-with-gcc-plugin-part-1/