0x00前言
Ramnit 蠕虫是一种通过可移动驱动器传播的蠕虫。该蠕虫还可以作为后门,允许远程攻击者访问受感染的计算机,通常会寄生在用户的浏览器中,难以察觉,因此每天都有数以万计的用户受其困扰。
分析工具:PEID、火绒剑、IDA、OD
分析环境:Win7 x86 Vmware
0x01样本信息
File name DesktopLayer.exe
File Size 55 KB
File Type Win32 EXE
File Version:106.42.7
MD5: FF5E1F27193CE51EEC318714EF038BEF
SHA1: B4FA74A6F4DAB3A7BA702B6C8C129F889DB32CA6
CRC32: 40C57347
Packers: UPX 2.90
0x02样本分析
一、 脱壳
1.一层脱壳
样本被加了UPX 2.90壳。UPX壳最主要的目的是减小程序的体积,其特点是较高的压缩率和较快的解压速率,与TMD、VMP这类壳的设计理念完全不同,直接手动脱壳就可以了,其脱壳后的入口点模样如下:
2.二层脱壳
脱壳之后的跳转点并非OEP样本仍然压缩了大量的代码,深入分析之后,可以判断为是变形UPX壳。该变型壳首先解码UPX解码部分的代码,然后利用UPX的解码代码再次解码恶意功能的代码。解码代码解码完成后,会跳入该地址第二层的UPX继续执行,等二层UPX完成其解码之后,可以再次Dump,其最终的入口点如下:
二、 第一次执行分析
首先是获取测试机的默认浏览器及其位置,其获取方式是查找注册表中,HKCR\http\shell\open\command
的键值:
此处默认的浏览器为C:\Program Files\Google\Chrome\Application\chrome.exe。而后会通过FindFirstFile()函数判断是否存在该文件如果不存在,那么会在几个默认位置进行查找使用IE浏览器(后期用来进行进程注入),如果两个方法都失败,就会退出程序:
接下来会创建互斥体,检验KyUffThOkYwRRtgPP 是否已经存在来保证同一时间只有一个实例在运行:
通过GetModuleFileName()函数获取自身执行体所在位置和文件名,将自身执行体的文件名与DesktopLayer.exe比较,然后会在C:\Program Files目录下,创建Microsoft文件夹。并将Csrv.exe重命名为DesktopLayer.exe,并复制到C:\Program Files\Microsoft文件夹下最后,调用CreateProcess()创建该进程:
创建该进程之后,程序就调用ExitProcess()退出了。
三、 第二次执行分析
通过比较确认名称为DesktopLayer.exe,程序改变了执行流程。将会对ntdll.dll中的ZwWriteVirtualMemory ()进行Hook操作:
调用CreateProcess()函数,启动根据通过查询注册表找到的chrome.exe进程:
Createprocess()函数内部会调用ZwWriteVirtualMemory()函数,从而执行其经过Hook的代码:
四、 HookCode执行分析
HookCode完成正常的WriteVirtualMemory()函数功能,通过ReadProcessMemory()函数获取chrome.exe进程的内存信息, 根据读取到的内存可以找到后续对chrome.exe的hook点。 然后自身进程内,解码出rmnsoft.dll,手动加载,并根据导入表和重定位表进行相应的操作:
五、rmnsoft.dll分析
将DLL从内存中Ddump出来。由于该DLL并未有混淆或者加壳等措施,且程序结构比较清晰,易于分析,实现以下功能:
Sub_10007ACA:将自身文件路径写入注册表SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit,实现自启动。
Sub_1000781F:在C:\Program Files\Google\Chrome\Application下创建 dmlconf.dat 文件,并写入 FILETIME 结构体数据。
Sub_10005906:监听 4678 端口,等待连接。收到连接后会接受命令并执行对应的操作。疑似后门,用来接收攻击者的命令.
Sub_1000749F:此函数中会创建两个线程。感染可移动介质及文件,他会将自身写入到可移动介质,并在目录下创建 autorun.ini 文件,在PE文件中写入一个 PE 文件;
0x03总结
分析比较仓促,应该遗留了不少东西,DesktopLayer.exe为样本主要是通过Hook ZwWriteVirtualMemory()函数,然后在启动默认浏览器进程的的时候运行HookCode,直接将所有相关的代码和数据直接写到被注入的进程空间中。其注入的DLL只在内存中出现,具有一定的隐蔽性。