惊魂48小时:Python exe 逆向找回丢失的源码(PyInstaller 完整实战)
一、噩梦开始.py 丢了只剩 .exe我写了一个Python小工具用 PyInstaller 打包成 exe 发给朋友用。结果手贱把源代码文件夹删了回收站也清空了……对着 exe 文件欲哭无泪。唯一的希望这个 exe 是用 Python 打包的理论上可以逆向出大部分源码至少逻辑在。二、技术路线解包 → 反编译1. 解包工具pyinstxtractorPyInstaller 打包的 exe 实质是一个自解压归档需要用pyinstxtractor.py提取里面的.pyc字节码文件。踩坑1Python 3.12 不再支持imp模块原版pyinstxtractor.py中有import imp在 Python 3.12 以上会报ModuleNotFoundError: No module named imp。解决方案A下载pyinstxtractor-ng支持新版 Pythonpip install pyinstxtractor-ng然后使用pyinstxtractor-ng.exe your.exe方案B手动修改原脚本用importlib替代imp网上有修改版我采用了pyinstxtractor-ng一行命令搞定pyinstxtractor-ng.exe 我的程序.exe解包后生成我的程序.exe_extracted文件夹里面有很多文件包括PYZ-00.pyz、localpycs、各种.pyc和.dll。2. 找到自己的代码定位.pyc文件解包后一堆文件如何快速找到自己写的代码查看PYZ-00.pyz_extracted文件夹如果存在搜索最大的.pyc文件标准库通常很小在localpycs文件夹里也可能有最直接的方法找文件名与你的项目相关的例如我的解包后出现了一个以deepseek_python开头的.pyc文件 —— 明显是我之前让 AI 生成的脚本如果你没用AI文件名可能类似main.pyc或your_module.pyc。3. 反编译.pyc为.py拿到.pyc后需要反编译成可读的 Python 代码。常用工具有uncompyle6、decompyle3、pycdc。踩坑2uncompyle6 不支持 Python 3.14我的 exe 打包时用了 Python 3.14解包文件夹里有python314.dll而uncompyle6提示Unsupported Python version, 3.14, for decompilation解决在线反编译最省事访问 pylingual.io 或 decompiler.com上传.pyc文件几秒后就能下载反编译后的.py代码。实测支持 Python 3.14。本地工具 pycdcpycdc对较新 Python 版本支持更好。下载地址GitHub releases选pycdc-*-win64.zip。使用命令pycdc.exe your.pyc recovered.py最终我通过在线反编译成功得到了完整的 Python 代码变量名被简化但逻辑、字符串、注释都保留了。三、恢复后的代码长什么样反编译出的代码没有原来的变量名例如原本的user_name可能变成var1但算法、函数结构、字符串字面量、调用关系完全正确。对于找回丢失的逻辑足够了稍微手动重命名变量就能恢复可读性。四、重要提醒技术无罪使用有界千万不要用这套流程去逆向别人的程序侵犯著作权违反《计算机软件保护条例》大多数软件许可明确禁止逆向工程仅限用于恢复自己丢失的源码或学习目的且已获授权五、完整工具链总结步骤工具说明解包 exepyinstxtractor-ng支持 Python 3.12自动处理加密部分定位 .pyc手动查找通常在PYZ-00.pyz_extracted或根目录反编译 .pycpylingual.io在线支持 Python 3.14无需安装本地反编译备选pycdc命令行工具适合批量处理六、经验教训永远备份源码GitHub、GitLab、网盘、U盘……至少两份。不要对自己打包的 exe 使用--key加密否则自己都解不开。遇到版本不兼容时先试在线工具往往比折腾本地环境快得多。结语从绝望到成功花了整整两天。希望这篇文章能帮助到同样手抖删掉源码的朋友。如果你也遇到了类似问题按这个流程走大概率能救回来。祝大家永不丢代码