PyInstaller 逆向分析入门:用 pyinstxtractor 提取 pyc 文件完整指南
2026/9/8 16:51:30 网站建设 项目流程

PyInstaller 逆向分析入门:用 pyinstxtractor 提取 pyc 文件完整指南

【免费下载链接】pyinstxtractorPyInstaller Extractor项目地址: https://gitcode.com/gh_mirrors/py/pyinstxtractor

当你收到一个来路不明的 .exe,怀疑它背后藏着 Python 代码,或者弄丢了某个 PyInstaller 打包应用的源码——大多数人会束手无策。这个场景正是pyinstxtractor(PyInstaller Extractor)的主场:它能把 PyInstaller 打包出来的可执行文件拆解成一个个 Python 字节码文件(pyc),并自动修好文件头部,为后续反编译铺平道路。无论你是做安全审计、恶意样本分析,还是想恢复丢失的业务逻辑,这篇指南都能带你从零跑通全流程。

先搞明白:PyInstaller 打包后,代码藏在哪儿

在动手之前,值得花一分钟理解"为什么能拆"。PyInstaller 打包产物本质上是一个自解压外壳加一段"内容区":

  • Cookie 与 MAGIC:文件尾部藏着一串特征字节MEI\014\013\012\013\016,pyinstxtractor 靠它定位存档起点,源码里对应MAGIC常量和checkFile()方法。
  • CArchive:主存档区,装的是入口脚本、模块、资源文件,以及一张"目录表"(TOC),记录每个文件的偏移量、压缩标志和类型。
  • PYZ 存档:一个名为PYZ-00.pyz的嵌套压缩包,里面躺着大量被 marshal 序列化的 Python 模块字节码。

pyinstxtractor 的职责,就是顺着这条线索逐层拆解:先找 cookie,再读 TOC,解压 CArchive 里的文件,遇到 PYZ 就继续递归拆一层。整个过程不需要安装 PyInstaller——它是一个完全独立的单文件脚本,全部逻辑都写在pyinstxtractor.py里,核心类PyInstArchive负责与存档打交道。

10 秒上手:获取脚本并跑通第一次提取

获取工具不需要任何安装步骤,克隆仓库即可:

git clone https://gitcode.com/gh_mirrors/py/pyinstxtractor

项目结构精简到极致:一个 Python 脚本,一份说明文档。使用时把脚本复制到 exe 所在目录,直接传文件名作为参数:

python pyinstxtractor.py 你的程序.exe

Windows 下用法完全一致,只是注意路径写法。工具支持 Python 2.x 与 3.x 全系,兼容 PyInstaller 2.0 到 6.19.0 之间的所有主要版本,覆盖面相当广。

运行后你会看到一屏[+]开头的日志,例如:

[+] Processing dist\test.exe [+] Pyinstaller version: 2.1+ [+] Python version: 36 [+] Length of package: 5612452 bytes [+] Found 59 files in CArchive [+] Beginning extraction...please standby [+] Possible entry point: pyiboot01_bootstrap.pyc [+] Possible entry point: test.pyc [+] Found 133 files in PYZ archive [+] Successfully extracted pyinstaller archive: dist\test.exe

看懂运行日志:每一行都在说什么

新手第一次看到这堆输出容易懵,其实每行信息都指向下一步操作:

日志内容含义对你的价值
Pyinstaller version: 2.1+识别出的打包器版本判断可用的分析思路
Python version: 36打包时用的 Python 版本对照检查你的运行环境
Length of package存档总字节数快速核对文件是否完整
Found N files in CArchive主存档内文件数量评估内容规模
Possible entry point疑似程序入口的脚本优先反编译的对象
Found N files in PYZ archive模块压缩包内文件数预估模块级内容

提取完成后,当前目录会出现一个文件名_extracted文件夹,里面既有 CArchive 直接解出的文件,也有PYZ-00.pyz_extracted子目录(存放拆出来的各个模块 pyc)。入口点 pyc(比如test.pyc)是最先值得反编译的文件——它通常对应打包前的顶层脚本。

让提取结果真正可用:接入反编译器

pyinstxtractor 的输出是 pyc,而不是能直接阅读的源码。要还原成可读的 Python 代码,需要再接一步反编译。社区常用的两款工具:

  • Uncompyle6:老牌 Python 字节码反编译器,支持多个 Python 版本;
  • Decompyle++(pycdc):C++ 实现,兼容性广、出错率相对低。

