概述

由python打包的exe文件在IDA中不方便直接分析,需要先对文件解包然后再进行详细分析,这里做一个简单的记录。

反编译pyc

原始样本md5:ef3a4697773f84850fe1a086db8edfe0

从VT的图标上可以看出来是pyc打包的exe程序:
image.png

一般来说,pyc打包的程序都会比较大,目前视野范围内看到的基本上都是6M以上的,整体来说比golang的还要大一些。在分析golang样本时,我们可以根据golang独特的入口点快速反应过来目标样本的类型,避免浪费时间。golang样本的默认入口点一般如下,会通过cpuid进行一个系统检测
image.png

但是pyc打包的exe相对来说入口点就没有这么明显的特征,如果在分析样本时,忽略了这是个pyc打包的样本,那么可能会浪费大量的时间和精力分析到框架代码中
image.png

一个较为简单的做法是自己编写一个yara,在yara中定义一些编译器的显式特征,如Delphi、MFS、Golang、Autoit、Python,在分析样本之前先用yara扫描一下,避免分析到框架代码中。稍微麻烦但是更为有效的方法是自己写一个文件解析器,在处理样本前先进行字符串扫描、文件类型识别、自动解包等操作,但是这个对文件结构的要求较高。

回到上面的话题,pyc打包的样本,可以通过字符串信息进行识别
image.png

此时可以使用archive_viewer.py 和 pyinstxtractor.py 两款工具对exe进行解包
archive_viewer.py
pyinstxtractor.py
(具体有哪些依赖忘记了,印象中好像只需要安装PyInstaller,根据提示安装依赖,直接pip install PyInstaller即可)

两个py文件功能大同小异,先来说说archive_viewer.py,使用方法如下
python archive_viewer.py
image.png

使用archive_viewer.py 解析出了很多个文件,下一个目标就是在里面找到真实的pyc,这里可以使用010这类十六进制工具加载原始样本,然后跳到样本最后,找.exe文件名,通常来说,pyc打包成exe之后,pyc的文件名会在文件末尾,这里是 i_new.exe
image.png

有了这个关键信息,就可以回到刚才的命令行窗口中,用x i_new 命令提取该脚本
image.png

需要注意,要还原pyc,还需要用同样的方法提取struct文件
x struct
image.png

struct文件中记录了pyc编译时的一些基本信息。

当然,也可以额直接用pyinstxtractor.py直接将文件dump出来
image.png

此时再用010加载上面dump出来的i_new.pyc和struct,快捷键
ctrl shift + c 复制struct的前八个字节的hex数据
image.png

回到i_new.pyc的头部,Ctrl + Shift + I 快捷键插入8个字节的数据,然后将刚才复制的头部信息粘贴过来(快捷键 Ctrl + Shift +V):
image.png

保存该pyc文件,然后通过在线网址:https://tool.lu/pyc 或者本地工具进行解包
通过在线工具解包:
image.png

通过本地工具解包:
Easy Python Decompiler v1.3.2.7z
image.png