背景讨论

加密方式:
参考:
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、只使用代码混淆(注意混淆程度越高,报错几率越高)

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

文章作者: Leo
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LeoLan的小站
Python 安全 代码加密
喜欢就支持一下吧