我正在用Python开发一款软件,它将分发给我雇主的客户。我的雇主想用一个有时间限制的许可证文件来限制软件的使用。
如果我们分发.py文件甚至.pyc文件,将很容易(反编译和)删除检查许可证文件的代码。
另一个方面是,我的雇主不希望我们的客户读到代码,担心代码可能被窃取,或者至少是“新颖的想法”。
有什么好办法来解决这个问题吗?
我正在用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系统每次都被破解。
有一个法律要求是一个很好的方法
你不能阻止别人滥用你的代码,但是如果有人这样做了,你可以很容易地发现。因此,这只是一个偶然的法律问题。
代码保护被高估了
如今,商业模式倾向于销售服务,而不是产品。你不能复制服务,盗版或窃取它。也许是时候考虑顺其自然了……