Python项目代码加密
背景讨论
加密方式:
参考:
https://www.v2ex.com/t/348602
https://www.zhihu.com/question/55447106
https://zhuanlan.zhihu.com/p/25850970
https://blog.csdn.net/ir0nf1st/article/details/61650984
https://www.freebuf.com/column/199615.html
https://0x48.pw/2017/03/20/0x2f/
如何保护你的 Python 代码:
https://zhuanlan.zhihu.com/p/54296517
https://zhuanlan.zhihu.com/p/54297880
1、只使用代码混淆(注意混淆程度越高,报错几率越高)
- http://pyob.oxyry.com/ 在线混淆网站
- 使用pyminifier混淆:https://blog.csdn.net/ningyanggege/article/details/81509925
例:
pip install pyminifier
# 简单混淆空格等
pyminifier tb.py >> tb_jm.py
# 使用希腊字母
pyminifier --nonlatin tb.py >> tb_jm.py
# 使用希腊字母、函数名长度50
pyminifier --nonlatin --replacement-length=50 tb.py >> tb_jm.py
2、只使用pyc二进制
通过编译为pyc二进制文件达到保护源码。使用CPython不支持JIT技术,也容易通过反编译工具进行反编译。
# 反编译pyc
pip install uncompyle
uncompyle6 tb.pyc > tb.py 将tb.pyc反编译成py文件
3、修改python解析器源码修改opcode(操作码),再编译pyc
编译出来的pyc只有你修改的python解释器才能运行,效果很好。但二进制文件中还是可以看到部分变量名,函数名。
4、先混淆,再结合3的方法
这种方法效果比较好了,保护了源代码。
5、修改Python解释器源码配合RSA、AES等加密。
这种方法效果应该是最好的,完全保护了源代码。
https://zhuanlan.zhihu.com/p/54296517
https://zhuanlan.zhihu.com/p/54297880
库:https://github.com/Falldog/pyconcrete
6、编译为库
使用cython将核心代码py模块文件转换为.c文件,然后使用gcc将其编译为so(unix)文件,或将其编译为pyd(windows)文件。
并在项目启动时加载这些库。
修改python源码opcode(操作码)
原理
通过修改python编译器的opcode(操作码),使得编译出来的pyc文件与用普通的编译器无法解析,从而达到加密的作用。
本工具只适用于python3.6以下版本,python3.6以上版本字节码由1byte改为2byte了,见:
https://docs.python.org/zh-cn/3.7/library/dis.html#opcode-collections
https://docs.python.org/zh-cn/3.7/library/dis.html
在 3.6 版更改: Use 2 bytes for each instruction. Previously the number of bytes varied by instruction.
工具使用
1、环境:需要有python2.7环境(一般系统都带有该版本)
# Centos
yum install openssl-devel libssl-dev
# Ubuntu
sudo apt-get install openssl libssl-dev
2、下载编译器源码:
https://www.python.org/ftp/python/3.5.3/Python-3.5.3.tgz
或
https://www.python.org/ftp/python/3.5.3/Python-3.5.3.tar.xz
解压出来,得到文件夹Python-3.5.3
3、打开命令行,注意,下面的命令中python是2.7版本
# 修改opcode为随机值(如果其他版本,注意修改Random_change_opcode.py里定义的python版本)
# 该脚本使用python2.7环境。
python Random_change_opcode.py --python-source=/home/leo/Downloads/Python-3.5.3(刚刚解压出来的源码目录)
# 编译python解释器
cd /home/leo/Downloads/Python-3.5.3
./configure --prefix=/opt/python-3.5.3 #python安装目录
# ./configure --enable-optimizations --prefix=/opt/python-3.5.3 # --enable-optimizations为开启python稳定版一些优化功能
make -j 4 # 4核编译
make install # 安装,要有root权限
# make test # 执行测试可能会报错,但不影响使用。
cd .. && rm -rf Python-3.5.3 # 安装完成删除源码
# 加入系统路径
echo 'export PATH=/opt/python-3.5.3/bin/:$PATH' >> ~/.bashrc
source ~/.bashrc
这时候执行python3就可以进入python3.5.3的修改opcode后的环境了
# 包里自带了pip
# 安装该版本对应的pip, 这里的python3就是刚刚安装的python3.5.2
# curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
# python3 get-pip.py
# 进入项目目录安装依赖
pip install -r xxx.txt
# 加密代码(一定要在修改过opcode的Python环境执行,否则不生效的)
# 注意《这里的python3就是刚刚安装的python3.5.2;;;mycode是待加密的项目工程目录
python3 encrypt_py_to_pyc.py --python-source /home/leo/mycode
# 如果只加密一个文件可以使用下面的命令
python3 -m compileall -b [待加密的py文件]
# 发布解释器、交付使用
1、可以拷贝安装后的/opt/python-3.5.3到新环境,再添加系统路径
2、打包为rpm或deb发布
参考资料:
https://blog.51cto.com/juispan/2065568
其他资料
https://github.com/c0cc/code_obfuscate
https://zhuanlan.zhihu.com/p/54297880
https://mp.weixin.qq.com/s/uGXraSV0mpXh9YIWh-HAtQ
编译为so或pyd
此种加密严格来说不算加密;只是变成了类似汇编语言,更加难懂,逆向成本变高了。
基于 Cython 将 .py 编译成 run-time libraries 文件:.so (Linux && Mac),或 .pyd (Win):https://github.com/cckuailong/py2sec