python逆向总结
字数 1673 2025-08-20 18:17:41
Python逆向工程全面指南
Python运行原理与逆向基础
Python执行机制
Python是解释型语言,执行过程分为:
- 将源代码编译为字节码(.pyc文件)
- 字节码在Python虚拟机(PVM)中执行
关键点:
- import语句会触发.pyc文件生成
- 直接运行的代码通常不生成.pyc
- 同时存在.py和.pyc时,优先使用.pyc(除非.py更新)
Python分发文件类型
-
.pyc:字节码文件
- 结构:Magic Number(4B) + 时间戳(4B) + PyCodeObject序列化数据
- 不同Python版本的头部结构不同
- 可通过
py_compile模块手动生成
-
.pyo:优化后的字节码(Python 3.5+已废弃)
-
.pyd:Windows动态链接库
- 包含Python模块的二进制扩展
- 通过Cython或C/C++编译生成
-
.pyz:可执行Python ZIP存档
- 包含压缩的Python模块
PyCodeObject结构分析
typedef struct {
PyObject_HEAD
int co_argcount; // 位置参数个数
int co_nlocals; // 局部变量个数
int co_stacksize; // 栈大小
int co_flags;
PyObject *co_code; // 字节码指令序列
PyObject *co_consts; // 常量集合
PyObject *co_names; // 符号名称集合
PyObject *co_varnames; // 局部变量名称
PyObject *co_freevars; // 闭包变量名
PyObject *co_cellvars; // 嵌套函数引用变量
PyObject *co_filename; // 文件名
PyObject *co_name; // 模块/函数/类名
int co_firstlineno; // 起始行号
} PyCodeObject;
打包工具逆向分析
PyInstaller原理
- 分析脚本依赖关系
- 收集依赖模块:
- .pyd文件直接复制
- .py文件编译为.pyc并压缩为ZIP
- 制作exe,包含Python解释器和运行时库
Nuitka原理
- 将Python代码转换为C代码
- 调用gcc/MSVC编译为.pyd文件
反编译技术与工具
常用反编译工具
-
uncompyle6
- 支持Python 1.0-3.8
- 安装:
pip install uncompyle6 - 使用:
uncompyle6 -o output.py input.pyc
-
pycdc
- 支持Python 3.9+
- 编译:
cmake CMakeLists.txt && make - 使用:
./pycdc input.pyc
-
pyinstxtractor
- 解包PyInstaller生成的exe
- 使用:
python pyinstxtractor.py target.exe
-
pyi-archive_viewer
- PyInstaller自带工具
- 查看exe内部结构
反编译流程
- 提取.pyc文件
- 补全文件头(Magic Number等)
- 使用工具反编译
保护与混淆技术
.pyd文件保护
-
使用Cython编译:
from distutils.core import setup from Cython.Build import cythonize setup(ext_modules=cythonize("module.py")) -
Visual Studio创建Python扩展模块
常见混淆方法
- Oxyry Python Obfuscator:源码混淆
- PyArmor:脚本混淆和绑定
- pyminifier:重命名和常量扰乱
- pyc_obscure:向co_code插入垃圾数据
花指令处理
- 识别JUMP_ABSOLUTE等跳转指令
- 修改co_code长度匹配实际内容
- 示例花指令:
710471067102(需删除)
字节码分析
dis模块使用
import dis
import marshal
with open("file.pyc", "rb") as f:
f.seek(8) # Python3跳过16字节头
code = marshal.load(f)
dis.dis(code)
字节码结构
源码行号 | 指令偏移 | 指令符号 | 指令参数 | 实际参数值
实战案例解析
[watevrCTF 2019]Repyc
- 识别VM结构
- 分析opcode:
- 1: MOV
- 2: READ
- 3: ADD
- 4: MUL
- 7: XOR
- 8: SUB
- 解密算法:
for i in range(len(cipher)): flag += chr((ord(cipher[i])+15)^135)
[VNCTF2022] BabyMaze
- 去除花指令(JUMP_ABSOLUTE)
- 修正co_code长度
- 分析迷宫算法
虚拟环境搭建
virtualenvwrapper-win
- 安装:
pip install virtualenvwrapper-win - 创建环境:
mkvirtualenv -p python_path env_name - 管理命令:
workon:列出环境deactivate:退出环境rmvirtualenv:删除环境
直接使用virtualenv
virtualenv --python=python3.8 venv
source venv/bin/activate # Linux
venv\Scripts\activate # Windows
附录:关键资源
- Python opcode.h:定义字节码指令
- marshal.c:序列化实现
- import.c:Magic Number定义
- 在线工具:https://tool.lu/pyc/
本指南涵盖了Python逆向工程的核心技术,从基础原理到高级技巧,结合实战案例,为安全研究人员提供全面的逆向分析参考。