python逆向实战:反编译pyinstaller打包生成的exe
python逆向实战:反编译pyinstaller打包生成的exe
-
今天要逆向的软件叫
you-dl.exe
,它是一个pyinstaller
生成的exe,它原本的名字和图标因为版权问题不能放出来了
-
首先下载
pyinstxtractor.py
,github
可下,然后在运行pyinstxtractor.py you-dl.exe
(记得下pyhton
)指令.
为了避免被反编译,会进行一些混淆,使得pyinstxtractor
转换出错。如下这个文件,使用pyinstxtractor.py
进行转换时会报错,“Error : Unsupported pyinstaller
version or not a pyinstaller
archive”,意思就是说这不是一个pyinstaller
打包的文件。
- 查看
pyinstxtractor
源码发现它会在文件末尾检测有没有MAGIC
字段,没有找到就会报错
往上追溯,可以看到标识MAGIC为 MEI\xxxxxx
,2.0版本的MAGIC位于 [end - 24] 处,2.1版本的MAGIC位于 [end - 88] 处。
而当我们查看文件的二进制时,发现文件末尾都是些垃圾数据,根本没有 ‘MEI’ 标识
我们搜索一下,终于在上面的一个位置找到了MAGIC,这个就是pyinstaller
标识。接下来就是要把垃圾数据去除掉,使MAGIC位于24或88的位置,那到底是24还是88呢?(该文件是pyinstaller2.0
还是pyinstaller2.1
打包的),这就得看下2.0和2.1的区别了。与2.0相比,2.1多了64字节的pylibname
,那我们就看看该文件里存不存在pylibname
。这里找到了python37.dll
明显是2.1
-
我们就删除从’MEI’+88之后的所有垃圾数据。删除后的结果如下:
修复后,可以正常转换了
- 但是我们打开解析后的文件夹
you-dl.exe_extracted
,发现PYZ-00.pyz_extracted
是空的,PYZ-00.pyz_extracted
非常重要,一般一个稍微大一点的项目都会分成多个py
文件,甚至会依赖其他模块,这些被依赖的文件解析后都会放入PYZ-00.pyz_extracted
中,可以说这里放的是核心代码。
- 我们查看
pyinstxtractor
源码,发现它会检测PYZ-00.pyz
的4到8个字节是否为MAGIC_NUMBER
,而这个变量的值是由python
的版本确定的,由第4步可知这个软件是由python3.7
解释的
- 我下载了
python3.7
,使用它运行了pyinstxtractor.py
,然后就可以正常解析了
哈哈,这个软件使用了youtube-dl
框架.然后就是反编译pyc
文件了,这个使用uncompyle6
即可,这个工具网上有很多资料,我就不画蛇添足了。