我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。

如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。

另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。

有什么好办法来解决这个问题吗?


当前回答

我很惊讶,在任何回答中都没有看到“具体”。也许是因为它比问题更新?

它可能正是你所需要的。

它不会混淆代码,而是在加载时对代码进行加密和解密。

来自pypi页面:

保护python脚本工作流程 Your_script.py导入pyconcrete Pyconcrete将钩子导入模块 当你的脚本导入MODULE, pyconcrete导入钩子将尝试查找MODULE。先撒,再撒 解密模块。Pye via _pyconcrete。Pyd并执行解密的数据(如 .pyc内容) 加密和解密_pyconcrete.pyd中的密钥记录 (如DLL或SO)的秘密密钥将隐藏在二进制代码,不能 直接在HEX视图中看到它

其他回答

Python是一种字节码编译的解释型语言,很难被锁定。即使您使用py2exe这样的exe-packager,可执行文件的布局也是众所周知的,Python字节码也很好理解。

通常在这种情况下,你必须做出权衡。保护代码到底有多重要?里面有真正的秘密吗(比如对称加密银行转账的密钥),还是你只是多疑了?选择能让你最快开发出最好产品的语言,并现实地看待你的新想法的价值。

如果您决定确实需要安全地执行许可检查,可以将其编写为一个小的C扩展,这样许可证检查代码就很难(但不是不可能!)进行反向工程,并将大部分代码留在Python中。

在某些情况下,可以将软件(全部或至少关键部分)移动到组织托管的web服务中。

这样,许可证检查就可以在您自己的服务器机房的安全环境中执行。

使用cxfreeze (Linux的py2exe)可以完成这项工作。

http://cx-freeze.sourceforge.net/

它可以在ubuntu存储库中找到

不要依赖混淆。正如你的正确结论,它提供的保护非常有限。 更新:这里有一个论文的链接,它在Dropbox中逆向工程混淆的python代码。操作码重映射方法是一个很好的障碍,但显然它是可以被击败的。

相反,正如许多海报所提到的那样:

不值得花时间进行逆向工程(你的软件这么好,花钱是有意义的) 如果可行的话,让他们签订合同并进行许可证审核。

或者,就像强大的Python IDE WingIDE所做的那样:放弃代码。没错,把代码送出去,让人们回来进行升级和支持。

我认为还有一种方法可以保护你的Python代码;模糊处理方法的一部分。我相信有一个像Mount and Blade之类的游戏,改变并重新编译了他们自己的python解释器(原始的解释器,我相信是开源的),只是改变了OP代码表中的OP代码,使其与标准的python OP代码不同。

所以python源代码没有被修改,但是文件扩展名*。Pyc文件是不同的,并且操作代码与公共python.exe解释器不匹配。如果你检查游戏数据文件,所有数据都是Python源格式。

通过这种方式,可以用各种肮脏的伎俩来对付不成熟的黑客。阻止一群没有经验的黑客很容易。你不太可能打败专业黑客。但我想大多数公司不会长期雇佣专业黑客(可能是因为东西被黑客攻击了)。但不成熟的黑客到处都是(可以理解为好奇的IT人员)。

例如,你可以在一个修改过的解释器中,允许它检查源代码中的某些注释或文档字符串。对于这样的代码行,可以使用特殊的OP代码。例如:

OP 234是源行“#版权是我写的” 或者将这一行编译成等同于"if False:" if "# Copyright"缺失的操作代码。基本上是为了一些模糊的原因禁用了一整块代码。

重新编译修改后的解释器可能可行的一个用例是,应用程序不是你写的,应用程序很大,但你有偿保护它,比如当你是一个金融应用程序的专用服务器管理员时。

我发现让源代码或操作码开放以吸引眼球有点矛盾,但对网络通信使用SSL。SSL也不是100%安全。但它被用来阻止大多数眼睛阅读它。采取一点预防措施是明智的。

此外,如果有足够多的人认为Python源代码和操作码太明显了,很可能最终会有人为它开发至少一个简单的保护工具。因此,越来越多的人问“如何保护Python应用程序”只会促进这种发展。