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

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

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

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


当前回答

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

其他回答

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

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

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

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

在我自己的项目中,我对软件保护进行了一般的研究,总的观点是完全的保护是不可能的。您唯一希望实现的事情是将保护添加到一个级别,使您的客户绕过该级别的成本高于购买另一个许可证的成本。

话虽如此,我只是检查谷歌的python混淆,没有发现很多东西。在. net解决方案中,混淆将是在windows平台上解决问题的第一种方法,但我不确定是否有人在Linux上有与Mono一起工作的解决方案。

接下来要做的就是用编译语言写代码,如果你真的想这么做,那就用汇编语言。一个被剥离的可执行文件将比解释语言更难反编译。

这一切都归结于权衡。一方面,你可以用python轻松地进行软件开发,在python中也很难隐藏秘密。另一方面,你用汇编程序编写的软件更难编写,但更容易隐藏秘密。

你的老板必须在这个连续统一体中选择一个点来支持他的要求。然后他必须给你工具和时间,这样你才能建造他想要的东西。然而,我敢打赌,他会反对实际开发成本与潜在货币损失之间的对立。

Python不是你需要的工具

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

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

混淆真的很难

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

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

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

代码保护被高估了

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

可以将py2exe字节码放在C启动器的加密资源中,在内存中加载并执行它。这里和这里有一些想法。

有些人还想到了一种自我修改程序,使逆向工程变得昂贵。

您还可以找到防止调试器、使反汇编程序失败、设置错误调试器断点和使用校验和保护代码的教程。搜索[" crypded code" execute "in memory"]以获得更多链接。

但正如其他人所说,如果你的代码值得,逆向工程师最终会成功。

你的雇主是否意识到他可以“偷”回其他人从你的代码中得到的任何想法?如果他们能读懂你的作品,你也能读懂他们的。也许看看你如何能从这种情况中受益,会比担心你可能会失去多少,获得更好的投资回报。

[编辑]回答尼克的评论:

没有得到也没有失去。客户得到了他想要的东西(因为他自己进行了更改,所以已经为此付费了)。因为他没有发布变更,就好像它没有发生在其他人身上一样。

现在如果客户出售软件,他们必须更改版权声明(这是非法的,所以你可以起诉并且会赢->简单的案件)。

如果他们不更改版权声明,第二级客户就会注意到软件来自您的原创,并想知道发生了什么。很有可能他们会联系你,这样你就会了解到你的作品被转售的情况。

同样,我们有两种情况:原来的客户只卖了几份。这意味着他们并没有赚到多少钱,所以为什么要麻烦呢。或者是销量。这意味着你有更好的机会了解他们的工作,并为此做些什么。

But in the end, most companies try to comply to the law (once their reputation is ruined, it's much harder to do business). So they will not steal your work but work with you to improve it. So if you include the source (with a license that protects you from simple reselling), chances are that they will simply push back changes they made since that will make sure the change is in the next version and they don't have to maintain it. That's win-win: You get changes and they can make the change themselves if they really, desperately need it even if you're unwilling to include it in the official release.