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反编译流程

工具链:

  1. EXE转PYC

    • pyinstxtractor.py:提取EXE中的PYC文件
    • pydumpck:更便捷的替代工具
  2. PYC转PY

    • uncompyle6:适用于Python 3.8及以下版本
    • pycdc:适用于Python 3.8及以上版本
    • 在线工具:https://tool.lu/pyc

常见问题解决:

  • 版本兼容问题:当pyinstxtractor.py报错时:
    1. 修改脚本中# Skip PYZ extraction if not running under the same python version下方的return语句(不推荐)
    2. 使用Anaconda创建对应版本的Python虚拟环境(推荐)

3. 特殊案例处理

  • 自定义函数导入:在提取的文件夹中寻找对应名称的PYC文件,反编译后放入应用程序PY文件同一目录
  • 无法反编译:使用pycdas将PYC编译为字节码,分析类似汇编的代码

二、加密PYC文件解密

1. 加密PYC文件特征

使用Crypto模块AES算法加密,生成.pyc.encrypted文件,无法直接反编译。

2. 解密流程

  1. 获取Crypto密钥

    • 解包后生成pyimod00_crypto_key.pyc文件
    • 反编译该文件获取密钥
  2. 关注关键文件

    • something.pyc:源代码
    • crypto_key.pyc:提供密钥
    • archive.pyc:关注Cipher类,通常归属于tinyaes
  3. 版本差异

    • PyInstaller < 4.0 和 ≥ 4.0 版本解密脚本不同
  4. 注意事项

    • 解密后写入PYC文件时需要包含Magic number等头信息

三、TEA系列加密算法分析

1. TEA加密算法特征

  • 识别特征

    • 使用IDA插件FindCrypto识别特征码0x9e3779b9
    • 32轮循环加密
    • 涉及sumdelta和两个变量
  • 变量类型处理

    • unsigned intsigned int区别(最高位符号位)
    • uintX_t系列(uint8_t/uint16_t/uint32_t/uint64_t

2. TEA变种算法

XTEA(TEA升级版):

  • 改进密钥生成方式,子密钥根据轮次isum值动态计算
  • 使用((sum >> 11) & 3)索引密钥数组

XXTEA(扩展版):

  • 解决分组大小限制
  • 但易受选择明文攻击威胁

3. 解密注意事项

  • 推荐使用C语言:Python可能出现精度问题
  • 明密文处理
    • 32位一组,两位为一组
    • 注意分组方式(1-2-3-4或1-2-2-3等)
    • 注意顺序(正序或倒序)

四、花指令分析与去除

1. 花指令原理

花指令是插入在正常代码中的垃圾指令,目的:

  • 增加静态分析难度
  • 改变程序特征码实现免杀

2. 花指令分类

  1. 不会被执行的花指令

    • 表现为类似数据的代码
    • IDA反汇编显示为jumpout(xxxxx)
    • 需要跳转指令跳过
  2. 会被执行但不改变值的花指令

3. 反汇编算法与缺陷

  • 线性扫描算法

    • 逐行反汇编,无法区分代码和数据
    • IDA采用此算法,易受花指令干扰
  • 递归行进算法

    • 按执行顺序反汇编
    • 难以准确定位

4. 花指令识别特征

  1. call目的地址畸形
  2. 跳转到某条指令中间(地址+x)
  3. 大量不常见、不合理指令

5. 常见花指令形式

  1. 简单JMP

    • OD易受骗,IDA能识别
    • 示例机器码:0xE9(JMP)+4字节偏移
  2. Jx+Jnx

    • 替代JMP指令
    • 用于永真条件跳转
  3. Call+堆栈调整

    • call+add esp,4
    • call+add [esp],n+retn
  4. 红色JMP

    • 显示不可能的大地址
    • 需NOP掉E9机器码
  5. Call+Ret

    • 示例比赛:凌武杯2023 flower_tea、NCTF2024 ezDOS
  6. 标志位操作

    • clc清除进位标志+jnb跳转

6. 花指令去除实战

以[MoeCTF 2022]chicken_soup为例:

  1. IDA操作

    • Patch ProgramNOP(机器码0x90
    • U取消定义,恢复为机器码
    • C将机器码分析为汇编
    • P创建函数
  2. 永真跳转处理

    • NOP掉条件判断
    • NOP掉JMP的E9机器码
    • 在目标地址创建函数
  3. 配置建议

    • 显示机器码(Options→General)
    • 打开堆栈指针分析
    • 启用汇编注释

7. 其他案例

  • [网鼎杯2020青龙组]jocker
    • 修改负值为0
    • 配置IDA显示更多分析信息

五、实用工具与资源

1. 推荐工具

  • PYC处理

    • pyinstxtractor.py
    • pydumpck
    • uncompyle6/pycdc
    • pycdas(字节码分析)
  • 加密分析

    • IDA插件FindCrypto
    • tinyaes分析工具
  • 花指令分析

    • IDA Pro
    • OllyDbg

2. 参考资源

  • Python Magic Number表
  • 反汇编算法详解
  • 各类CTF比赛writeup

六、总结

本文档系统性地介绍了Python逆向工程的三个关键领域:PYC文件分析、TEA加密算法和花指令处理。掌握这些技术需要:

  1. 理解PYC文件结构和反编译流程
  2. 熟悉常见加密算法特征和识别方法
  3. 掌握花指令原理和去除技巧
  4. 熟练使用相关工具链
  5. 积累实战经验,特别是CTF比赛案例

逆向工程是实践性很强的技能,建议读者结合实际题目进行练习,逐步提升分析能力。

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 和两个变量 变量类型处理 : 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,4 call + 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.py pydumpck uncompyle6 / pycdc pycdas (字节码分析) 加密分析 : IDA插件 FindCrypto tinyaes 分析工具 花指令分析 : IDA Pro OllyDbg 2. 参考资源 Python Magic Number表 反汇编算法详解 各类CTF比赛writeup 六、总结 本文档系统性地介绍了Python逆向工程的三个关键领域:PYC文件分析、TEA加密算法和花指令处理。掌握这些技术需要: 理解PYC文件结构和反编译流程 熟悉常见加密算法特征和识别方法 掌握花指令原理和去除技巧 熟练使用相关工具链 积累实战经验,特别是CTF比赛案例 逆向工程是实践性很强的技能,建议读者结合实际题目进行练习,逐步提升分析能力。