Reverse入门参考(二)
字数 2551 2025-09-01 11:26:03
Python逆向工程教学文档:PYC文件、TEA加密与花指令分析
一、PYC文件格式与逆向分析
1. PYC文件基础
PYC文件是Python解释器编译.py文件后生成的二进制文件,类似于Java的.class文件,具有跨平台性。PYC文件包含Python字节码,由Python虚拟机执行。
PYC文件结构:
- Magic int:4字节,标识PYC版本信息
- 时间戳:4字节,表示PYC产生时间(从1970年1月1日的秒数)
- 序列化的PyCodeObject:包含Python代码的字节码表示
2. PYC反编译流程
工具链:
-
EXE转PYC:
pyinstxtractor.py:提取EXE中的PYC文件pydumpck:更便捷的替代工具
-
PYC转PY:
uncompyle6:适用于Python 3.8及以下版本pycdc:适用于Python 3.8及以上版本- 在线工具:https://tool.lu/pyc
常见问题解决:
- 版本兼容问题:当
pyinstxtractor.py报错时:- 修改脚本中
# Skip PYZ extraction if not running under the same python version下方的return语句(不推荐) - 使用Anaconda创建对应版本的Python虚拟环境(推荐)
- 修改脚本中
3. 特殊案例处理
- 自定义函数导入:在提取的文件夹中寻找对应名称的PYC文件,反编译后放入应用程序PY文件同一目录
- 无法反编译:使用
pycdas将PYC编译为字节码,分析类似汇编的代码
二、加密PYC文件解密
1. 加密PYC文件特征
使用Crypto模块AES算法加密,生成.pyc.encrypted文件,无法直接反编译。
2. 解密流程
-
获取Crypto密钥:
- 解包后生成
pyimod00_crypto_key.pyc文件 - 反编译该文件获取密钥
- 解包后生成
-
关注关键文件:
something.pyc:源代码crypto_key.pyc:提供密钥archive.pyc:关注Cipher类,通常归属于tinyaes包
-
版本差异:
- PyInstaller < 4.0 和 ≥ 4.0 版本解密脚本不同
-
注意事项:
- 解密后写入PYC文件时需要包含Magic number等头信息
三、TEA系列加密算法分析
1. TEA加密算法特征
-
识别特征:
- 使用IDA插件
FindCrypto识别特征码0x9e3779b9 - 32轮循环加密
- 涉及
sum、delta和两个变量
- 使用IDA插件
-
变量类型处理:
unsigned int与signed int区别(最高位符号位)uintX_t系列(uint8_t/uint16_t/uint32_t/uint64_t)
2. TEA变种算法
XTEA(TEA升级版):
- 改进密钥生成方式,子密钥根据轮次
i和sum值动态计算 - 使用
((sum >> 11) & 3)索引密钥数组
XXTEA(扩展版):
- 解决分组大小限制
- 但易受选择明文攻击威胁
3. 解密注意事项
- 推荐使用C语言:Python可能出现精度问题
- 明密文处理:
- 32位一组,两位为一组
- 注意分组方式(1-2-3-4或1-2-2-3等)
- 注意顺序(正序或倒序)
四、花指令分析与去除
1. 花指令原理
花指令是插入在正常代码中的垃圾指令,目的:
- 增加静态分析难度
- 改变程序特征码实现免杀
2. 花指令分类
-
不会被执行的花指令:
- 表现为类似数据的代码
- IDA反汇编显示为
jumpout(xxxxx) - 需要跳转指令跳过
-
会被执行但不改变值的花指令
3. 反汇编算法与缺陷
-
线性扫描算法:
- 逐行反汇编,无法区分代码和数据
- IDA采用此算法,易受花指令干扰
-
递归行进算法:
- 按执行顺序反汇编
- 难以准确定位
4. 花指令识别特征
call目的地址畸形- 跳转到某条指令中间(地址+x)
- 大量不常见、不合理指令
5. 常见花指令形式
-
简单JMP:
- OD易受骗,IDA能识别
- 示例机器码:
0xE9(JMP)+4字节偏移
-
Jx+Jnx:
- 替代JMP指令
- 用于永真条件跳转
-
Call+堆栈调整:
call+add esp,4call+add [esp],n+retn
-
红色JMP:
- 显示不可能的大地址
- 需NOP掉
E9机器码
-
Call+Ret:
- 示例比赛:凌武杯2023 flower_tea、NCTF2024 ezDOS
-
标志位操作:
- 如
clc清除进位标志+jnb跳转
- 如
6. 花指令去除实战
以[MoeCTF 2022]chicken_soup为例:
-
IDA操作:
Patch Program→NOP(机器码0x90)U取消定义,恢复为机器码C将机器码分析为汇编P创建函数
-
永真跳转处理:
- NOP掉条件判断
- NOP掉JMP的
E9机器码 - 在目标地址创建函数
-
配置建议:
- 显示机器码(Options→General)
- 打开堆栈指针分析
- 启用汇编注释
7. 其他案例
- [网鼎杯2020青龙组]jocker:
- 修改负值为0
- 配置IDA显示更多分析信息
五、实用工具与资源
1. 推荐工具
-
PYC处理:
pyinstxtractor.pypydumpckuncompyle6/pycdcpycdas(字节码分析)
-
加密分析:
- IDA插件
FindCrypto tinyaes分析工具
- IDA插件
-
花指令分析:
- IDA Pro
- OllyDbg
2. 参考资源
- Python Magic Number表
- 反汇编算法详解
- 各类CTF比赛writeup
六、总结
本文档系统性地介绍了Python逆向工程的三个关键领域:PYC文件分析、TEA加密算法和花指令处理。掌握这些技术需要:
- 理解PYC文件结构和反编译流程
- 熟悉常见加密算法特征和识别方法
- 掌握花指令原理和去除技巧
- 熟练使用相关工具链
- 积累实战经验,特别是CTF比赛案例
逆向工程是实践性很强的技能,建议读者结合实际题目进行练习,逐步提升分析能力。