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,然后就可以正常解析了