本帖最后由 是昔流芳 于 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
这样直接开OD,断在OnInitDialog就可以了
这里有必要说明一下,在Dialog创建之前,也是可能存在恶意代码的
由于在IDA中看到了恶意代码是在OnInitDialog开始的,所以才这么断的。。
bp 4013a0
来到下面的位置
接下来几段的MENU和SendMessage不用看
00401430 |. 50 push eax
00401431 |. 6A 00 push 0
00401433 |. 68 80000000 push 80
00401438 |. 51 push ecx
00401439 |. FFD3 call ebx
====================================幽灵之忽略的分割线=====================================
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
0040144B |. 68 A4C24200 push 0042C2A4
判断虚拟机
跟进 0040143B 这个CALL看一看
00401140 push ebp
00401141 mov ebp, esp
00401143 push -1
00401145 push 004236B0
0040114A push 00409E1C
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
0040117B mov dx, 5658
0040117F in eax, dx
00401180 cmp ebx, 564D5868
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
0040144B push 0042C2A4
00401450 jmp short 00401485
00401452 call 004011D0
00401457 test eax, eax
00401459 je short 00401469
0040145B push 0
0040145D push 0042C114
00401462 push 0042C27C
00401467 jmp short 00401485
00401469 call 00401250
0040146E test eax, eax
00401470 push 0
00401472 push 0042C114
00401477 je short 00401480
00401479 push 0042C250
0040147E jmp short 00401485
00401480 push 0042C21C
00401485 mov ecx, esi
00401487 call 00419B92
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
004014A2 call dword ptr [<&KERNEL32.GetSystemT>
004014A8 lea eax, dword ptr [ebp-34]
004014AB mov word ptr [ebp-34], 833
004014B1 push eax
004014B2 call dword ptr [<&KERNEL32.SetSystemT>
004014B8 lea ecx, dword ptr [ebp-34]
004014BB push ecx
004014BC call dword ptr [<&KERNEL32.SetLocalTi>
004014C2 push 0
004014C4 push 0042C114
004014C9 push 0042C1EC
004014CE mov ecx, esi
004014D0 call 00419B92
下面就看关键的地方
0040159A |push 80
0040159F |push eax
004015A0 |call dword ptr [<&KERNEL32.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
004015BD |call dword ptr [<&KERNEL32.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
004015E5 lea ecx, dword ptr [ebp-50]
004015E8 call 00402371
004015ED test eax, eax
004015EF je 004016D5
。
。
。
。
0040166C push 0
0040166E push 0042C114
00401673 push 0042C174
00401678 mov ecx, esi
0040167A call 00419B92
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
00401692 push eax
00401693 call dword ptr [<&KERNEL32.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
004016B0 call dword ptr [<&KERNEL32.DeleteFileA>]
004016B6 lea ecx, dword ptr [ebp-24]
004016B9 call 00417E02
004016BE push 0042C154
004016C3 call 00409EF4
004016C8 push 0042C124
004016CD call 00409EF4
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
然后发现是大段的数学计算。。。。呃,那就到此为止吧 |