[样本分析初体验] Parite家族感染型病毒
样本信息
MD5:b4964c8ac85b1e428c9eefe572237b21
类型:exe32
分析工具:DIE、OD、x32dbg、IDA
样本行为
该样本是感染性极强的病毒,属于Parite家族,其运行后会先解密并运行一段ShellCode,ShellCode会解密文件末尾的病毒DLL并通过SetWindowsHookExA将其注入explorer进程,创建新线程来感染本地磁盘和网络资源中的exe文件和scr文件。
详细分析
病毒主体
拿到病毒样本之后,先拖到DIE中看一下,发现它是32位的exe文件,C++写的,无壳。

解密ShellCode
拖到IDA里,发现没解析出个啥,再拖到OD里,入口是:

可以发现,一上来是个循环,这其实是个解密:

我们在数据窗口看一下解密前的数据:

再看一下解密后的:

ShellCode主体
然后 call 进入0066519C,这其实是一段ShellCode。主要有四个行为:

- 上来的第一个函数,获得了
Kernel32.dll中一系列函数的地址。先LoadLibraryA,然后GetProcAddress。 - 查询注册表键值,
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer中PINF的值,如果查询失败则继续第三步。


- 在Temp目录中释放一个
.tmp文件,文件名是随机字符串。经查验,该tmp文件实质上是个DLL,具体释放过程如下:
- 首先
GetModuleFileNameA获得当前进程完整路径,然后CreateFileA获得文件句柄(0x94)。

- 然后生成一个随机文件名,并创建文件,句柄为0x98。

SetFilePointer设置进程文件的文件指针,位置为0x243AFC;然后ReadFile循环从进程文件中读数据,每次读的大小为0x2800。数据窗口中显示的是读出来的数据。

- 随后调用的一个解密函数,解密后的数据一看就很明显了,是PE文件。然后将解密后的数据写入tmp文件。

- 重复读写,直到完成,总大小为
2B000。
- 加载该DLL文件,并运行其导出函数
Initiate。

Initiate函数的行为:
检测互斥体Residented是否存在,不存在的话,通过SetWindowsHookExA设置消息钩子,消息类型为WH_CALLWNDPROC,钩子子程为DLL的导出函数AttachHook。
这样,当有进程产生WH_CALLWNDPROC消息时,DLL就会被注入到该进程中。

病毒主体的分析到这里就差不多结束了,接下来看一下释放的病毒DLL的行为。
病毒DLL
拖到DIE中看了下,发现有UPX壳。

脱壳
用UPX直接脱壳,但是失败了。

那就手动脱一下壳吧,这里用的是ESP定律。先拖到OD里看看:

运行完pushad这一句时,ESP变红,右键空白处,点击HW break[ESP]。

然后F9继续运行,断点断到这里:

F8走一步就找到OEP了。

最后显示:

也不知道为什么?后面同事给指了条明路,改用x32dbg。进来之后首先进入的是系统函数:

继续运行,找到pushad后,然后还是用ESP定律,最终找到OEP:

点击最上方插件->Scylla,弹出窗口,先点击Pick DLL选择目标LL,然后在下面的编辑框输入真正的OEP地址,然后依次点击IAT Autosearch、Get Imports、Dump,Fix Dump按钮。

将脱壳后的文件拖入DIE,发现脱壳成功。脱壳成功后就可以通过IDA看源代码了,有源码再结合OD动态调试会更方便一点。

DllEntryPoint
病毒Dll在入口处会先判断当前进程是不是explorer进程,它只对explorer进程进行操作。

主要功能是在sub_2F1B5C中实现,其行为有:

- 创建互斥体
Residented; - 加载自身DLL;
- 删除temp目录下的
.tmp文件,被占用的除外; - 将自身路径写入注册表
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer中的PINF; - SetWindowsHookExA挂钩当前线程,钩子类型还是
WH_CALLWNDPROC;



- 创建感染线程,线程回调函数为sub_2F5778()。

线程回调函数中,主要就是遍历磁盘和网络资源,感染.exe文件和.scr文件。但是不会感染C:\Windows\system32\dllcache\下的文件以及readbook.exe、rundll32.exe。
- 遍历磁盘:

- 遍历网络资源:

感染过程
真正对文件进行感染的函数是sub_2F2C7C(),这块分析需要对PE文件结构很熟悉,下面直接放IDA中的代码分析。

接下来挨个看一下其中的各个子功能:
- 判断目标文件是否有PE头。

- 读取目标文件的节表以及后面0x28字节的内容,为后续新增节做准备。

- 判断目标文件是否已经被感染,即看最后一个节表头中节区名称是否符合条件。

- 随机生成新增节的名称,生成算法如下,上面判断的算法也是由此而来。

- 修正新增节表头中的数据成员。

- 构造解密代码,后续会将其写入新增节的开头,作为目标文件新的EP。
- 判断目标文件是否具备感染条件,即看其导入表中有没有
kernel32.dll,如果有则Hook其IAT和INT。


- 将新的头部信息和节表信息写入目标文件(新增节后需要修改部分头部信息)。

- 将解密函数写到新增节的开头,即新的EP。

- 将原文件的各种信息(0x84字节)、ShellCode(0x540字节)以及ShellCode要用到的字符串信息(0xFE字节),进行加密后写入目标文件。

- 随后写入关键函数的名称,
LoadLibraryA()和GetProcAddress()。


- 最后将病毒DLL加密后写入目标文件末尾。

总结分析
最后发现,我们分析的样本其实就是一个被感染的exe文件,感染的过程其实就是在原文件的基础上新增一个节,并将EP改成新增节的开头,依次写入解密代码、加密后的文件信息、加密后的ShellCode及其用到的字符串、加密后的病毒DLL。
这样在运行被感染后的文件时,会先运行解密代码,然后运行解密出的ShellCode,ShellCode会解密文件末尾的病毒DLL,把它释放到temp目录,然后加载它并运行其导出函数Initiate,Initiate中通过SetWindowsHookExA设置消息钩子,当有进程产生WH_CALLWNDPROC消息时,DLL会被强制注入到该进程中,但它自身会做检查,只对explorer进程有效。在explorer进程中它会创建新线程来感染本地磁盘或网络资源中的exe文件和scr文件,如此反复,感染性极强。