如何3步解开PyInstaller打包的exepyinstxtractor-ng 使用指南【免费下载链接】pyinstxtractor-ngPyInstaller Extractor Next Generation项目地址: https://gitcode.com/gh_mirrors/py/pyinstxtractor-ng你拿到一个别人用 PyInstaller 打包的main.exe想看清里面到底跑了什么代码可双击只会运行用压缩软件打开却什么都没有。pyinstxtractor-ng 干的就是这件事一条命令把 Windows PE 或 Linux ELF 可执行文件里嵌入的 Python 模块和依赖文件全部解出来如果目标还做了加密它能自动找到密钥并解密全程不用你手动算 IV 或切 AES 模式。 项目速览30秒看懂它是什么项目信息官方仓库gh_mirrors/py/pyinstxtractor-ngclone 命令见下一节主要语言Python核心逻辑集中在单个文件依赖 xdis 6.3.0 和 pycryptodome 3.17安装方式git clone 后安装两个依赖即可官方发布页也提供预编译二进制目标机器连 Python 都不用装适用平台Windows 和 Linux可解 Windows PE 与 Linux ELF 两种目标文件运行环境要求 Python ≥ 3.8许可证GPL-3.0-only一个关键的硬指标源码文件头明确列出它支持 PyInstaller 2.0 一直到 5.10.1 的全部版本线5.x 时代去掉 pyc 头的改动它已经适配。从安装到第一次解包命令与输出如果你不想装 Python直接去官方发布页下对应平台的预编译二进制它本身就是用 PyInstaller 打包出来的有点套娃。从源码跑则是git clone https://gitcode.com/gh_mirrors/py/pyinstxtractor-ng cd pyinstxtractor-ng pip install -r requirements.txt python pyinstxtractor_ng.py main.exeWindows 上还有个省事办法把 exe 直接拖到 pyinstxtractor-ng 的图标上。运行后你会依次看到几类信息正在处理的文件、PyInstaller 版本判定2.0 或 2.1、打包时使用的 Python 版本号、CArchive 里找到的文件数量以及一句Possible entry point: xxx.pyc标出疑似入口脚本。结束后当前目录多出一个main.exe_extracted里面是按原包内目录结构还原的 pyc 文件和二进制依赖。工具结束后还会提醒你把 pyc 交给反编译器——它负责拆包还原源码是下一步的事。三个递进任务先解出来再会摸底最后碰加密入门把 main.exe 里的 pyc 和依赖全部解出来效果一条命令得到一个main.exe_extracted目录入口脚本、各模块 pyc、打包进去的图片/配置等文件都按目录结构躺在里面直接丢给反编译器。原理PyInstaller 的 one-file 结构相当于可执行壳 尾部一个带目录表的压缩包工具顺着尾部目录表把每项 zlib 解压后落盘即可。如果你解出来的文件还要接着跑加一个--one-dirpython pyinstxtractor_ng.py --one-dir main.exe这个模式把 pyc 直接放到和可执行文件同级的目录结构里README 里给出的用法就是解完后cd main.exe_extracted再运行入口脚本脚本里的相对路径依赖不会断适合解包完要立刻跑起来验证的场景。进阶不解包先摸底用 --info 查看档案元数据拿到一个来路不明的 exe先别急着全盘落盘。加-i参数只打印元数据、不写任何文件python pyinstxtractor_ng.py --info app.exe输出是一份体检报告PyInstaller 代际、Python 版本、CArchive 文件数、是否存在 PYZ 模块归档、是否加密、包数量和脚本数量、全部入口点名单还有按解压后大小排序的前 5 大文件和压缩/未压缩总字节数。排障、审计、写报告这一步就够了。高级让加密的目标自己开口PyInstaller 从 4.0 起支持对归档内容做 AES 加密加密包里会藏一个名为_crypto_key的模块。工具提取过程中一旦碰到它就把 16 字节密钥读进内存备用之后某个 pyc 解压失败时它会自动拿这把钥匙先试 AES-CTRPyInstaller ≥ 4.0 的模式不成功再退回 AES-CFB 4.0 的模式你全程无感。解不开的文件会被存成.encrypted原样留下不影响其余部分继续提取。它是怎么工作的白话讲清提取流程把整个 exe 想象成一个快递包裹PyInstaller 在文件末尾贴了一张面单cookie上面印着魔数、包裹长度、目录表偏移量、Python 版本这几个字段。工具做的事分四步从文件尾部往前按 8KB 分块搜索魔数定位面单按面单找到目录表TOC逐条读出每个文件的偏移、压缩大小、类型逐条 zlib 解压落盘类型字符决定归宿——s是脚本、m/M是模块或包、z/Z是嵌套的 PYZ 归档还要二次展开修好 pyc 的身份证。MAGIC bMEI\014\013\012\013\016 # 在文件尾部找这串魔数找到才算 pyinstaller 包两个设计让它比老工具省心。一是反序列化字节码用的是 xdis 库而不是本机 Python所以目标用 Python 3.8 还是 3.12 打包都无所谓你机器上装什么版本不影响结果——老工具要求解包环境的 Python 版本和打包时一致的坑在这里不存在。二是 PyInstaller 5.3 起不再保存 pyc 头工具会根据 cookie 里的 Python 版本补写魔数加 PEP 552 的 16 字节头提取出来的 pyc 能被反编译器直接认出来。核心实现都在 pyinstxtractor_ng.py一个文件可以读完。同类工具怎么选什么时候用它什么时候不用原版 pyinstxtractor本项目 fork 的来源无第三方依赖、够轻但字节码反序列化依赖本机 Python 版本且不覆盖 5.3 的无头 pyc 和自动解密。目标是用较新 PyInstaller 打的包时选 ng 版。pyinstxtractor-web官方同门项目跑在浏览器里零安装适合临时看一眼但文件大、要反复操作还是本地 ng 版顺手。pycdc / uncompyle6这两个不是竞争关系是流水线下游——ng 版把 pyc 拆出来后由它们负责还原成源码。uncompyle6 只覆盖到 Python 3.8 以下的字节码3.9 的目标建议直接上 pycdc。踩坑实录5 个高频报错的直给解法Missing cookie→ 文件尾部搜不到魔数。原因文件根本不是 PyInstaller 包或是它没支持的版本。解法先用--info确认再确认打包工具文件若被截断也会报这个错。解包成功但反编译器不认 pyc→ 反编译器支持范围盖不住目标的字节码版本。解法看提取输出里的 Python 版本号3.8 及以下可用 uncompyle63.9 用 pycdc。目录里残留xxx.encrypted文件→ 该条目解密解压两轮都失败工具按原样存了。解法其余文件照常分析这个条目需要单独研究其加密方式工具不会替你硬猜密钥。警告contains invalid bytes. Using random name→ 目录表里的文件名不是合法 UTF-8工具改名成 UUID 了。解法按警告里打印的随机名去找文件它不会丢。警告already exists, saving as xxx_uuid.pyc→ 提取目录里已有同名文件工具不覆盖而是改名。解法先清空xxx_extracted目录再跑一次输出更干净。下一步边界与行动清单提醒一句解包对象限于你有授权分析的程序或你有权审计的系统别用它绕过商业软件保护后二次分发。把解出来的 pyc 交给 pycdc 或 uncompyle6完成拆包→读码的最后一步养成习惯陌生文件先跑--info摸底再决定要不要完整提取遇到疑似加密的目标先确认归档里有没有_crypto_key模块判断自动解密是否可用【免费下载链接】pyinstxtractor-ngPyInstaller Extractor Next Generation项目地址: https://gitcode.com/gh_mirrors/py/pyinstxtractor-ng创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考