赞
踩
python 可通过pyinstaller 以及py2exe 编译脚本为exe,下面主要针对这两种方式生成的exe进行反编译。
提取过程python版本要与实际脚本的python版本一致,python版本可用16进制工具查看exe文件。
有个开源脚本pyinstxtractor 可以把exe 转成pyc文件,另外还有个pyi-archive_viewer 也可以用,不过每次只能处理一个文件,不如pyinstxtractor 好用。
在线网站可转
http://tools.bugscaner.com/decompyle/
https://www.lddgo.net/string/pyc-compile-decompile
第三方库 uncompyle6
pip install uncompyle6
第三方库 pycdc
uncompyle 对python3.10 以上版本支持不太好,可换为pycdc
# 安装过程 git clone https://github.com/zrax/pycdc.git cmake . make ./pycdc pycfile # 遇到错误:Unsupported opcode: JUMP_IF_NOT_EXC_MATCH #查找资料,看雪上有人给出了解决办法 https://www.52pojie.cn/thread-1649244-1-1.html # 找到源码 ASTree.cpp 查找Unsupported opcode #添加以下代码 ``` case` `Pyc::JUMP_IF_NOT_EXC_MATCH_A: case` `Pyc::RERAISE_A: case` `Pyc::WITH_EXCEPT_START: ``break``; ``` #临时解决而已。
2.2.1 工具直接反编译
github 有个比较老的工具了,python-exe-unpacker,集合了pyinstxtractor和py2exe,可以先试试。
2.2.2 手工解包
Py2exe打包的exe程序有三部分组成,分别是PYTHONxx.dll(xx是版本号,比如27), PYTHONSCRIPT, library.zip。PYTHON27.dll应该就是python的运行环境了。PYTHONSCRIPT是程序开始执行的入口,如main函数。libarary.zip中是程序用到的库文件,包括自带的库和用户自己写的库文件。 破解程序的时候需要处理的文件就是PYTHONSCRIPT和library.zip。
使用Py2exe Bynary Editor(以下简称pbe) 可以简单的将Py2exe打包的程序dump成原来的三个文件,也可以将修改后的文件再打包回去。使用界面如图。
针对library.zip 中的文件可直接用uncompyle6反编译一般不会有什么问题。
针对 PYTHONSCRIPT,则需要先进行一些处理
获取code bytes
用二进制编辑软件去除文件头和最后的两个0字节去掉。
//文件头结构
struct Header
{ int tag; // Size: 4 bytes
int optimize; // Size: 4 bytes
int unbuffered; // Size: 4 bytes
int data_bytes; // Size: 4 bytes
char zippath[VARIABLE_SIZE] // Size: variable
};
把code对象转换成pyo文件(Linux)
import marshal
mylist=marshal.load(open("xxx", "r"))
print mylist
marshal.dump(mylist[2], open("main.pyo","w"))
修补文件头
用 WinHex 加上 8 个字节的 file header。前 4 个字节代表 Python 版本号,后 4 个字节是 timestamp,可以打开另外一个pyo文件将前 8 个字节复制过去(图中阴影部分)。(必须与library.zip中pyo的前8个字节保持一致)。
反编译pyo文件
uncompyle6反编译
现象是 pyinstxtractor提取失败 ,显示
“Error : Unsupported pyinstaller version or not a pyinstaller archive”
来到pyinstxtractor代码的第50行,原来代码逻辑是这样的,一旦读取不到MAGIC,就会报错,提示不是pyinstaller打包程序。
网上追溯,可以看到标识MAGIC为 ‘ MEI\xxxxxx ’,2.0版本的MAGIC位于 [end - 24] 处,2.1版本的MAGIC位于 [end - 88] 处。
我们在 ‘MEI’ 后面发现了python27.dll,这个就是pylibname,看来这个是pyinstaller2.1打包的,所以我们就删除从’MEI’+88之后的所有垃圾数据。删除后的结果如下:
修复后,可以正常转换了。
3.2 无pyc头部数据异常
有时候遇到pyinstxtractor 反编译出来的文件缺少pyc头,由4字节的magic和4字节的时间戳组成,其中magic会因为python版本的不同而不同,此时查找其他成功的文件,复制一个pyc头部。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。