前言全局说明
打包好的exe文件还在,但是Python源文件不知什么时候被误删了。现在想改动一下功能,重写Python脚本工程量也太大了,怎么办?只能反编译还原源码。
一、说明
1.1 环境:
Windows 11 家庭版 23H2 22631.3737
Python 3.8.10 (tags/v3.8.10:3d8993a, May 3 2021, 11:48:03) [MSC v.1928 64 bit (AMD64)] on win32
1.2 反编译exe脚本到pyc字节码文件:
pyinstxtractor.py 脚本可以在github项目 python-exe-unpacker 中下载,地址:
https://github.com/WithSecureLabs/python-exe-unpacker
经测试:pyinstxtractor.py 最高支持版本 3.11.9
1.3 pyc 字节码转源码:
pip install uncompyle6
或 用国内镜像
pip install uncompyle6 -i https://pypi.tuna.tsinghua.edu.cn/simple
uncompyle6 官方推荐 python 3.7.4 运行
1.4 确认一个exe程序他是不是由pyinstaller编译的,
如果不是那就没必要再往下操作了。一般我们可以看程序图标,比较标志性的两个:
下图,图标表示不带命令行(即pyinstaller -w)
下图,图标表示带命令行
二、exe 提取获取pyc字节码文件
2.1 exe打包对照表
网上说,尽量选择和exe打包时用的 python 版本一致,经过测试,获得如下表格供参考:
https://www.cnblogs.com/wutou/p/18697270
2.2 exe提取
从python-exe-unpacker里复制pyinstxtractor.py到exe目录
python pyinstxtractor.py 2.exe
demo.exe 是待提取的exe文件
执行完成后,该文件夹下会出现 文件名.exe_extracted 文件夹 (根据不同exe名字不同,会出现xxx.exe_extracted)
三、pyc字节码转 py 文件
uncompyle6 xxx.pyc>xxx.py
或
uncompyle6 -o xxx.py xxx.pyc
如过在命令行或输出的py文件里显示 Unknown magic number 227 in 2.exe_extracted\2.pyc
说明运行入口类共16字节的 magic 和 时间戳被去掉了。
需要增加,继续看下面内容
四、增加 magic 和 时间戳
以下会用到16进制编译,可以用 WinHEX、UltraEdit、Hex Editor Neo、notepad++加插件HEX-Editor、vs等软件,这里以 WinHEX 示例。
前4字节对应Python编译版本表格:
https://www.cnblogs.com/wutou/p/18697264
获取 magic 和 时间戳 的方法:
时间戳可以不用,直接填充00即可,但是 magic 是识别python的版本,所以必须要用到,方法如下
4.1 解包后,从 struct 中获取
4.2 解包后,从 .pyc 中获取
在PYZ-00.pyz_extracted文件夹中任意打开一个 .pyc 文件
4.3 用手头有的python打包出一个exe
用当前版本打包出的exe的头信息填充
免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他风险,后果自负。
参考、来源:
https://zhuanlan.zhihu.com/p/415072339
https://blog.csdn.net/gitblog_09081/article/details/142226269
https://blog.csdn.net/ljx1887103/article/details/128959642
https://blog.csdn.net/u010326269/article/details/121035247 (1.4)
https://blog.csdn.net/weixin_44362969/article/details/105616531 (评论区推荐版本)
https://www.jianshu.com/p/036cbcd20776
https://zhuanlan.zhihu.com/p/599884406 (4.3)