pyinstxtractor逆向实战指南:一条命令把PyInstaller程序里的Python字节码全部掏出来
【免费下载链接】pyinstxtractorPyInstaller Extractor项目地址: https://gitcode.com/gh_mirrors/py/pyinstxtractor
pyinstxtractor 是一款开源的 PyInstaller 逆向提取工具,它能直接解析打包好的可执行文件,还原出其中全部 Python 字节码(pyc 文件)并自动修复文件头,让后续反编译工作畅通无阻。本文从零演示它的用法,并附上老手才懂的细节与常见坑。
凌晨一点,一个让人抓狂的.exe
同事老张在群里甩来一个可执行文件,附言只有一句话:"客户环境上崩了,但这是编译产物,源码早没了,谁能看一眼里面到底跑了什么?"
我随手敲了两条命令:
file 那个程序.exe输出里PyInstaller几个字一出现,我心里就有底了。十分钟后我回他:"逻辑已经还原出来了,崩溃点在读取配置那一段,缺了字段校验。" 老张连夜打了补丁发给客户,第二天顺利上线。
这不是魔法,靠的就是 pyinstxtractor 这个逆向工具。你不需要是安全专家,也不需要安装 PyInstaller,拿着一个 Python 环境就能干同样的活。
传统翻包 vs 用 pyinstxtractor:差距一目了然
面对一个 PyInstaller 打包的程序,想拿到里面的 Python 逻辑,传统思路往往走不通:
| 传统做法 | 结果 |
|---|---|
直接strings扫二进制 | 只能看到零散字符串,逻辑全无 |
手动找MEI魔数、手工切 CArchive | 要啃打包格式文档,折腾数小时 |
| 网上找通用解包器 | 版本对不上,直接报错或解出乱码 |
| 用 pyinstxtractor 一条命令 | 秒级输出全部 pyc,文件头已自动修复 |
区别的本质在于:pyinstxtractor 把"读懂 PyInstaller 打包格式"这件事彻底封装好了,你只需把文件名丢给它,剩下的解析、解压、头部修复全部自动完成。
三分钟跑通:从克隆到看到 pyc
仓库里只有一个核心脚本,克隆下来就能用:
git clone https://gitcode.com/gh_mirrors/py/pyinstxtractor然后对目标程序执行提取(Windows 下把python换成你的解释器路径即可):
python pyinstxtractor.py 你的程序.exe正常情况下你会看到类似下面的输出:
[+] Processing dist\你的程序.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: 你的程序.pyc [+] Found 133 files in PYZ archive [+] Successfully extracted pyinstaller archive: dist\你的程序.exe工作目录下随即多出一个你的程序_extracted文件夹,里面就是全部提取成果:主程序 pyc、PYZ-00.pyz_extracted子目录里的标准库与第三方依赖,全都带着已修复的合法文件头,可以直接交给反编译器。
它到底干了什么?一个"开罐头"的比喻
可以这样理解:PyInstaller 打包,就像把一堆已经做好的菜(Python 源码编译后的字节码)真空密封进一个罐头(可执行文件),再用一层外壳(CArchive 压缩存档)护住。pyinstxtractor 就是那把开罐器——它先认出罐头上的商标(MEI\014\013\012\013\016魔数),拧开外壳,再把里面一个个压缩包(PYZ 存档)逐个拆封,最后把每道菜重新装盘(修复 pyc 头部),让反编译器能认出它们。
弄懂这个原理,它的应用场景就很好想象了:
- 🔍安全审计:拿到可疑程序先拆开看字节码,排查恶意行为、可疑外联或硬编码密钥,比黑盒跑样本高效得多。
- ♻️源码救援:代码仓库丢失、磁盘损坏时,从旧版本打包的 exe 里抢救出业务逻辑,配合 uncompyle6 或 Decompyle++ 反编译回可读源码。
- 🐧跨平台分析:不只是 Windows exe,Linux 下的 ELF 二进制同样原生支持,一条命令走天下。
- 🎓学习打包机制:拆开自己打出来的包,对照 CArchive 与 PYZ 的结构,比读十篇文档都直观。
高手才知道的三个细节
入口点提示别忽略。输出中的[+] Possible entry point直接标出了程序启动时执行的脚本,逆向时从它下手能最快定位主逻辑,省去在一堆 pyc 里大海捞针。
加密的 PYZ 会原样转储。如果遇到加密的 PyInstaller 程序,工具不会傻傻报错,而是把加密内容按原始格式完整转储出来。这意味着解包这步不会卡住,后续的密文分析可以继续推进。
提取环境尽量和打包环境同版本。工具解析 PYZ 存档时会调用 Python 的marshal反序列化机制,若本机 Python 版本与打包时相差太大,可能出现解组(unmarshalling)错误。先看输出里的[+] Python version一行,再决定要不要换解释器重跑。
最常见的三个坑,以及立刻能用的解法
坑一:提取时报 unmarshalling 错误。十有八九是 Python 版本不匹配。解法:找到打包时用的 Python 版本(同版本的官方安装包即可),用它重新执行提取。
坑二:以为拿到 pyc 就能直接运行。不能。pyc 是字节码,不是源码,也无法脱离原环境独立执行。正确姿势是先反编译成.py,再看逻辑。推荐 uncompyle6 或 Decompyle++(pycdc),命令类似uncompyle6 你的程序.exe_extracted\你的程序.pyc。
坑三:反编译器提示"无法识别文件头"。先确认提取时是否顺利走到Successfully extracted;若中间有报错,优先检查坑一的版本问题。文件头修复是工具的自动行为,只要提取完整,反编译通常不会再卡在格式上。
现在就去试试
挑一个你电脑上现存的老程序——哪怕是你自己很久以前用 PyInstaller 打的包——克隆项目,跑一条命令,打开_extracted目录,亲眼看看里面的字节码世界。从今天起,PyInstaller 在你眼里不再是黑盒。
【免费下载链接】pyinstxtractorPyInstaller Extractor项目地址: https://gitcode.com/gh_mirrors/py/pyinstxtractor
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考