Python EXE 反编译教程(.exe 转 .py)
(2026 年最新完整实战版,基于 PyInstaller 打包的 .exe)
重要声明:
本教程仅用于学习、自己打包的程序找回源码、代码审计、安全研究等合法用途。
请勿用于破解他人商业软件或侵犯知识产权!
1. 原理简述(面试/理解必备)
大多数 Python .exe 是用 PyInstaller(最常见)打包的。
打包过程:.py → .pyc(字节码)→ 打包进 EXE(包含 Python 解释器 + 资源)。
反编译流程:
EXE → 提取 .pyc 文件 →(修复文件头)→ 反编译成 .py
2. 准备工作
- 安装 Python:必须与原 EXE 打包时使用的 Python 版本完全一致(3.8、3.9、3.10、3.11、3.12 等)。
查看 EXE 的 Python 版本方法:用 pyinstxtractor 提取后看 .pyc 的 magic number。 - 下载核心工具(全部免费开源):
- pyinstxtractor.py(提取 EXE → .pyc):
GitHub:https://github.com/extremecoders-re/pyinstxtractor
下载pyinstxtractor.py单文件即可。 - uncompyle6(Python 3.8 及以下最佳):
pip install uncompyle6
- pycdc(Decompyle++)(Python 3.9 及以上推荐,支持到 3.13):
GitHub:https://github.com/zrax/pycdc
需要用 CMake + C++ 编译(Windows 可下载 Releases 的 exe,或自己 build)。
3. 完整反编译步骤(以 PyInstaller 为例)
步骤 1:提取 .pyc 文件
把 pyinstxtractor.py 和目标 xxx.exe 放在同一文件夹。
运行命令(用原打包版本的 Python 执行):
python pyinstxtractor.py xxx.exe
成功后会出现文件夹:xxx.exe_extracted
里面包含:
struct.pyc、PYZ-00.pyz等- 主程序通常是
xxx.pyc(或与 exe 同名无后缀的文件)
步骤 2:修复 .pyc 文件头(最容易失败的一步)
PyInstaller 打包时去掉了前 16 字节(magic number + timestamp)。
修复方法(推荐):
- 进入
xxx.exe_extracted\PYZ-00.pyz_extracted文件夹,随便找一个正常的小 .pyc 文件(如struct.pyc)。 - 用 010 Editor、WinHex、HxD 等十六进制编辑器打开它,复制前 16 字节。
- 打开你要反编译的主
xxx.pyc(如果无后缀,先改名为xxx.pyc),在文件最开头插入这 16 字节。 - 保存。
快速获取 magic number 方法(Python 代码):
import importlib.util
import marshal
import struct
def get_magic():
return struct.pack('4B', *importlib.util.MAGIC_NUMBER[:4]) # 前4字节
print(get_magic().hex())
步骤 3:反编译 .pyc → .py
情况 A:Python ≤ 3.8(推荐 uncompyle6)
uncompyle6 xxx.pyc > xxx.py
# 或输出到指定文件
uncompyle6 -o xxx.py xxx.pyc
情况 B:Python 3.9 及以上(推荐 pycdc)
pycdc xxx.pyc > xxx.py
情况 C:在线工具(快速测试,不推荐大文件)
- https://pylingual.io/
- https://rivers.chaitin.cn/tools/pyc2py
4. 常见问题与解决(2026 年最新坑)
| 问题 | 原因 | 解决办法 |
|---|---|---|
| “Unknown magic number” | 文件头缺失 | 按步骤2修复 16 字节 |
| uncompyle6 报 “Unsupported Python version 3.10+” | 版本不支持 | 改用 pycdc |
| 提取失败 / unmarshalling error | Python 版本不匹配 | 换成原打包版本的 Python 运行 pyinstxtractor |
| 代码乱码 / 变量名丢失 | 反编译不完美 | 正常现象,pycdc 通常比 uncompyle6 更好 |
| EXE 加了 –key 加密(旧版) | PyInstaller 老版本加密 | 新版 PyInstaller v6.0+ 已移除加密,现代工具可自动处理 |
| 主程序在 PYZ 里面 | 没找到主 pyc | 解压 PYZ-00.pyz(用 pyinstxtractor 已自动解) |
5. 一键自动化脚本(推荐)
很多人把整个流程写成脚本,推荐参考:
- https://github.com/WithSecureLabs/python-exe-unpacker
- 或者自己写一个简单包装脚本。
6. 如何防止别人反编译你的 EXE(加分知识)
- 使用 Nuitka 或 Cython 编译成 C 扩展(真正机器码,极难反编译)
- PyInstaller + UPX 压缩 + 混淆工具(但仍可提取 pyc)
- 商业方案:PyArmor(付费加密)
本教程已覆盖 2026 年最新 PyInstaller 6.x 版本的实际情况。
现在就试试:把你的 exe 放进文件夹,运行 pyinstxtractor.py,看看能恢复多少源码!
有具体报错、想看某一步的详细截图、或需要 pycdc 编译教程,直接告诉我,我立刻补充!
记住:技术无罪,用途合法!🐍