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

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

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

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


当前回答

有一个关于隐藏python源代码的全面答案,可以在这里找到。

讨论的可能技术有: -使用编译字节码(python -m compileall) -可执行文件创建者(或安装程序,如PyInstaller) 软件即服务(在我看来,这是隐藏代码的最佳解决方案) - python源代码混淆器

其他回答

使用Python所能做的最好的事情就是模糊一些东西。

剥离所有文档字符串 只分发.pyc编译文件。 冻结它 隐藏类/模块中的常量,这样help(config)就不会显示所有内容

您可以通过加密部分数据并动态解密并将其传递给eval()来增加一些额外的模糊性。但无论你做什么,总会有人打破它。

这些都不能阻止一个坚定的攻击者通过help、dir等方法来分解字节码或挖掘你的api。

通过散列和签署重要文件并使用公钥方法检查,用标准加密方案为代码签名如何?

通过这种方式,您可以为每个客户颁发带有公钥的license文件。

另外,你可以使用python混淆器,就像这个(谷歌一下)。

用同样的方法保护c/c++的二进制文件,即对可执行文件或库二进制文件中的每个函数体进行混淆,在每个函数项的开头插入指令“跳转”,跳转到特定的函数来恢复混淆的代码。字节码是Python脚本的二进制代码,所以

首先编译python脚本代码对象 然后迭代每个代码对象,将每个代码对象的co_code混淆如下所示

    0   JUMP_ABSOLUTE            n = 3 + len(bytecode)

    3
    ...
    ... Here it's obfuscated bytecode
    ...

    n   LOAD_GLOBAL              ? (__pyarmor__)
    n+3 CALL_FUNCTION            0
    n+6 POP_TOP
    n+7 JUMP_ABSOLUTE            0

将混淆的代码对象保存为.pyc或.pyo文件

那些模糊的文件(。Pyc或.pyo)可以被普通的python解释器使用,当这些代码对象第一次被调用时

First op is JUMP_ABSOLUTE, it will jump to offset n At offset n, the instruction is to call a PyCFunction. This function will restore those obfuscated bytecode between offset 3 and n, and put the original byte-code at offset 0. The obfuscated code can be got by the following code char *obfucated_bytecode; Py_ssize_t len; PyFrameObject* frame = PyEval_GetFrame(); PyCodeObject *f_code = frame->f_code; PyObject *co_code = f_code->co_code; PyBytes_AsStringAndSize(co_code, &obfucated_bytecode, &len) After this function returns, the last instruction is to jump to offset 0. The really byte-code now is executed.

有一个工具Pyarmor可以通过这种方式混淆python脚本。

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

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

Python不是你需要的工具

您必须使用正确的工具来做正确的事情,而Python不是为混淆而设计的。事实恰恰相反;在Python中,任何东西都是开放的、易于显示或修改的,因为这是该语言的哲学。

如果你想要一些你看不透的东西,找另一个工具。这并不是一件坏事,重要的是为不同的用途存在不同的工具。

混淆真的很难

即使编译过的程序也可以被逆向工程,所以不要认为你可以完全保护任何代码。你可以分析模糊的PHP,破解flash加密密钥等等。新版本的Windows系统每次都被破解。

有一个法律要求是一个很好的方法

你不能阻止别人滥用你的代码,但是如果有人这样做了,你可以很容易地发现。因此,这只是一个偶然的法律问题。

代码保护被高估了

如今,商业模式倾向于销售服务,而不是产品。你不能复制服务,盗版或窃取它。也许是时候考虑顺其自然了……