Python代码加密 - 4种方案
Python代码加密 - 4种方案
- 发行.pyc文件(👍)
- 代码混淆(👍)
- 使用py2exe(仅限windows)
- 使用Cython(兼容性差)
1、发行 .pyc文件
1)原理
.pyc文件 : 二进制文件,无法看出源码内容。
python执行代码原理:代码 —> .pyc文件 —> 解释执行.pyc文件中内容。
因此,python解释器也可以直接执行.pyc文件
2)步骤
使用python标准库自带的 compileall即可。
# 遍历<path>目录下所有的.py文件,编译成.pyc文件 python -m compileall <path> # .pyc文件也可直接执行,下面两者效果相同 python scriptStudy.py python scriptStudy.pyc
3)优点
- 简单方便,提高源码破解门槛
- 平台兼容性好,.py能在哪运行,.pyc就能在哪运行
4)缺点
-
解释器兼容性查,.pyc只能在特定版本的解释器上运行
-
有现成的反编译工具,破解成本低
-
python-uncompyle6 就是这样一款反编译工具
-
# 将.pyc文件反编译为.py文件 uncompyle6 *compiled-python-file-pyc-or-pyo*
-
2、代码混淆
1)原理
通过一系列的转换,让代码逐渐不让人那么容易明白。
主要有以下几种手段:
- 移除注释和文档。没有这些说明,在一些关键逻辑上就没那么容易明白了。
- 改变缩进。完美的缩进看着才舒服,如果缩进忽长忽短,看着也一定闹心。
- 在tokens中间加入一定空格。这就和改变缩进的效果差不多。
- 重命名函数、类、变量。命名直接影响了可读性,乱七八糟的名字可是阅读理解的一大障碍。
- 在空白行插入无效代码。
2)步骤
方法①: 使用oxyry进行混淆
http://pyob.oxyry.com/ 是一个在线混淆 Python 代码的网站,使用它可以方便地进行混淆。
左侧输入源码,点击[OBFUSCATE](模糊),即可在右侧看到模糊后的代码。
方法②: 使用pyobfuscate库进行混淆
pyobfuscate 算是一个颇具年头的 Python 代码混淆库了,但却是“老当益壮”了。
-
使用方法:
-
下载安装pyobfuscate(pypi上没有)https://github.com/astrand/pyobfuscate
-
git clone https://github.com/astrand/pyobfuscate.git cd pyobfuscate/ python setup.py install
-
上面安装 macos可能会失败,原因是文件中指定data放到/usr/bin,而macos文件系统有安全保护。 我这里直接将源码复制到 pyobfuscate 目录下,然后执行命令模糊代码。
-
cd pyobfuscate ./pyobfuscate mycode.py
-
-
如果安装好,则可直接调用,模糊代码
-
pyobfuscate example.py
-
-
结果会输出在控制台,类似print。
-
不幸的是,pyobfuscate一次只能处理一个源文件,所以它并不适合大型项目。它目前似乎也只适用于python2
-
3)优点
- 简单方便,提高了一点源码破解门槛
- 兼容性好,只要源码逻辑能做到兼容,混淆代码亦能
4)缺点
- 只能对单个文件混淆,无法做到多个互相有联系的源码文件的联动混淆
- 代码结构未发生变化,也能获取字节码,破解难度不大
- pyobfuscate年久未更,目前只适用于python2
3、使用py2exe
1)原理
py2exe 是一款将 Python 脚本转换为 Windows 平台上的可执行文件的工具。其原理是将源码编译为
.pyc
文件,加之必要的依赖文件,一起打包成一个可执行文件。最终发行由
py2exe
打包出的二进制文件。
2)步骤(只能在windos运行)
-
编写入口文件。本示例中取名为
hello.py
:print('hello world')
-
编写
setup.py
:from distutils.core import setup import py2exe setup(console=['hello.py'])
-
生成可执行文件
python setup.py py2exe
-
生成的可执行文件位于
dist\hello.exe
。
3)优点
- 能够直接打包成 exe,方便分发和执行
- 破解门槛比 .pyc 更高一些
4)缺点
- 兼容性差,只能运行在 Windows 系统上
- 生成的可执行文件内的布局是明确、公开的,可以找到源码对应的
.pyc
文件,进而反编译出源码
4、使用Cython
1)原理
虽说
Cython
的主要目的是带来性能的提升,但是基于它的原理:将.py
/.pyx
编译为.c
文件,再将.c
文件编译为.so
(Unix) 或.pyd
(Windows),其带来的另一个好处就是难以破解。
2)步骤
-
编写文件
hello.pyx
或hello.py
:def hello(): print('hello')
-
编写
setup.py
:from distutils.core import setup from Cython.Build import cythonize setup(name='Hello World app', ext_modules=cythonize('hello.pyx'))
-
编译为
.c
,再进一步编译为.so
或.pyd
:python3 setup.py build_ext --inplace
-
执行
python3 -c "from hello import hello;hello()"
即可直接引用生成的二进制文件中的hello()
函数。
3)优点
- 生成的二进制 .so 或 .pyd 文件难以破解
- 同时带来了性能提升
4)缺点
- 兼容性稍差,对于不同版本的操作系统,可能需要重新编译
- 虽然支持大多数 Python 代码,但如果一旦发现部分代码不支持,完善成本较高