关于保护python代码的思考
Roy Lv7

由于Python的动态特性和开源特点,导致Python代码很难做到很好的加密。社区中的一些声音认为这样的限制是事实,应该通过法律手段而不是加密源码达到商业保护的目的;而还有一些声音则是不论如何都希望能有一种手段来加密。于是乎,人们想出了各种加密或混淆的方案,来达到保护源码的目的。

常见的源码保护手段有如下几种:

  • 发行pyc文件
  • 代码混肴
  • 使用py2exe
  • 使用Cython

发行pyc文件

思路

Python解释器在执行的过程中会首先生成pyc文件,然后解释执行pyc文件中的内容。当然python解释器也能够直接执行pyc文件。而pyc文件时二进制文件,无法直接看出源码内容。如果发行代码到客户端环境时都是pyc文件而非py文件,那岂不是达到保护源码的目的。

方法

python标准库中提供了一个名为compileall的库,可以轻松编译。

python -m compileall 目录名

然后删除执行目录下的所有py文件

优点
  • 简单方便,提高了一点源码破解的门槛
  • 平台兼容性好
不足
  • 解释器兼容性差,pyc只能在特定版本的解释器上运行

  • 有现成的反编译工具,破解成本低

python-uncompyle6就是这样一款反编译工具,效果出众。

uncompyle6 *compiled-python-file-pyc-or-pyo*

代码混淆

思路

通过一系列的转换,让代码不容易阅读,移除注释和文档,改变缩进,在空白行插入无效代码。

方法1: 使用oxyry进行混肴

http://pyob.oxyry.com 是一个在线混淆Python代码的网站,使用它可以方便的进行混淆。

方法2:使用pyobfuscate库进行混淆

pyobfuscate算是一个颇具有年头的Python代码混淆库了,但是却“老当益壮” 对比oxyry的混淆方式,增加了无效的代码行。

优点
  • 简单方便,提高了一点源码破解的门槛
  • 兼容性好
不足
  • 只能对单个文件混淆,无法做到多个呼啸有联系的源码文件的联动混淆
  • 代码结构未发生变化,也能获取字节码,破解难度不大

使用py2exe,pyinstaller

使用Cpython

思路

Cpython将py和pyx编译为c文件,再将c文件编译为so或pyd,除了能够带来性能的提升,另一个好处时难以破解。

方法:
  1. 编写hello.pyx或hello.py:

    1
    2
    def hello():
    print('hello')
  2. 编写setup.py

    1
    2
    3
    4
    from distutils.core import setup
    from Cython.Build import cythonize
    setup(name='Hello World app',
    ext_modules=cythonize('hello.py'))
  3. 编译为c,再进一步编译为so或pyd

    python setup.py build_ext --inplace

    执行python -c "from hello import hello;hello()"即可直接引用生成的二进制文件中的hello()函数。

优点
  • 生成的二进制so或pyd文件难以破解
  • 同时带来了性能提升
不足
  • 兼容性稍差,对于不同版本的操作系统,可能需要重新编译
  • 虽然支持大多数的python代码,但如果一旦发现部分代码不支持,完善成本较高
  • 本文标题:关于保护python代码的思考
  • 本文作者:Roy
  • 创建时间:2020-10-28 14:47:06
  • 本文链接:https://www.yrzdm.com/2020/10/28/protect-python-sourcecode/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!