本文由Jzwalliser原创,发布在CSDN平台上,遵循CC 4.0 BY-SA协议。
因此,若需转载/引用本文,请注明作者并附原文链接,且禁止删除/修改本段文字。
违者必究,谢谢配合。
个人主页:blog.csdn.net/jzwalliser

前言

以前用Python写过很多小程序,为了方便用pyinstaller打包成了各种exe,然后保存到了电脑的各个角落。但有一次因为磁盘分区出了问题,导致我的源码库全部丢失(太悲伤了),只有那些遍布磁盘不同角落的exe文件幸免于难。不得已,为了恢复一部分源码,只得将先前编译好的exe反编译成py文件。

原理

要想反编译pyinstaller生成的exe,需要先了解pyinstaller是如何打包py脚本生成exe的。
Pyinstaller 在收到打包指令后,会先生成一个spec文件,用于指导打包过程。之后,py文件会被先编译为pyc文件,然后pyc文件又会被去掉开头的8个字节。接着,pyinstaller会将python解释器、依赖文件和修改后的pyc文件一起,用一种特殊的自解压格式打包在一起,形成可执行文件。后面运行可执行文件时,会将所有文件自解压到一个临时目录,然后运行;程序结束后又会将临时目录删除。
其它有关Pyinstaller的内容可以参考这篇文章:Pyinstaller 打包

准备工具

软件(我会在文末提供链接)

  1. Pyinstaller Extractor(py)
  2. Sublime Text(exe)
  3. Uncompyle 6(whl)

反编译步骤

在这里我有一个hello.py文件,里面的内容是:

print("Hello World!!!")

之后,将其打包为exe:

pyinstaller -F hello.py

最后,pyinstaller一顿输出,打包完成。
本章,就以刚刚打包好的hello.exe为例,一起看看如何反编译它。(到时候记得将hello.exe替换为你需要反编译的文件)

1. 解压

pyinstxtractor.py(请关注文末的下载链接)复制到hello.exe文件所在的目录,然后运行命令:

pyinstxtractor.py hello.exe

输出一堆:

D:\studio\pyin\dist\pyinstxtractor.py:86: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
  import imp
[*] Processing hello.exe
[*] Pyinstaller version: 2.1+
[*] Python version: 38
[*] Length of package: 7275745 bytes
[*] Found 69 files in CArchive
[*] Beginning extraction...please standby
[+] Possible entry point: pyiboot01_bootstrap
[+] Possible entry point: pyi_rth_multiprocessing
[+] Possible entry point: hello
[*] Found 206 files in PYZ archive
[*] Successfully extracted pyinstaller archive: hello.exe

You can now use a python decompiler on the pyc files within the extracted director

看到[*] Successfully extracted pyinstaller archive: hello.exe即代表解压成功。此时,会出现一个文件夹:hello.exe_extracted,进入后,找到hello(没有后缀名)。

2. 添加文件头

Pyinstaller在打包py脚本的时候,会先生成pyc文件,再从文件头删掉16个字节,其中包括时间戳、Magic Number,所以文件是不完整的,直接反编译会导致出错。因此,我们需要人为地将文件头加回去。

在这里插入图片描述
此时,找到文件(前面我打包的是hello.py,所以解压出来的叫hello),在后面添加后缀.pyc,然后用Sublime Text打开,此时是以16进制的方式打开的。

再打开文件夹PYZ-00.pyz_extracted,还是用Sublime Text随便打开其中一个pyc文件。
在这里插入图片描述

在这里插入图片描述
打开后,应该是这个样子的(左边是需要修改的文件,右边是随便打开的pyc文件):
在这里插入图片描述

将pyc文件的第一行复制下来,然后添加到缺失16个字节的文件的第一行,保存:
在这里插入图片描述

3. Pyc文件反编译

最后,使用uncompyle6进行反编译。若还没有安装,则可以去文末下载whl文件,也可以运行:

pip install uncompyle6

安装好后,运行:

uncompyle6 hello.pyc

在这里插入图片描述
最后就会显示源码了,虽然与初始的版本略有不同,但基本不影响。如果需要保存到文件,可以运行:

uncompyle6 hello.pyc>hello.py

然后就大功告成啦!

注意事项

由于某些原因(因为xdis还没有开始支持Python 3.9及以上),Uncompyle 6暂时无法反编译Python 3.9及更高版本产生的pyc文件(只能等待xdis更新啦)。
有的时候,pyc会反编译失败,此时可以尝试一些其它的反编译器,如Decompyle 3或在线反编译器(自己上网搜)。
还有,定时备份源代码文件!


下载链接

Pyinstaller Extractor 下载
文件:pyinstxtractor.py
百度网盘:https://pan.baidu.com/s/1sDEmpPPT5bn_XWZlKuDjCA?pwd=0000
也可以可前往SourceForge下载
Uncompyle 6 下载
文件:Uncompyle Python 3.3-3.8.zip
百度网盘:https://pan.baidu.com/s/14iHGfR202y6tSdOcHuPAyA?pwd=0000
也可以前往PyPI下载
Sublime Text 下载
文件:Sublime Text Setup.exe
百度网盘:https://pan.baidu.com/s/1jGUZKsvDkiTLqvu_JymUZA?pwd=0000
其它版本也可以前往Sublime Text 官网下载
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