Python反编译教程(exe转py) 

Python EXE 反编译教程(.exe 转 .py)
(2026 年最新完整实战版,基于 PyInstaller 打包的 .exe)

重要声明
本教程仅用于学习、自己打包的程序找回源码、代码审计、安全研究等合法用途。
请勿用于破解他人商业软件或侵犯知识产权

1. 原理简述(面试/理解必备)

大多数 Python .exe 是用 PyInstaller(最常见)打包的。
打包过程:.py.pyc(字节码)→ 打包进 EXE(包含 Python 解释器 + 资源)。

反编译流程:
EXE → 提取 .pyc 文件 →(修复文件头)→ 反编译成 .py

2. 准备工作

  1. 安装 Python:必须与原 EXE 打包时使用的 Python 版本完全一致(3.8、3.9、3.10、3.11、3.12 等)。
    查看 EXE 的 Python 版本方法:用 pyinstxtractor 提取后看 .pyc 的 magic number。
  2. 下载核心工具(全部免费开源):
  • 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.pycPYZ-00.pyz
  • 主程序通常是 xxx.pyc(或与 exe 同名无后缀的文件)

步骤 2:修复 .pyc 文件头(最容易失败的一步)

PyInstaller 打包时去掉了前 16 字节(magic number + timestamp)。

修复方法(推荐):

  1. 进入 xxx.exe_extracted\PYZ-00.pyz_extracted 文件夹,随便找一个正常的小 .pyc 文件(如 struct.pyc)。
  2. 010 EditorWinHexHxD 等十六进制编辑器打开它,复制前 16 字节
  3. 打开你要反编译的主 xxx.pyc(如果无后缀,先改名为 xxx.pyc),在文件最开头插入这 16 字节。
  4. 保存。

快速获取 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 errorPython 版本不匹配换成原打包版本的 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(加分知识)

  • 使用 NuitkaCython 编译成 C 扩展(真正机器码,极难反编译)
  • PyInstaller + UPX 压缩 + 混淆工具(但仍可提取 pyc)
  • 商业方案:PyArmor(付费加密)

本教程已覆盖 2026 年最新 PyInstaller 6.x 版本的实际情况

现在就试试:把你的 exe 放进文件夹,运行 pyinstxtractor.py,看看能恢复多少源码!

有具体报错、想看某一步的详细截图、或需要 pycdc 编译教程,直接告诉我,我立刻补充!

记住:技术无罪,用途合法!🐍

文章已创建 5041

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部