pyinstxtractor

sourceforge v1.9, github v2.0

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 上。

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.

uncompyle2

A Python 2.7 byte-code decompiler, written in Python 2.7

Version 0.13, 2012-2-22

github

Introduction

注意:这个包不太可能改变,并且已经很大程度上被取代: uncompyle6

uncompyle2 将 Python 字节码转换回等效的 Python 源代码。 它接受来自 CPython 2.7 版本的字节码,并且仅在 Python 2.7 上运行。

生成的源漂亮地打印文档字符串、列表、元组和哈希。

uncompyle2 还可以通过编译并比较两个字节码来验证生成的源代码的等效性。

该代码基于 John Aycock 的通用小语言编译器 Spark 以及他之前在名为 decompyle 的工具上所做的工作。 Hartmut Goebel对其进行了极大的改进。

Features

Usage

Known Bugs/Restrictions

仅在 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

uncompyle6

github

python: 2.4 to 3.8

decompyle3

github

python: 3.7, 3.8

pycdc

github

python: >= 3.9, 需要自己编译

 


 

反编译pyinstaller打包的exe程序

1. 研究对象

1.1. 使用pyinstaller打包成的exe文件

1.2. 由pyinstxtractor反编得到的代码

1.3. 添加pyc头后源文件的pyc文件

1.4. 由uncompyle反编译成的py文件

2. 工具准备

2.1. 软件

  2.1.1. 010editor

  2.1.1. WinHex

2.2. Py程序

  2.2.1. pyinstxtractor

  2.2.2. uncompyle6

3. 具体方法

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

3.6. 至此,output.py就是我们要找的源程序,其中的中文由于编码成unicode,需要再进行解码

参考文档: http://wcf1987.iteye.com/blog/1672542 http://blog.csdn.net/rolandluo/article/details/16945593