【免责声明】仅用于合法场景:找回自己丢失的源码、安全审计、学习研究;严禁反编译他人受版权保护的软件,否则可能承担法律责任

工具

一、核心工具总览(按流程分:解包→反编译)

Python EXE 大多由 PyInstaller 打包,反编译分两步:解包提取.pyc 字节码反编译.pyc 为.py 源码。以下是最主流、稳定的工具:

1. 解包工具(提取 PyInstaller EXE 内部文件)

  • pyinstxtractor.py(最常用、开源)
  • 用途:专门提取 PyInstaller 打包的 EXE,自动解包出 structpyc、依赖库等
  • 支持:全版本 PyInstaller,Python 2/3 通用
  • 用法:python pyinstxtractor.py your_app.exe → 生成 your_app.exe_extracted 目录
  • 地址:https://github.com/extremecoders-re/pyinstxtractor
  • python-exe-unpacker(一键工具集)
  • unpy2exe
  • 用途:专门解包 py2exe 打包的 EXE(较少见)

2. pyc 反编译工具(字节码→源码)

表格

工具 支持 Python 版本 特点 安装 / 用法
decompyle3 3.7~3.12(最新) 最佳新 Python 支持,修复字节码,还原度高 pip install decompyle3decompyle3 main.pyc > main.py
uncompyle6 2.0~3.8 稳定成熟,兼容性好 pip install uncompyle6uncompyle6 main.pyc > main.py
pycdc 全版本(C++ 实现) 无需 Python 环境,命令行工具,适合批量 下载编译版 → pycdc main.pyc -o main.py

3. 辅助工具(必备)

  • Detect It Easy (DIE):查看 EXE 打包方式(PyInstaller/py2exe/UPX 加壳)、Python 版本、架构
  • UPX:脱壳工具(EXE 被 UPX 压缩时,先 upx -d your.exe 解压)
  • 010 Editor / 十六进制编辑器:修复 pyc 文件缺失的 magic number(PyInstaller 会去掉头部)

完整反编译流程

(PyInstaller EXE,最常见)

步骤 1:检测与脱壳

  1. 用 DIE 打开 EXE,确认是 PyInstaller、是否 UPX 加壳
  2. 若 UPX 加壳:upx -d your.exe 解压

步骤 2:解包提取 pyc

# 下载pyinstxtractor.py
python pyinstxtractor.py your_app.exe
# 进入提取目录:your_app.exe_extracted

找到核心文件:无后缀的主字节码文件(通常和 EXE 同名)+ struct 文件

步骤 3:修复 pyc(关键!)

PyInstaller 会删除 pyc 头部的 magic number,直接反编译会失败:

  1. 复制 struct 文件开头的 4 字节 magic(对应 Python 版本)
  2. 用十六进制编辑器,把这 4 字节插入到主字节码文件开头,保存为 main.pyc
  3. 或用脚本自动修复:
# fix_pyc.py
import struct
with open("struct", "rb") as f: magic = f.read(4)
with open("main", "rb") as f: code = f.read()
with open("main_fixed.pyc", "wb") as f: f.write(magic + code)

步骤 4:反编译 pyc→py

在线网址:https://pylingual.io/

# Python 3.9+ 用decompyle3
decompyle3 main_fixed.pyc > main.py
# Python 3.8及以下 用uncompyle6
uncompyle6 main_fixed.pyc > main.py

三、常见问题与限制

  1. 加密 / 混淆:PyInstaller 开启 --key 加密、字节码混淆、Cython/Nuitka 编译(转 C 机器码)→ 无法直接反编译,只能内存 dump 或逆向汇编
  2. 变量名丢失:反编译后变量名可能为 var1func2,注释、格式会丢失,仅还原逻辑
  3. 版本不匹配:反编译工具版本必须和打包时的 Python 版本一致,否则失败

YOLO