如何保护Python代码不被用户读取?

如何保护Python代码不被用户读取?,python,licensing,obfuscation,copy-protection,Python,Licensing,Obfuscation,Copy Protection,我正在用Python开发一个软件,它将分发给我雇主的客户。我的雇主想用有时间限制的许可文件来限制软件的使用 如果我们分发.py文件甚至.pyc文件,那么就很容易(反编译和)删除检查许可证文件的代码 另一方面,我的雇主不希望我们的客户阅读代码,担心代码可能被盗,或者至少是“新奇的想法” 有没有处理这个问题的好方法?Python是一种字节码编译解释语言,很难锁定。即使您使用像这样的exe打包程序,可执行文件的布局也是众所周知的,Python字节码也很容易理解 通常在这种情况下,你必须做出权衡。保护代

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

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

另一方面,我的雇主不希望我们的客户阅读代码,担心代码可能被盗,或者至少是“新奇的想法”


有没有处理这个问题的好方法?

Python是一种字节码编译解释语言,很难锁定。即使您使用像这样的exe打包程序,可执行文件的布局也是众所周知的,Python字节码也很容易理解

通常在这种情况下,你必须做出权衡。保护代码到底有多重要?里面有真正的秘密吗(比如银行转账的对称加密密钥),或者你只是有点偏执?选择能让您最快开发出最佳产品的语言,并现实地看待您的新颖想法的价值


如果您决定确实需要安全地强制执行许可证检查,请将其编写为一个小型的C扩展,这样许可证检查代码就很难(但并非不可能!)进行反向工程,并将大部分代码保留在Python中。

您应该看看getdropbox.com的人员是如何为他们的客户端软件执行此操作的,包括Linux。破解代码相当棘手,需要一些创造性的反汇编才能通过保护机制。

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

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

一无所获,一无所失。客户得到了他想要的东西(并且在他自己做了改变后支付了费用)。因为他没有发布更改,就好像其他人都没有发生过一样

现在,如果客户销售软件,他们必须更改版权声明(这是非法的,因此你可以起诉,并将胜诉->简单案例)

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

同样,我们有两个案例:最初的客户只卖了几本。这意味着他们无论如何也赚不了多少钱,所以何必麻烦呢。或者是大量出售。这意味着你有更好的机会了解他们的所作所为,并为此采取行动


但最终,大多数公司都试图遵守法律(一旦声誉受损,做生意就困难得多)。所以他们不会偷你的作品,而是和你一起努力改进。因此,如果您包含源代码(具有保护您免受简单转售的许可证),他们很可能会简单地将所做的更改推后,因为这将确保更改在下一版本中,并且他们不必维护它。这是双赢的:你得到更改,如果他们真的非常需要,他们可以自己进行更改,即使你不愿意将其包括在正式版本中。

我已经为我自己的项目研究了一般的软件保护,一般的理念是完全的保护是不可能的。您希望实现的唯一一件事是将保护添加到一个级别,这将使您的客户比购买另一个许可证的成本更高

说到这里,我只是检查了一下谷歌的python观察结果,没有发现很多东西。在.Net解决方案中,obfuction将是在windows平台上解决问题的第一种方法,但我不确定是否有人在Linux上使用Mono解决方案

下一步是用编译语言编写代码,或者如果您真的想一直这样做,那么就用汇编语言编写代码。一个精简的可执行文件要比一种解释语言更难反编译

这一切都归结为权衡。一方面,您可以轻松地使用python进行软件开发,其中隐藏秘密也非常困难。另一方面,你有用汇编语言编写的软件,这很难编写,但更容易隐藏秘密

你的老板必须在这个连续统的某个地方选择一个点来支持他的要求。然后他必须给你工具和时间,这样你就可以建立他想要的东西。然而,我打赌他会反对实际开发成本与潜在的金钱损失。

“有解决这个问题的好方法吗?”没有。没有任何东西可以防止逆向工程。甚至DVD机上的固件也进行了反向工程,并暴露了问题。尽管DMCA将其定为刑事犯罪

由于没有任何技术方法可以阻止您的客户阅读您的代码,因此您必须应用普通的商业方法

  • 执照。合同。条款和条件。即使人们可以阅读代码,这仍然有效。请注意,一些基于Python的组件可能要求您在销售使用这些组件的软件之前支付费用。此外,一些开源许可证禁止您隐藏该组件的源代码或来源

  • 提供显著的价值。如果你的东西很好——价格很难拒绝——就没有理由浪费时间和金钱来逆向工程任何东西。逆向工程是昂贵的。让你的产品稍微便宜一点

  • 提供升级和增强,使任何反向工程都成为一个坏主意。当下一个版本打破他们的逆向工程时,就没有意义了。T
    $ pyminifier --nonlatin --replacement-length=50 /tmp/tumult.py
    #!/usr/bin/env python3
    ﺭ异Use Cython. It will compile your modules to high-performant C files, which can then be compiled to native binary libraries. This is basically un-reversable, compared to .pyc bytecode!

    I've written a detailed article on how to set up Cython for a Python project, check it out:

    Protecting Python Sources With Cython

    Use the same way to protect binary file of c/c++, that is, obfuscate each function body in executable or library binary file, insert an instruction "jump" at the begin of each function entry, jump to special function to restore obfuscated code. Byte-code is binary code of Python script, so

    • First compile python script to code object
    • Then iterate each code object, obfuscate co_code of each code object as the following
        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
    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)