典型的调用方式:

uncompyle6 test.exe_extracted\test.pyc uncompyle6 test.exe_extracted\PYZ-00.pyz_extracted\__future__.pyc

💡 这里有个关键前提:pyc 文件必须带有正确头部(魔术数字、时间戳等),反编译器才认。这正是 pyinstxtractor 的招牌能力——自动修复文件头。从 PyInstaller 5.3 起,打包器不再往存档里写入 pyc 头部,工具会先把这类"裸 pyc"记下来,等拿到正确的魔术数字后再统一补写,保证每个文件都能被反编译器识别。

五个绕不开的坑:提前知道能省半天时间

实战中踩过的坑,替你提前排一遍:

1. Python 版本务必匹配。PYZ 里的模块是用 marshal 序列化的,版本不匹配会导致解组(unmarshalling)失败。README 明确建议:在生成 exe 的同一 Python 版本下运行本脚本。如果版本不一致,工具会跳过 PYZ 提取并给出警告——这不是 bug,是保护机制。

2. 加密的 PYZ 会"原样"转储。遇到带加密的 PyInstaller 应用,zlib 解压会失败,此时工具不会报错退出,而是把内容按原样写成.encrypted文件。这为后续专门针对加密机制的分析保留了原始素材。

3. 别惊讶于"随机文件名"。当存档里的文件名含非法字节、或根本是空名时,脚本会用 UUID 生成随机名字,同时打印警告。这是刻意的健壮性设计,不是异常。

4. 路径安全是内置的。恶意样本可能在 TOC 里塞../之类的路径想搞目录穿越。脚本会把..替换为__、去掉开头的/,确保文件始终落在提取目录内。分析可疑程序时,这份防护能让你安心不少。

5. 重复文件名自动去重。同名文件冲突时,新文件会被追加随机后缀保存,不会互相覆盖——提取大样本时这个细节很救命。

进阶玩法:从单次提取到自动化流水线

单文件提取只是起点,把 pyinstxtractor 融入你的工作流才更有价值:

  • Linux ELF 原生支持:不必先把 ELF 转成 Windows 格式,脚本可以直接提取 Linux 下的 PyInstaller 可执行文件,跨平台分析路径一致。
  • 批处理脚本:循环调用python pyinstxtractor.py <file>批量处理整个样本目录,再把日志重定向到文件,方便事后检索。
  • 与 CI/CD 结合:把提取和反编译串进流水线,实现对每个构建产物自动化的"源码可读性体检"。
  • 生态扩展:项目还衍生出了pyinstxtractor-ng(免 Python 环境的独立二进制版,支持加密 exe)和基于 Go 的浏览器版pyinstxtractor-web,适合不同场景下的部署需求。

你可能还会关心的几个问题

提取出来的 pyc 能直接运行吗?不能。它们是字节码,需要先反编译成源码;而且即使还原出源码,也未必能原样跑通(依赖、资源文件、运行时钩子都可能缺失)。

需要提前安装 PyInstaller 吗?不需要。脚本自带完整的存档解析逻辑,与 PyInstaller 安装无关。

支持哪些平台?凡是能运行 Python 的地方都行——Windows、Linux、macOS 均可用,输出目录结构与原始文件层级保持一致。

遇到不支持的版本怎么办?先检查你的脚本是不是最新版。项目一直在跟进 PyInstaller 新版本,当前的兼容范围(2.0 ~ 6.19.0)已经覆盖绝大多数实际场景,介于这些版本之间的版本大概率也能正常工作。

写在最后

拆一个 PyInstaller 打包的程序,本质上就是一次"顺着打包器留下的线索往回走"的过程:cookie、CArchive、PYZ、pyc,层层解包,直到代码重新变得可读。pyinstxtractor 把这条路上最繁琐的部分——格式解析、头部修复、异常处理——全部封装进了一个脚本,让你把精力留给真正重要的事:读懂代码本身。

下次再遇到"打不开"的 Python 应用,不妨先跑一句python pyinstxtractor.py 你的程序.exe,看看里面到底藏了什么。逆向分析的乐趣,往往就从这第一行命令开始。

【免费下载链接】pyinstxtractorPyInstaller Extractor项目地址: https://gitcode.com/gh_mirrors/py/pyinstxtractor

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询