我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
当前回答
取决于客户是谁,一个简单的保护机制,结合合理的许可协议将比任何复杂的许可/加密/混淆系统更有效。
最好的解决方案是将代码作为服务出售,比如托管服务,或者提供支持——尽管这并不总是可行的。
以.pyc文件的形式发布代码可以防止你的保护被一些#所破坏,但这几乎不是有效的反盗版保护(就像有这样的技术一样),而且归根结底,它不应该达到任何与公司签订像样的许可协议所能达到的效果。
专注于让你的代码尽可能好用——拥有满意的客户会让你的公司赚更多的钱,而不是防止一些理论上的盗版。
其他回答
“有没有解决这个问题的好办法?”不。没有什么可以防止逆向工程。甚至DVD机器上的固件也被逆向工程,AACS加密密钥被暴露。这还是不顾DMCA规定的刑事犯罪。
由于没有任何技术方法可以阻止客户阅读您的代码,所以您必须应用普通的商业方法。
Licenses. Contracts. Terms and Conditions. This still works even when people can read the code. Note that some of your Python-based components may require that you pay fees before you sell software using those components. Also, some open-source licenses prohibit you from concealing the source or origins of that component. Offer significant value. If your stuff is so good -- at a price that is hard to refuse -- there's no incentive to waste time and money reverse engineering anything. Reverse engineering is expensive. Make your product slightly less expensive. Offer upgrades and enhancements that make any reverse engineering a bad idea. When the next release breaks their reverse engineering, there's no point. This can be carried to absurd extremes, but you should offer new features that make the next release more valuable than reverse engineering. Offer customization at rates so attractive that they'd rather pay you to build and support the enhancements. Use a license key which expires. This is cruel, and will give you a bad reputation, but it certainly makes your software stop working. Offer it as a web service. SaaS involves no downloads to customers.
编译python并分发二进制文件!
明智的想法:
使用Cython, Nuitka, Shed Skin或类似的工具将python编译成C代码,然后将应用程序作为python二进制库(pyd)分发。
这样,就不会留下任何Python(字节)代码,我认为你已经做了任何人(即你的雇主)可以从常规代码中期望的任何合理数量的模糊。(.NET或Java比这种情况更不安全,因为字节码没有混淆,可以相对容易地反编译成合理的源代码。)
Cython与CPython的兼容性越来越好,所以我认为它应该可以工作。(实际上,我正在考虑把这个应用到我们的产品上。我们已经以pyd/dll的形式构建了一些第三方库,所以以二进制文件的形式发布我们自己的python代码对我们来说并不是太大的一步。)
看看这篇博客文章(不是我写的),关于如何做到这一点的教程。(thx @hithwen)
疯狂的想法:
您可能可以让Cython为每个模块分别存储c文件,然后将它们全部连接起来,并使用大量内联来构建它们。这样一来,你的Python模块就变得非常单一,很难用普通工具来解决。
超越疯狂:
如果你可以静态地链接(并优化)python运行时和所有库(dll),你就可以构建一个单独的可执行文件。这样,就很难拦截对python和你所使用的任何框架库的调用。但是,如果您使用的是LGPL代码,则无法做到这一点。
我记录了如何通过将其转换为.so文件和将其转换为python轮文件来混淆python: https://github.com/UM-NLP/python-obfuscation
使用Python所能做的最好的事情就是模糊一些东西。
剥离所有文档字符串 只分发.pyc编译文件。 冻结它 隐藏类/模块中的常量,这样help(config)就不会显示所有内容
您可以通过加密部分数据并动态解密并将其传递给eval()来增加一些额外的模糊性。但无论你做什么,总会有人打破它。
这些都不能阻止一个坚定的攻击者通过help、dir等方法来分解字节码或挖掘你的api。
可以将py2exe字节码放在C启动器的加密资源中,在内存中加载并执行它。这里和这里有一些想法。
有些人还想到了一种自我修改程序,使逆向工程变得昂贵。
您还可以找到防止调试器、使反汇编程序失败、设置错误调试器断点和使用校验和保护代码的教程。搜索[" crypded code" execute "in memory"]以获得更多链接。
但正如其他人所说,如果你的代码值得,逆向工程师最终会成功。