PyInstaller Extractor 是一个 Python 脚本,用于提取 PyInstaller 生成的可执行文件的内容。
pyc 文件的标头会自动修复,以便 Python 字节码反编译器能够识别它。 该脚本可以在 Python 2.x 和 3.x 上运行。 Pyinstaller版本 2.0、2.1、3.0、3.1、3.2、3.3、3.4、3.5、3.6、4.0、4.1、4.2、4.2、4.3、4.4、4.5、4.5、4.5.1、4.6、4.7、4.8、4.9、4.9、4.9、4.10、5.0、5.0。 1、5.1、5.2、5.3、5.4、5.4.1、5.5、5.6、5.6.1、5.6.2、5.7.0、5.8.0、5.9.0、5.10.0、5.10.1、5.11.0、 5.12.0、5.13.0 已测试 并受支持。 可能也适用于其他版本。
该项目最初托管在 SourceForge 上。
python pyinstxtractor.py <filename>python pyinstxtractor.py test.exe
It is recommended to run the script in the same version of Python which was used to generate the executable. This is to prevent unmarshalling errors(if any) while extracting the PYZ archive.
A Python 2.7 byte-code decompiler, written in Python 2.7
Version 0.13, 2012-2-22
注意:这个包不太可能改变,并且已经很大程度上被取代: uncompyle6
uncompyle2 将 Python 字节码转换回等效的 Python 源代码。 它接受来自 CPython 2.7 版本的字节码,并且仅在 Python 2.7 上运行。
生成的源漂亮地打印文档字符串、列表、元组和哈希。
uncompyle2 还可以通过编译并比较两个字节码来验证生成的源代码的等效性。
该代码基于 John Aycock 的通用小语言编译器 Spark 以及他之前在名为 decompyle 的工具上所做的工作。 Hartmut Goebel对其进行了极大的改进。
uncompyle2 -h # prints short usageuncompyle2 --help # prints long usage
仅在 Python 2.7 上运行并处理 2.5-2.7 的字节码。 对于在 Python 2.6、2.7、3.2、3.3、3.4 和 3.5 上运行并处理 2.5-3.5 字节码的内容,请参阅 uncompyle6。
python: 2.4 to 3.8
python: 3.7, 3.8
python: >= 3.9, 需要自己编译
1.1. 使用pyinstaller打包成的exe文件
1.2. 由pyinstxtractor反编得到的代码
1.3. 添加pyc头后源文件的pyc文件
1.4. 由uncompyle反编译成的py文件
2.1. 软件
2.1.1. 010editor
2.1.1. WinHex
2.2. Py程序
2.2.1. pyinstxtractor
2.2.2. uncompyle6
3.1. 将pyinstxtractor.py文件和exe程序放在同一文件夹下
3.2. 命令行进入上述文件目录,执行命令python pyinstxtractor.py *.exe,得到 *.exe_extracted文件夹
3.3. 找到没有后缀的文件,即编写的主程序,通常会有一个.mainfest和它名字相同,用010editor打开,按下键盘insert键选择插入模式
3.4. 找到base_library.zip文件,解压,用010editor打开,比较它和上面主程序文件的区别,把首位多的pyc文件头直接复制出来,添加到主程序的开头,将主程序另存为***.pyc文件
3.3. 找到没有后缀的文件,即编写的主程序,用WinHex打开
3.4. 用WinHex打开out00-PYZ.pyz_extracted目录下任意pyc文件,比较它和上面主程序文件的区别,把首位多的pyc文件头直接复制出来,添加到主程序的开头,Python3 需将主程序另存为 *.pyc
Python2 应该是类似的前面 8Byte: 3F30D0A00000000
Python3 应该是类似的前面12Byte: 170D0D0A0000000000000000
这和Python 字节码有关,所以一定要安装相同版本的Python。
WinHex使用方法:鼠标选择前 8/12 Byte 16进制数据,Ctrl+C,点击文件开头的位置,Ctrl+V 即可
3.5. 命令行进入刚刚产生的pyc文件目录,执行命令uncompyle ***.pyc > output.py
xUsage: uncompyle2 [OPTIONS]... [ FILE | DIR]...Examples:uncompyle2 foo.pyc bar.pyc # decompile foo.pyc, bar.pyc to stdoutuncompyle2 -o . foo.pyc bar.pyc # decompile to ./foo.dis and ./bar.disuncompyle2 -o /tmp /usr/lib/python1.5 # decompile whole library
3.6. 至此,output.py就是我们要找的源程序,其中的中文由于编码成unicode,需要再进行解码
参考文档: http://wcf1987.iteye.com/blog/1672542 http://blog.csdn.net/rolandluo/article/details/16945593