我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
当前回答
编译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代码,则无法做到这一点。
其他回答
在我自己的项目中,我对软件保护进行了一般的研究,总的观点是完全的保护是不可能的。您唯一希望实现的事情是将保护添加到一个级别,使您的客户绕过该级别的成本高于购买另一个许可证的成本。
话虽如此,我只是检查谷歌的python混淆,没有发现很多东西。在. net解决方案中,混淆将是在windows平台上解决问题的第一种方法,但我不确定是否有人在Linux上有与Mono一起工作的解决方案。
接下来要做的就是用编译语言写代码,如果你真的想这么做,那就用汇编语言。一个被剥离的可执行文件将比解释语言更难反编译。
这一切都归结于权衡。一方面,你可以用python轻松地进行软件开发,在python中也很难隐藏秘密。另一方面,你用汇编程序编写的软件更难编写,但更容易隐藏秘密。
你的老板必须在这个连续统一体中选择一个点来支持他的要求。然后他必须给你工具和时间,这样你才能建造他想要的东西。然而,我敢打赌,他会反对实际开发成本与潜在货币损失之间的对立。
不要依赖混淆。正如你的正确结论,它提供的保护非常有限。 更新:这里有一个论文的链接,它在Dropbox中逆向工程混淆的python代码。操作码重映射方法是一个很好的障碍,但显然它是可以被击败的。
相反,正如许多海报所提到的那样:
不值得花时间进行逆向工程(你的软件这么好,花钱是有意义的) 如果可行的话,让他们签订合同并进行许可证审核。
或者,就像强大的Python IDE WingIDE所做的那样:放弃代码。没错,把代码送出去,让人们回来进行升级和支持。
在某些情况下,可以将软件(全部或至少关键部分)移动到组织托管的web服务中。
这样,许可证检查就可以在您自己的服务器机房的安全环境中执行。
编译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代码,则无法做到这一点。
有一个关于隐藏python源代码的全面答案,可以在这里找到。
讨论的可能技术有: -使用编译字节码(python -m compileall) -可执行文件创建者(或安装程序,如PyInstaller) 软件即服务(在我看来,这是隐藏代码的最佳解决方案) - python源代码混淆器