python代码保护及破解技术(上)
字数 1343 2025-08-23 18:31:17
Python代码保护及破解技术详解
一、Python代码执行原理
Python是一种解释型语言,其执行过程分为两个主要阶段:
- 编译阶段:Python解释器将源代码(.py)编译为字节码(.pyc)
- 执行阶段:Python虚拟机(PVM)执行编译好的字节码
.pyc文件结构
.pyc文件由三部分组成:
-
Magic Number (4字节)
- 标识Python版本,不同版本有不同的magic number
- 格式:2字节小端序 + \r\n (如Python2.7: 03f3 0d0a)
-
源代码文件信息 (长度因Python版本而异)
- Python2: 4字节(修改时间戳)
- Python3.5-3.6: 8字节(时间戳+文件大小)
- Python3.7+: 12字节(支持hash校验)
-
PyCodeObject序列化数据
- 包含实际的字节码信息
- 通过marshal模块序列化存储
二、Python代码保护技术
1. 编译为.pyc文件
单个文件编译
python -m py_compile file.py
批量编译
import compileall
compileall.compile_dir(r'/path')
2. PyInstaller打包
将Python解释器、脚本及依赖打包成独立可执行文件:
pyinstaller -F -w file.py
3. 代码混淆技术
混淆手段包括:
- 移除注释和文档
- 改变缩进格式
- 在tokens间插入空格
- 重命名函数/类/变量
- 插入无效代码
在线混淆工具:Oxyry Python混淆器
4. 高级保护技术
(1) 字节码混淆
在opcode中添加无效指令和跳转指令,欺骗反编译工具
(2) Cython加密
将.py文件转换为.c再编译为.pyd/.so:
- 用Cython将Python源码转为C代码
- 用C编译器生成二进制动态库
(3) PyArmor
目前最成熟的Python代码保护方案,基本无法逆向
三、Python代码破解技术
1. .pyc文件反编译
使用uncompyle6
pip install uncompyle6
uncompyle6 -o test.py test.pyc
使用pycdc
适用于Python 3.9+版本
2. PyInstaller解包
步骤:
- 使用pyinstxtractor解包
python pyinstxtractor.py filename.exe
-
补全magic number
- 从解包目录的struct文件中获取
- 用Hex编辑器添加到.pyc文件头部
-
反编译修复后的.pyc文件
3. 处理缺失magic number的情况
Python脚本示例:
structPath = 'struct'
programPath = 'test'
f = open(structPath, 'rb')
f2 = open(programPath, 'rb')
w_all = f2.read()
f2.seek(0)
w = f.read(16).hex()
w2 = f2.read(16).hex()
print(w, w2, sep='\n')
add = input('Please input the codes you need to write:')
add = bytes.fromhex(add)
f2.close()
f2 = open(programPath+'.pyc', 'wb')
f2.write(add + w_all)
f.close()
f2.close()
print('Done.')
四、其他保护方案
- Docker镜像打包:将Python程序打包为加密的Docker镜像
- pyminifier:开源混淆器,重命名变量/函数/类名
- pyc_obscure:向PyCodeObject插入垃圾数据干扰反编译
五、Magic Number参考表
不同Python版本的magic number示例:
- Python 2.7: 62211 (03f3 0d0a)
- Python 3.6: 3373
- Python 3.7: 3390
- Python 3.8: 3413
完整magic number列表可在原文末尾查阅。
六、防护建议
- 对于高安全性需求,优先使用PyArmor或Cython
- 结合多种保护技术(混淆+加密+打包)
- 关键算法建议用C/C++实现并编译
- 定期更新保护措施,跟进最新破解技术
注:更详细的字节码混淆、Cython加密和PyArmor使用方法将在《Python代码保护(下)》中介绍。