【Python】pyinstaller 反编译 exe
一、背景
电脑磁盘出问题导致文件丢失,难受的是里面有工作代码,其中一个最新改过的还没及时备份。开始还以为是自己误删或者移到了其他地方,结果搜遍全盘也没找到,试了一些文件恢复方法(recuperaBit,chkdsk)也没用,还有个别文件夹虽然还在但是显示空文件夹而且打不开,重启修复磁盘后异常的文件夹恢复了,但是丢失的文件没有恢复。
突然想到最新的代码虽然没有备份,但是能找到之前通过 pyinstaller 打包后的 exe,如果能反编译回来,再配合之前备份的代码,应该也能再恢复回来。网上能找到的方法基本都差不多,都是先将 exe 反编译回 pyc 文件,再将pyc文件恢复到py源文件。本文记录一种用起来最简单方法。
二、反编译
1. exe -> pyc
工具:pyinstxtractor-ng
下载地址:Releases · pyinstxtractor/pyinstxtractor-ng · GitHub
作者提供了预编译程序,下载下来就可以用。将 pyinstxtractor-ng.exe 放到自己打包的程序所在目录,比如我的是 main.exe,将 main.exe 直接拖到 pyinstxtractor-ng.exe 里就可以反编译出pyc 文件。
反编译出的 pyc 文件存放在 main.exe_extracted 文件夹里,main.pyc 是入口文件,其它代码在 PYZ-xxx 文件夹里。比如我在 main.py 里调用了 src 文件夹里的主程序 run.py,那么在 PYZ-xxx 文件夹里能找到 src 文件夹,src 里有 run.pyc。
2. pyc -> py
工具:pycdc
下载地址:Releases · extremecoders-re/decompyle-builds · GitHub
现在有了 pyc,就需要借助 pycdc 反编译得到 py 文件。同样作者提供了预编译程序,将下载的 pycdc.exe 放到需要反编译的 pyc 文件所在目录下,打开 cmd 运行命令
pycdc.exe <file_name>.pyc
反编译成功,输出源码
实测如果编译时使用的 python 版本是 3.9+,则反编译 pyc 文件会不全,部分地方会提示反编译失败,3.9 以下的版本没有问题,目前没找到解决方法。
三、总结
折腾了大半天好歹是拿到需要的源码了,经过这次教训,以后还是及时备份文件吧。
参考资料
[1] Python3.9及以上Pyinstaller 反编译教程(exe转py)-CSDN博客