python逆向总结
字数 1673 2025-08-20 18:17:41

Python逆向工程全面指南

Python运行原理与逆向基础

Python执行机制

Python是解释型语言,执行过程分为:

  1. 将源代码编译为字节码(.pyc文件)
  2. 字节码在Python虚拟机(PVM)中执行

关键点:

  • import语句会触发.pyc文件生成
  • 直接运行的代码通常不生成.pyc
  • 同时存在.py和.pyc时,优先使用.pyc(除非.py更新)

Python分发文件类型

  1. .pyc:字节码文件

    • 结构:Magic Number(4B) + 时间戳(4B) + PyCodeObject序列化数据
    • 不同Python版本的头部结构不同
    • 可通过py_compile模块手动生成
  2. .pyo:优化后的字节码(Python 3.5+已废弃)

  3. .pyd:Windows动态链接库

    • 包含Python模块的二进制扩展
    • 通过Cython或C/C++编译生成
  4. .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原理

  1. 分析脚本依赖关系
  2. 收集依赖模块:
    • .pyd文件直接复制
    • .py文件编译为.pyc并压缩为ZIP
  3. 制作exe,包含Python解释器和运行时库

Nuitka原理

  • 将Python代码转换为C代码
  • 调用gcc/MSVC编译为.pyd文件

反编译技术与工具

常用反编译工具

  1. uncompyle6

    • 支持Python 1.0-3.8
    • 安装:pip install uncompyle6
    • 使用:uncompyle6 -o output.py input.pyc
  2. pycdc

    • 支持Python 3.9+
    • 编译:cmake CMakeLists.txt && make
    • 使用:./pycdc input.pyc
  3. pyinstxtractor

    • 解包PyInstaller生成的exe
    • 使用:python pyinstxtractor.py target.exe
  4. pyi-archive_viewer

    • PyInstaller自带工具
    • 查看exe内部结构

反编译流程

  1. 提取.pyc文件
  2. 补全文件头(Magic Number等)
  3. 使用工具反编译

保护与混淆技术

.pyd文件保护

  1. 使用Cython编译:

    from distutils.core import setup
    from Cython.Build import cythonize
    setup(ext_modules=cythonize("module.py"))
    
  2. Visual Studio创建Python扩展模块

常见混淆方法

  1. Oxyry Python Obfuscator:源码混淆
  2. PyArmor:脚本混淆和绑定
  3. pyminifier:重命名和常量扰乱
  4. pyc_obscure:向co_code插入垃圾数据

花指令处理

  1. 识别JUMP_ABSOLUTE等跳转指令
  2. 修改co_code长度匹配实际内容
  3. 示例花指令: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

  1. 识别VM结构
  2. 分析opcode:
    • 1: MOV
    • 2: READ
    • 3: ADD
    • 4: MUL
    • 7: XOR
    • 8: SUB
  3. 解密算法:
    for i in range(len(cipher)):
        flag += chr((ord(cipher[i])+15)^135)
    

[VNCTF2022] BabyMaze

  1. 去除花指令(JUMP_ABSOLUTE)
  2. 修正co_code长度
  3. 分析迷宫算法

虚拟环境搭建

virtualenvwrapper-win

  1. 安装:pip install virtualenvwrapper-win
  2. 创建环境:mkvirtualenv -p python_path env_name
  3. 管理命令:
    • 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逆向工程的核心技术,从基础原理到高级技巧,结合实战案例,为安全研究人员提供全面的逆向分析参考。

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结构分析 打包工具逆向分析 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编译: Visual Studio创建Python扩展模块 常见混淆方法 Oxyry Python Obfuscator :源码混淆 PyArmor :脚本混淆和绑定 pyminifier :重命名和常量扰乱 pyc_ obscure :向co_ code插入垃圾数据 花指令处理 识别JUMP_ ABSOLUTE等跳转指令 修改co_ code长度匹配实际内容 示例花指令: 710471067102 (需删除) 字节码分析 dis模块使用 字节码结构 实战案例解析 [ watevrCTF 2019 ]Repyc 识别VM结构 分析opcode: 1: MOV 2: READ 3: ADD 4: MUL 7: XOR 8: SUB 解密算法: [ VNCTF2022 ] BabyMaze 去除花指令(JUMP_ ABSOLUTE) 修正co_ code长度 分析迷宫算法 虚拟环境搭建 virtualenvwrapper-win 安装: pip install virtualenvwrapper-win 创建环境: mkvirtualenv -p python_path env_name 管理命令: workon :列出环境 deactivate :退出环境 rmvirtualenv :删除环境 直接使用virtualenv 附录:关键资源 Python opcode.h:定义字节码指令 marshal.c:序列化实现 import.c:Magic Number定义 在线工具:https://tool.lu/pyc/ 本指南涵盖了Python逆向工程的核心技术,从基础原理到高级技巧,结合实战案例,为安全研究人员提供全面的逆向分析参考。