三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

PyInstxtractor 实战:快速还原 PyInstaller 打包程序的源码与数据

PyInstxtractor 实战:快速还原 PyInstaller 打包程序的源码与数据

PyInstxtractor 实战:快速还原 PyInstaller 打包程序的源码与数据

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

凌晨一点,我接手了一个历史遗留问题:同事离职前留下的内部工具在生产环境突然报错,而仓库里只剩一版 PyInstaller 打包的 exe,源码早已不知所踪。那晚我找到了 PyInstxtractor——一个专用于提取 PyInstaller 可执行文件内容的开源脚本,它能完整捞出文件里的 Python 字节码并自动修复 pyc 头部,让逆向分析变得触手可及。这个不起眼的单文件工具,从此成了我处理此类问题的常规武器。

没有它,一次分析的成本有多高

如果决定徒手逆向一个 PyInstaller 文件,你得先想清楚代价。PyInstaller 打包时会把程序数据压缩进一个 CArchive 归档,你需要自己摸清它的结构、定位文件末尾的 cookie 魔数、逐条解析目录表、对每个条目做 zlib 解压,再处理 PYZ 存档里用 marshal 序列化的模块索引——整套流程即使对熟悉二进制格式的人,也至少要搭进去一两天。更现实的风险是,你面对的可能是一段恶意代码,每多拖一天,潜在影响就多一分。而 PyInstxtractor 把这些步骤全部封装,几秒钟给出结果。时间、风险、精力,它一次性帮你省掉了。

它真正帮你解决的三类问题

代码恢复。原理很直白:PyInstaller 把 Python 模块编译成 pyc 字节码塞进归档,PyInstxtractor 负责把这些字节码连同目录结构原样抠出,并自动补上每个 pyc 缺失的头部,让反编译器能直接识别。丢失的源码因此有了找回路径——先提取,再反编译,业务逻辑就回来了。当年那个报错的内部工具,我用它半小时就锁定了崩溃点。

安全审计。分析可疑 exe 时,工具会逐一标注"可能的入口点",也就是程序启动时最先执行的脚本。顺着入口点往下翻,哪些模块可疑、有没有数据外传逻辑,一目了然。对安全人员来说,这相当于拿到了一个黑盒程序的门牌号。

跨平台取证。它不止支持 Windows 的 exe,还能原生处理 Linux ELF 二进制,无需任何转换工具。无论拿到的是什么平台的 PyInstaller 产物,同一条命令、同一套流程即可完成分析。

一条命令到看见源码:完整跑一遍

先获取工具。仓库结构极简,核心就是一个 Python 脚本,clone 下来即可使用:

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

随后把脚本指向目标文件:

python pyinstxtractor.py 你的应用.exe

脚本会逐行打印进度:检测到的 PyInstaller 版本、目标文件对应的 Python 版本、包体大小、CArchive 中的文件数、可能的入口点,以及 PYZ 存档里的模块数量。看到 "Successfully extracted" 时,当前目录下已经多出一个你的应用_extracted文件夹,所有 pyc 按原始结构静静躺在里面。

接下来的事交给反编译器。老牌的 uncompyle6、pycdc 都能直接吃下这些修复过头的 pyc,一条命令输出接近源码的代码:

pycdc 你的应用_extracted\入口模块.pyc

从拿到 exe 到看见代码,全程不到十分钟。这里有个细节值得记住:pyc 字节码跟随 Python 版本走,反编译器也要选对版本,否则解析会失败。

新手最容易踩的三个坑,我都替你踩过

坑一:Python 版本不匹配,核心模块集体失踪。用 3.11 的解释器去跑一个 3.7 打包的 exe,工具会警告并跳过 PYZ 存档解压,很多依赖模块就此丢失。根因是 marshal 反序列化与解释器版本强绑定。修复很简单:用与打包时相同版本的 Python 运行脚本,这是官方反复强调的最佳实践。

坑二:加密的 PYZ 提取出来是乱码。遇到带加密的 PyInstaller 程序,工具不会报错,而是把原始内容以.encrypted后缀原样转储。这不是 bug,是设计——先把数据捞出来,解密交给下一步。此时你需要定位程序里硬编码的解密密钥,再做二次处理。

坑三:提示 "Missing cookie"。这意味着没找到 PyInstaller 的魔数标记。常见原因是文件被加壳、被改名损坏,或者根本不是 PyInstaller 产物。先确认文件完整性,再核对版本新旧,别急着怀疑工具。

把提取能力变成自动化流水线

单次使用只是入门,真正放大价值的是把它嵌进流程。你可以写一个几行的循环,批量遍历目录下所有 exe 并逐个提取归档,在样本分析场景里一次处理几十个文件;更进一步,把提取、反编译、关键字符串扫描串成一条链路,接入 CI 或安全分析平台,新样本进来就自动产出报告。入口点识别加上批量处理这两个特性,让这套组合在应急响应时格外好用。

PyInstxtractor 的价值,在于把一件本该耗时数天的逆向工作压缩成一句话的事——当你想弄清楚一个 PyInstaller 程序里到底装了什么,它就是你最快的答案。现在就 clone 下来,拿手边一个 exe 试试,过程会顺畅得让你惊讶;用着顺手的话,去给项目点个星,让更多需要它的人看见。

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

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

← 返回列表