[样本分析] Ramnit感染型病毒
文章目录
样本信息
MD5:ff5e1f27193ce51eec318714ef038bef
类型:exe32
分析工具:DIE、OD、IDA
样本行为
该样本属于Ramnit蠕虫病毒,样本主体会创建傀儡进程(默认浏览器进程)并向其注入病毒DLL,病毒DLL会创建几个线程分别执行功能,包括实现自启动、查询网络连通情况、记录系统时间、向C2(fget-career.com)发送收集到的用户数据、感染磁盘上的exe,dll,html,htm文件、感染可移动磁盘以试图感染更多主机等,感染性极强。
详细分析
拿到样本之后,先拖到DIE中看一下,发现有UPX壳。

脱壳
用UPX直接脱壳:

脱壳成功后,用IDA打开,发现入口处是无意义的函数调用:

这肯定不是真正的入口,在OD中跟踪一下,发现它中途有通过VirtualAlloc申请内存,是个突破点!

在数据窗口中跟随此处申请到的内存(通过硬件断点),发现在此处填充数据后,随后就去执行了。

retn返回之后就到了002C2CA9,之后是一堆jmp混淆。

疯狂F8,中间经过了很多循环(应该是解密),最后跳到了正常的代码段(40开头)。
一看是pushad,盲猜又是个壳,用ESP定律脱壳,就到了真正的入口:

真是不容易啊,一层又一层!!!
样本主体行为
入口处主要有六个行为:

获得默认浏览器路径
查询注册表HKEY_CLASSES_ROOT\http\shell\open\command,获得默认浏览器的路径,如果没有,则用IE浏览器。

创建互斥体
创建互斥体,名称为KyUffTh0kYwRRtgPP,这一步用来确保只有一个病毒实例存在。
自拷贝
判断当前进程名,如果不是DesktopLayer.exe,则拷贝自身到C:\Program Files\Microsoft\DesktopLayer.exe,结束当前进程,启动新进程。

InlineHook
对ZwWriteVirtualMemory函数进行InlineHook,Hook之前要挂起当前进程中的其他线程,Hook完之后恢复。
挂起和恢复线程,用的是同一套代码(通过CreateToolhelp32Snapshot、Thread32First、Thread32Next遍历线程):

具体Hook过程如下:
- 首先通过
GetProcAddress获得OriginalAddress; - 然后通过
VirtualProtect修改OriginalAddress的页面属性为PAGE_EXECUTE_READWRITE; - 然后通过
VirtualAlloc申请一块可提交内存(大小为5+10),用于存放数据; - 保存
OriginalAddress的前五字节,然后把它改成jmp FakeFunc; - 修改完成后,通过
VirtualProtect恢复页面属性;

Hook前后ZwWriteVirtualMemory函数的入口分别为:


创建傀儡进程,注入病毒DLL
创建傀儡进程,即上面获得的默认浏览器进程。

CreateProcessA内部会调用ZwWriteVirtualMemory,因此会进入自定义的钩子函数(00402A59)。
调用堆栈为:

钩子函数行为:


- 调用原函数;
- 获得浏览器进程的EP;

- 将DLL及三个函数注入浏览器进程;
首先在浏览器进程中申请内存,然后展开DLL并将其写入浏览器进程,随后写入三个函数。


展开DLL的过程:

- 修改浏览器进程的EP,使其调用之前写入的第三个函数。

这样,当浏览器进程恢复运行时,会进入Func3函数,它会先调用Fun1初始化DLL的IAT表,然后遍历DLL的节区依次设置节区属性,最后跳到了DLL的EP:

Func1主要是遍历DLL的导入表,依次加载DLL并初始化IAT表:


至此,傀儡进程创建完成。
UnInlineHook
恢复ZwWriteVirtualMemory函数,之前Hook时提前保存了被换掉的那五字节。

到这里,样本主体行为就分析完了,接下来看一下病毒DLL的行为。
病毒DLL行为
在上面分析样本主体时过程中,将病毒DLL dump下来。
DllEntryPoint中创建了五个线程来实现不同的功能,随后开始感染磁盘上的exe、dll、html、htm文件以及可移动磁盘。

线程1
设置注册表项HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon下的Userinit,以实现开机自启动。并且每隔一段时间就会设置一次。


线程2
尝试连接google.com、bing.com、yahoo.com,以测试网络的连通性。

具体是通过套接字来测试的:


线程3
创建dmlconf.dat文件,写入当前系统时间。

线程4
连接fget-career.com,并向其发送收集到的用户数据。

- 首先通过套接字绑定并监听
4678端口:

- 然后创建线程来连接
fget-career.com并收发数据。

线程5
从fget-career.com上下载文件并运行。
开始感染
sub_1000749F函数内部创建了两个线程来感染,分别感染磁盘上的文件以及将自身复制到可移动磁盘,尝试感染更多主机。

- 遍历磁盘,感染文件,感染的总体思路都是将自身写入目标文件。遍历的时候会跳过System目录和Windows目录下的文件。


- 对于exe和dll文件,会先做一系列的判断,满足是未签名的PE32、没有".rmnet"节、有LoadLibraryA和GetProcAddress函数,才会开始感染。具体的感染手段是在文件末尾新增一个
.rmnet节,并写入sub_10006F2C函数和病毒样本。


- 对于html和htm文件,会读取文件数据并匹配,看文件末尾是不是
</SCRIPT>,若不是则写入VB脚本,脚本会将病毒样本写入目标文件。


- 感染可移动磁盘。首先遍历磁盘,满足是可移动磁盘、磁盘上有可用空间、暂未被感染三个条件则开始感染。

具体感染过程为:在可移动磁盘的根目录下创建目录RECYCLER\S-x-x-xx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxx,在其下创建xxxxxxxx.exe并写入病毒数据。另外在磁盘根目录下创建autorun.inf文件,并写入四段数据,其中第三段数据的作用是,当打开磁盘时自动运行xxxxxxxx.exe,即病毒样本。



最终总结
好像感染型病毒总体来说都差不了太多,都会将病毒样本写入目标文件并设法让其运行。对于PE文件来说,最常用的就是新增节,修改EP到节区首地址,然后将病毒数据写入新增节区,中间涉及到基址重定位和重建导入表的一些内容,需要分析者对PE文件结构很熟悉。对于其他类型的文件,以html为例,在文件末尾写入脚本来将病毒数据写入目标。其他类型的文件暂时没有接触到,后续分析遇到时再总结,就先到这里吧!