笔者今天拿到一个 pyinstaller 打包的小工具,由于程序几经流转,已无法联系作者获取源码,于是尝试从可执行程序中反编译出对应的 python 代码。

解包

对于 pyinstaller 打包出来的程序,目前主流的方法是使用 pyinstxtractor 进行解包。下载 pyinstxtractor.py 文件并与待解包程序放置于同一目录下,然后执行以下命令:

python .\pyinstxtractor.py .\sample.exe

解包出的文件位于 sample.exe_extracted 目录中,另外可以看到程序的入口位于 main.pyc 文件中:

201b9dce2f6a6c959793029ffb8ab72e.png

对于本地没有 python 环境的情况,也可以使用 PyInstaller Extractor WEB 进行在线解包。

反编译

上面得到的 .pyc 文件是 python 编译后的字节码文件,接下来还需要将其反编译。

首先安装 uncompyle6:

pip install uncompyle6


添加系统变量
如果运行 uncompyle6 时出现找不到命令的提示则需要将 uncomply6 安装路径添加至系统变量,笔者电脑中 python 版本为 3.12,则对应的安装路径为 C:\Users\jjl9807\AppData\Roaming\Python\Python312\Scripts

然后进行反编译:

uncompyle6.exe .\main.pyc -o ..\sample.py

结果提示 Unsupported Python version,查询资料发现 python 3.13 版本太新,uncompyle6 还暂时没有支持。后来笔者在 reddit 上找到了一个网站 PyLingual 提供在线反编译 .pyc 文件的服务,实测支持 python 3.13,最终顺利拿到了反编译出的代码。

小结

实际上通过 PyInstaller Extractor WEBPyLingual 这两个网站完全可以在本地没有 python 环境的情况下在线完成 pyinstaller 打包程序的解包与反编译,非常方便。