由于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,除了能够带来性能的提升,另一个好处时难以破解。
方法:
编写hello.pyx或hello.py:
1
2def hello():
print('hello')编写setup.py
1
2
3
4from distutils.core import setup
from Cython.Build import cythonize
setup(name='Hello World app',
ext_modules=cythonize('hello.py'))编译为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 许可协议。转载请注明出处!