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

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

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

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


当前回答

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

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

其他回答

我认为还有一种方法可以保护你的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应用程序”只会促进这种发展。

用同样的方法保护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脚本。

你应该看看getdropbox.com的人是如何为他们的客户端软件(包括Linux)做这件事的。这是相当棘手的破解,需要一些相当有创意的拆卸来通过保护机制。

“有没有解决这个问题的好办法?”不。没有什么可以防止逆向工程。甚至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.

有时间限制许可证的想法,并检查它在本地安装的程序将不会工作。即使有完美的混淆,许可证检查也可以被删除。但是,如果您在远程系统上检查许可证,并在关闭的远程系统上运行程序的重要部分,您将能够保护您的IP。

防止竞争对手将源代码作为自己的或编写相同代码的灵感版本,一种保护方法是在您的程序逻辑中添加签名(可以证明代码是从您那里窃取的一些秘密),并混淆python源代码,使其难以阅读和利用。

好的混淆添加了基本相同的保护,你的代码,编译为可执行的(和剥离二进制)。弄清楚模糊的复杂代码是如何工作的可能比实际编写自己的实现还要困难。

这将无助于防止您的程序被黑客攻击。即使有混淆代码,许可证的东西也会被破解,程序可能会被修改,以具有稍微不同的行为(以同样的方式,将代码编译为二进制并不能帮助保护本机程序)。

除了符号混淆可能是一个好主意,不重构代码,这使得一切更加混乱,例如,调用图形指向许多不同的地方,即使实际上这些不同的地方最终做同样的事情。

模糊代码中的逻辑签名(例如,你可以创建程序逻辑使用的值表,但也可以用作签名),可以用来确定代码来自你。如果有人决定使用您的混淆代码模块作为他们自己产品的一部分(甚至在重新混淆它使它看起来不同之后),您可以表明,该代码是通过您的秘密签名窃取的。