Python打包exe反编译还原成源码pyinstxtractor.py uncompyle6 pycdcDecompyle++

前言全局说明

打包好的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)
image
下图,图标表示带命令行
image

1.5 在线pyc转py

无限制:https://rivers.chaitin.cn/tools/pyc2py
有限制:https://tool.lu/pyc/


二、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文件

image

执行完成后,该文件夹下会出现 文件名.exe_extracted 文件夹 (根据不同exe名字不同,会出现xxx.exe_extracted)
image


三、pyc字节码转 py 文件

3.1 uncompyle6 方法

uncompyle6 xxx.pyc>xxx.py

uncompyle6 -o xxx.py xxx.pyc

如过在命令行或输出的py文件里显示 Unknown magic number 227 in 2.exe_extracted\2.pyc
说明运行入口类共16字节的 magic 和 时间戳被去掉了。
需要增加,继续看下面内容
注意uncompyle6有版本限制为1.4, 2.1-2.7, and 3.0-3.8

3.2 pycdc 方法

pycdc(也叫Decompyle++)
获取pycdc工具可以去Github手动下载pycdc安装包(但程序需要编译):https://github.com/zrax/pycdc


四、增加 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的头信息填充


五、插入数值

修改前,备份数据
修改前,备份数据
修改前,备份数据

5.1 编辑-粘贴0字节

image

5.2 插入12字节00

image


六、报错:

字节码还原源码不成功的可能性:
1.不同版本补充的 magic 和 时间戳 长度不同。
2.python 打包还原时 版本不一致
3.python 打包还原时 32位 或 64位 不一致

6.1 报错1:

D:\2>uncompyle6 2.exe_extracted_3913\2.pyc >2.py
# Unsupported bytecode in file 2.exe_extracted_3913\2.pyc
# Unsupported Python version, 3.9.0, for decompilation

image



免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他风险,后果自负。




参考、来源:
https://zhuanlan.zhihu.com/p/415072339 (1.5)
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)
https://www.cnblogs.com/demo41/p/18226496 (1.5、3.2)
https://blog.csdn.net/Myon5/article/details/134538103
https://www.cnblogs.com/hhdom/p/18261105
https://blog.csdn.net/qq_41273999/article/details/139420400 (3.2)



posted @   悟透  阅读(446)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
历史上的今天:
2021-02-05 VMware虚拟机 指定的文件不是虚拟磁盘 打不开磁盘 vmdk或它所依赖的某个快照磁盘。 模块“Disk”启动失败。 未能启动虚拟机。
2021-02-05 Windows不分区VHD装Linux多系统(六):优化 & 安装NVIDIA 920MX独显驱动
点击右上角即可分享
微信分享提示