行业资讯

一招搞定 Python EXE 逆向:python-exe-unpacker 从安装到实战全攻略

发布时间:2026/8/21 12:36:41
一招搞定 Python EXE 逆向:python-exe-unpacker 从安装到实战全攻略 一招搞定 Python EXE 逆向python-exe-unpacker 从安装到实战全攻略【免费下载链接】python-exe-unpackerA helper script for unpacking and decompiling EXEs compiled from python code.项目地址: https://gitcode.com/gh_mirrors/py/python-exe-unpacker想做 Python EXE 逆向却对着一个不知内部结构的 .exe 无从下手python-exe-unpacker 正是为这个场景而生的开源利器它能自动识别 PyInstaller 与 py2exe 两种主流打包格式把可执行文件一步步还原成可读的 Python 源码让黑盒变成明盒。某个周五的下午同事丢给你一个没有文档的 .exe说帮我看看它到底写了什么。你用记事本打开满屏乱码双击运行窗口一闪而过。这正是无数人第一次接触 Python EXE 逆向时的真实处境。别慌这篇文章就带你完整走一遍从理解打包原理到装好工具、跑通第一条命令再到处理加密和版本兼容这些进阶坑。先搞懂前提Python EXE 逆向为什么从黑盒开始要理解这个工具的价值得先知道一个 .exe 是怎么来的。开发者用 PyInstaller 或 py2exe 打包 Python 程序时会把三样东西塞进一个文件Python 解释器本体、程序依赖的第三方库、以及你自己写的源码编译后的字节码。它就像把一整个厨房塞进集装箱——锅碗瓢盆都在但你想找到那份菜谱得先把箱子拆开。传统的静态分析在这里会很吃力.exe 内部是解释器、动态库、归档文件的混合体直接搜索字符串只能看到零散线索。python-exe-unpacker 的思路很直接先识别打包格式再按格式的固定结构把菜谱挖出来。认识主角它不是一个工具而是一条完整工具链打开仓库你会发现这个项目其实是社区工具的胶水层。仓库里只有几个核心文件各自分工明确python_exe_unpack.py——主脚本负责识别格式、调度流程也是你唯一需要敲的命令入口pyinstxtractor.py——专门解析 PyInstaller 的 CArchive 结构把归档里的文件逐个还原requirements.txt——列好了全部依赖包括反编译引擎 uncompyle6、py2exe 解包模块 unpy2exe、PE 文件解析库 pefile 等。主脚本就像一个流水线调度员拿到 .exe 后先用 pefile 检查 PE 资源里是否有 PYTHONSCRIPT 段py2exe 的特征再检查文件尾部是否有 PyInstaller 的 MEI 魔数命中哪个就走哪条处理管线。你不需要手动判断格式工具会替你完成。3 分钟完成环境准备一次装齐全部依赖上手很简单克隆仓库后安装依赖即可。项目要求 Python 2.7 及以上Python 3 也能跑别被老项目的刻板印象劝退git clone https://gitcode.com/gh_mirrors/py/python-exe-unpacker cd python-exe-unpacker pip install -r requirements.txt第三行命令会一次性装好 uncompyle6、unpy2exe、pefile 等全部依赖。装完后顺手验证一下python python_exe_unpack.py不带参数会打印帮助信息看到-i、-o、-p三个参数就说明环境就绪了。第一条实战命令一键解包 PyInstaller 生成的 EXE假设手头有一个target.exe直接执行python python_exe_unpack.py -i target.exe工具会先报告检测结果再开始解包输出大致长这样[*] On Python 3.7 [*] Processing target.exe [*] Pyinstaller version: 2.1 [*] Python version: 36 [*] This exe is packed using pyinstaller [*] Unpacking the binary now [*] Found 15 files in CArchive [*] Successfully extracted pyinstaller exe. [] Binary unpacked successfully解包完成后结果会集中存放在以目标文件命名的目录里默认在unpacked/下也可以用-o 输出目录自定义。进入目录执行ls -l你会看到类似这样的结构-rw-rw-r-- 70K bz2.pyd -rw-rw-r-- 993K _hashlib.pyd -rw-rw-r-- 111 hello -rw-rw-r-- 220K msvcm90.dll -rw-rw-r-- 628K out00-PYZ.pyz drwxrwxr-x 12K out00-PYZ.pyz_extracted -rw-rw-r-- 2.6M python27.dll -rw-rw-r-- 671K unicodedata.pyd这里面大部分是 dll、pyd 之类的运行库不用理会。请直接盯住那个没有扩展名的文件上面例子里的hello只有 111 字节——它就是程序的主要逻辑字节码也是我们逆向的核心目标。旁边的out00-PYZ.pyz_extracted目录则存放着第三方库的解包结果分析依赖关系时很管用。遇到缺魔术数的 PYC 文件用 -p 参数一键修复提取出的主文件虽然重要但未必能被反编译引擎直接接受。uncompyle6 要求 PYC 文件头部带有魔术数magic number用来标识 Python 版本而 PyInstaller 提取出的主文件有时会缺失这段头部直接反编译就会报错。这时轮到-p参数登场。它会先检查文件头部是否已有可识别的魔术数没有就自动补上默认按 Python 2.7 的魔术数处理有就直接进入反编译流程python python_exe_unpack.py -p hello成功时你会看到[] Successfully decompiled.同目录下随即生成一个hello.py——到这步主逻辑源码就到手了。加密字节码怎么破工具会主动问你要不要解密如果开发者打包时给 PyInstaller 加了--key加密选项解包目录里会出现.pyc.encrypted结尾的文件直接反编译是行不通的。python-exe-unpacker 对此也有预案解包后它会检测到pyimod00_crypto_key这个密钥文件并弹出一句交互询问[*] Encrypted pyc file is found. Decrypt it? [y/n]输入y后工具会自动完成一串原本很繁琐的操作先把密钥文件反编译出来拿到 AES 密钥再用 AES-CFB 模式逐一对加密文件解密经 zlib 解压、补上魔术数最后反编译成源码。这套逻辑参考了社区知名的Extracting Encrypted Pyinstaller技术文章工具把这些复杂步骤封装成了上面这一句简单的问答。版本不兼容报错一条 alias 命令快速切换逆向路上最常见的拦路虎是 Python 版本不匹配。比如用 Python 3 环境去解一个 Python 2 时代打包的 py2exe 程序marshal 序列化格式不同很可能直接报错[-] Error in unpacking the exe. Probably due to version incompability (exe created using python 2 and run this script with python 3)解决办法不是改代码而是切换解释器版本重试alias pythonpython2 python python_exe_unpack.py -i target.exe同理如果系统默认是 Python 2也可以用alias pythonpython3切回去。另外pyinstxtractor 在解析 PYZ 归档时如果检测到运行版本与打包版本不一致会打印警告并建议在对应版本下运行这是因为它依赖 marshal 反序列化跨版本极易失败——尽量保持运行环境与目标程序的打包版本一致能省掉很多麻烦。说在最后它擅长什么不擅长什么保持诚实才能走得更远。这个工具目前只覆盖 PyInstaller 和 py2exe 两种打包格式而且加密解密的成功与否取决于打包时的具体参数遇到高度混淆或深度优化的代码还原出的源码可读性会打折扣动态生成的代码也无法通过静态提取获得。另外请务必把它用在合法场景分析自己拥有版权的程序、做授权的安全研究、或者拿自己打包的 hello world 练手。先从python python_exe_unpack.py -i 自己打包的exe开始你会亲眼见证 Python EXE 逆向从一团乱码到清晰源码的完整过程。工具已经备好剩下就等你的第一条命令了——动手试试顺便给这个开源项目点个 Star让更多人少走弯路。【免费下载链接】python-exe-unpackerA helper script for unpacking and decompiling EXEs compiled from python code.项目地址: https://gitcode.com/gh_mirrors/py/python-exe-unpacker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考