如何保护Python源代码?

10

是否有可能仅分发Python脚本的字节码版本(.pyc文件),而不是原始的.py文件?我的应用程序嵌入了Python解释器并调用PyImport_Import来加载脚本。如何告诉它查找.pyc文件并导入它?


2
请问如何保护Python代码? - S.Lott
3
这个问题与261638的不同之处在于这是嵌入到C++中的Python代码,这为影响Python代码的负载提供了更有趣的机会。 - Ned Batchelder
5个回答

12

这些脚本与应用程序分开分发。 - Nathan Osman
所以将脚本分开分发...有什么问题吗? - Michel Gokan Khan
嗯...脚本也不是其中的一部分。事实上,有些第三方会编写其中的一些脚本 - 他们不应该必须安装编译器才能编写它们。 - Nathan Osman

5

我是通过创建 .py 库和简单的 .py 程序来完成的。然后我将库编译成了 .pyc 并进行了分发:程序作为 .py 源代码,库则作为已编译的 .pyc。


这并不能真正保护您的源代码,因为像Uncompyle6这样的工具可以轻松地反编译.pyc字节码:https://pypi.python.org/pypi/uncompyle6 - Vitaly Gordon
Nathan没有要求这种保护。当您需要保护您的代码免受黑客攻击时,请使用混淆器。 - Michał Niklas

5

既然您的主程序是用C++编写的,您可以采取任何措施来保护您的Python文件。例如,您可以对其进行加密以进行分发,然后在导入到Python解释器时即时解密。

由于您正在使用PyImport_Import,因此可以编写自己的__import__钩子来从内存缓冲区中导入模块,而不是从文件中导入,这样您的转换到.pyc文件的过程就可以全部在内存中完成,而没有任何可理解的Python代码存储在磁盘上。


2
在交互式解释器中,这是自动的 - 如果没有.py文件,.pyc文件仍将被使用:
$ echo 'print "hello"' > test.py
$ python -m compileall .
$ rm test.py
$ python -m test
hello
$

你能否尝试使用API测试一下是否可以达到同样的效果?

编辑补充: 我同意Ber的观点,你的代码保护措施可能会相对较弱。-O将删除docstrings,如果这不会改变程序的行为,那么可能会使重构行为更加困难,但你真正需要的是某种字节码混淆。

我不知道是否有现成的Python混淆工具,但是这个听起来是可行的,如果你愿意/能够投入时间(并且不觉得自己很傻),并且可以运行自己的解释器。


我有机会的时候会试一下。如果我没记错的话,这个不起作用。 - Nathan Osman

2

如果您使用py2exe创建一个独立程序,那么这不应该成为问题,您只会得到.pyc文件。

通常情况下,您无需告诉Python查找.pyc文件,它会在任何情况下都执行。只有当存在更新的.py源文件时才会使用。

但是,您的源代码保护级别可能并不是很高。


1
我的应用程序是用C++编写的,而不是Python。py2exe不是一个选项。我指的是Python/C API。 - Nathan Osman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接