[样本分析初体验] 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文件,如此反复,感染性极强。