在看雪注册了好久了,一直处于潜水阶段,很多时候看到好贴子,想下载附件学习。苦于临时二字。
这周末刚好闲着,就用一个菜鸟的眼光,分析一个病毒好了。希望能借此转正。如果没有成功,或许是我的能力还没有达到看雪的最低要求,继续努力。抑或是总潜水,对论坛的贡献不够。以后会改正的。


不废话了。

前两天上数据库课,由于家中的事情,耽误了很多课程,索性找到老师拷了课件,准备回去看看,课打开U盘,傻眼了,4个系统、只读属性的陌生程序, wsctf.exe   EXPLORER.exe auto.exe  SysAnti.exe看名字一个比一个邪恶,估计都不是什么好东西。
  刚好到周末了,拿出一个auto.exe稍微分析一下,由于本人,也是才入看雪,菜鸟一个。有什么问题,也请您谅解,多多指出。

先用PEID查壳。ASPack 2.12 -> Alexey Solodovnikov [Overlay]

如果没有变形,这个ASPack2.12还是很好脱得。
在OD里面ESP定律尝试一下,到达OEP。
PEID再看一下,这次看到病毒是用VC++写的。

下面就先载入IDA大概了解一下病毒程序的流程。
因为是新手,所以我把最近学习到的东西,都写上一点,也给自己加深一下记忆。

.text:00401000 ; Input MD5   : 31166CBED8689B31956DC95FE02C8333
.text:00401000 ; File Name   : C:\Documents and Settings\Administrator\桌面\unpack_virus.exe
.text:00401000 ; Format      : Portable executable for 80386 (PE)
.text:00401000 ; Imagebase   : 400000
.text:00401000 ; Virtual size   : 00002000 (8192.)
.text:00401000 ; OS type         :  MS Windows
.text:00401000 ; Application type:  Executable 32bit
.text:00401000
.text:00401000                 .686p
.text:00401000                 .mmx
.text:00401000                 .model flat

.text:00401000 ; ======================================================================
.text:00401000 ; Segment permissions: Read/Write
.text:00401000                 assume cs:_text
.text:00401000             assume es:nothing, ss:nothing, ds:_data, fs:nothing, gs:nothing
  
  首先这是个80386下的PE格式文件,映像基址为0x00400000,一般在Win NT中,这个基址是默认的。系统为MS Windows,应用程序类型32bit,CPU为686P的指令系统,4GB的平坦模式。这些都是最基本的,大体上,没什么说的。

  下面,是汇编中,对段寄存器的设置只定义了代码段,数据段。

OK下面就是对程序部分开始进行一些简单的分析了。

首先通过GetSystemTime得到系统时间,之后修改系统时间。(估计是为了废掉卡巴,可能是个老病毒了,毕竟学校机器都是N久不动得了)
.text:0040104F                 lea     eax, [ebp+SystemTime]
.text:00401052                 push    eax             ; lpSystemTime
.text:00401053                 call    ds:GetSystemTime
.text:00401059                 cmp     [ebp+SystemTime.wYear], 7D5h
.text:0040105F                 jbe     short loc_401071
.text:00401061                 lea     eax, [ebp+SystemTime]
.text:00401064                 mov     [ebp+SystemTime.wYear], 7D5h
.text:0040106A                 push    eax             ; lpSystemTime
.text:0040106B                 call    ds:SetSystemTime

 

  之后是一段时间的Sleep
  下面发现了一个FindWindowExA函数,查找一个名为卡巴斯?的进行匹配。(目的昭然若揭,在这个下面还调用了一个PostMessageA,将结束avp.exe进程的消息传递到消息队列中,还是为了卡巴而生)
.text:004010A2                 push    offset szWindow ; "卡巴斯?
.text:004010A7                 push    ebx             ; lpszClass
.text:004010A8                 push    ebx             ; hWndChildAfter
.text:004010A9                 push    ebx             ; hWndParent
.text:004010AA                 call    ds:FindWindowExA
  
  


下面又开始Sleep
.text:004010C2                 push    edi             ; dwMilliseconds
.text:004010C3                 call    esi ; Sleep


  通过GetModuleFileNameA 获得当前文件路径,通过GetSystemDirectoryA获得系统路径。再往下看,会释放一些东西。 ProcName ; "LoadLibraryA"     ModuleName ; "kernel32"

.text:00401100                 push    0FFh            ; nSize
.text:00401105                 push    eax             ; lpFilename
.text:00401106                 push    0               ; hModule
.text:00401108                 call    ds:GetModuleFileNameA
.text:0040110E                 lea     eax, [ebp+sz]
.text:00401114                 push    0FEh            ; uSize
.text:00401119                 push    eax             ; lpBuffer
.text:0040111A                 call    ds:GetSystemDirectoryA


  后面通过lstrcpy   lstrcat   lstrlen   lstrcmp来释放一个del.bat来达到运行kowin.exe和删除自身的目的。
.text:0040115B                 push    offset aDel_bat ; "del.bat"
.text:0040116D                 push    offset aKowin_exe ; "kowin.exe"

.text:004011C5                 push    40000000h       ; dwDesiredAccess
.text:004011CA                 push    eax             ; lpFileName
.text:004011CB                 call    ds:CreateFileA


.text:00401236                 push    eax             ; lpBuffer
.text:00401237                 push    [ebp+hObject]   ; hFile
.text:0040123A                 call    edi ; WriteFile


.text:004013A2                 push    [ebp+hObject]   ; hObject
.text:004013A5                 call    ds:CloseHandle
.text:004013AB                 lea     eax, [ebp+CmdLine]
.text:004013B1                 push    0               ; uCmdShow
.text:004013B3                 push    eax             ; lpCmdLine
.text:004013B4                 call    ds:WinExec


把这个进程名字压入堆栈,之后怎么调用我不太知道,但根据病毒的特征,应当是插入进程,来达到,跟随系统启动自身的目的。
.text:004014C6                 push    offset aWinlogon_exe ; "winlogon.exe"

  下面开始的创建自身服务。
.text:0040151E                 push    offset ServiceStatus ; lpServiceStatus
.text:00401523                 xor     eax, eax
.text:00401525                 push    hServiceStatus  ; hServiceStatus
.text:0040152B                 mov     ServiceStatus.dwWin32ExitCode, eax
.text:00401530                 mov     ServiceStatus.dwCurrentState, 1
.text:0040153A                 mov     ServiceStatus.dwCheckPoint, eax
.text:0040153F                 mov     ServiceStatus.dwWaitHint, eax
.text:00401544                 call    ds:SetServiceStatus
.text:0040154A                 test    eax, eax
.text:0040154C                 jnz     short locret_401554
.text:0040154E                 jmp     ds:GetLastError


.text:00401561                 push    offset ServiceName ; "kowin"
.text:00401566                 mov     ServiceStatus.dwServiceType, 30h
.text:00401570                 mov     ServiceStatus.dwCurrentState, 2
.text:0040157A                 mov     ServiceStatus.dwControlsAccepted, 3
.text:00401584                 mov     ServiceStatus.dwWin32ExitCode, edi
.text:0040158A                 mov     ServiceStatus.dwServiceSpecificExitCode, edi
.text:00401590                 mov     ServiceStatus.dwCheckPoint, edi
.text:00401596                 mov     ServiceStatus.dwWaitHint, edi
.text:0040159C                 call    ds:RegisterServiceCtrlHandlerA

  在这段代码之前,病毒还根据之前获得系统路径释放两个文件exe 和 dll。
  并在各个盘符下释放一个auto.exe 和 auotrun.inf,达到感染U盘的目的。

  下面这段,是通过ShellExecute来启动资源管理器,explorer.exe 进而插入其中。
.text:00401AEC                 push    esi             ; nShowCmd
.text:00401AED                 push    0               ; lpDirectory
.text:00401AEF                 push    eax             ; lpParameters
.text:00401AF0                 push    offset File     ; "explorer.exe"
.text:00401AF5                 push    offset Operation ; "open"
.text:00401AFA                 push    0               ; hwnd
.text:00401AFC                 call    ds:ShellExecuteA


  这一小段显示了在服务中,启动病毒程序的参数, -k
.text:00401B42                 push    offset SubStr   ; "-k"
.text:00401B47                 push    [ebp+Str]       ; Str
.text:00401B4A                 call    strstr


后面还是一大段的Sleep,这个病毒中Sleep用的很多,以后遇到就不说。


  下面使用RegCreateKeyExA来对注册表进行操作,由于IDA是静态的,所以,只能做到这样,等下用OD,看能不能跟出来注册表的键位。原因还是自己才学习,很多东西,不懂。望见谅。
.text:00401CD8                 push    esi             ; lpdwDisposition
.text:00401CD9                 push    eax             ; phkResult
.text:00401CDA                 push    esi             ; lpSecurityAttributes
.text:00401CDB                 push    0F003Fh         ; samDesired
.text:00401CE0                 mov     edi, ds:RegCreateKeyExA
…..
…..
.text:00401D12                 push    [ebp+hKey]      ; hKey
.text:00401D15                 call    ds:RegCloseKey


  先将eax清零,之后通过GetVolumeInformation获得C盘的盘区信息。由于是静态的,所以这应当是个子程序,在之前的某个时刻就调用了。
.text:00401DEA                 xor     eax, eax
.text:00401DEC                 push    0Ah             ; nFileSystemNameSize
.text:00401DEE                 push    eax             ; lpFileSystemNameBuffer
.text:00401DEF                 push    eax             ; lpFileSystemFlags
.text:00401DF0                 lea     ecx, [ebp+VolumeSerialNumber]
.text:00401DF3                 push    eax             ; lpMaximumComponentLength
.text:00401DF4                 push    ecx             ; lpVolumeSerialNumber
.text:00401DF5                 push    0Ch             ; nVolumeNameSize
.text:00401DF7                 push    eax             ; lpVolumeNameBuffer
.text:00401DF8                 push    offset RootPathName ; "c:\\"
.text:00401DFD                 call    ds:GetVolumeInformationA


WriteProcessMemory
GetProcAddress
CreateRemoteThread
GetProcAddress
FreeLibrary
之后就是这几个病毒特有函数的的使用,基本完毕。


这样通过IDA走了一遍,大概知道这个病毒的流程还有动作。下面在虚拟机里面实体测试一下。



通过上面的截图,基本验证之前在IDA里的判断,还有System Repair Engineer的扫描日志。
(我个人两个浏览器chrome,还有世界之窗,用chrome编辑的图片,别人看到是红叉,这里就不上图了,我把图片链接放最底下)

下面就写下病毒的基本动作:
获取C盘的磁盘信息,获取系统盘路径,进而向system32下写入一个dll 和 一个exe 这两个的名字是一个随机的8位数,至于通过磁盘信息算出的8位数的算法, 由于个人是新手,分析不出来。之后dll插入系统的winlogon.exe进程。
而后,检测卡巴斯基,如果检测到了,通过修改时间过卡巴。(这里我通过C写了一个窗口名为卡巴斯基,进程名为avp.exe的东西,但病毒貌似不管这个,估计我的小程序,还是没达到卡巴的要求,呵呵)
下面开始注入explorer进程,并启动这个进程。并向各个盘符下写入auto.exe还有autorun.inf

[AutoRun]
open=auto.exe
shellexecute=auto.exe
shell\Auto\command=auto.exe
这个是提取出来的,呵呵,很经典了。

剩下的就是修该注册表,创建服务。基本过程就是这样了。
text:00401F39 push  offset aSystemCurrentc ; "SYSTEM\\CurrentControlSet\\Services\\"
注册表是这个地方遭到修改。


下面在用OD动态的走一遍。由于是动态的,很多东西,我也不是很熟悉,只能说也是大概的,有一个新手菜鸟的眼光看一下,希望得到大大们的指导。

004025A6  |.  53            push    ebx        ; /pModule
004025A7  |.  FF15 50304000 call    dword ptr [<&kernel32.GetMod>; \GetModuleHandleA
004025AD  |.  50            push    eax
004025AE  |.  E8 A3F0FFFF   call    00401656     //F7跟进程序
004025B3  |.  8945 98       mov     dword ptr [ebp-68], eax
004025B6  |.  50            push    eax                          ; /status
004025B7  |.  FF15 E4304000 call    dword ptr [<&msvcrt.exit>]   ; \exit

头有点晕,估计很多细节都没有把握好,不过这个病毒特征很明显,而且动作也不复杂,流程都出来了,就不用OD再走了,我估计剩下的每个call都跟进去,应当会很神伤。
休息一下。休息一下。

还希望能获得一个邀请码,能更深入的学习。

用到的API帮助(由于个人还处于初级菜鸟阶段,很多函数需要百度)
FindWindowExA     http://baike.baidu.com/view/1080313.htm

GetModuleFileNameA        http://baike.baidu.com/view/1285912.html

GetSystemDirectoryA         http://baike.baidu.com/view/1290410.htm

lstrcpy        http://baike.baidu.com/view/1906471.htm

PostMessageA      http://baike.baidu.com/view/1080179.htm

lstrcat       http://baike.baidu.com/view/1906745.htm

lstrlen      http://baike.baidu.com/view/1907117.htm

lstrcmp   The lstrcmp function compares two character strings. 

CreateFileA     http://baike.baidu.com/view/1288759.htm

WriteFile           http://baike.baidu.com/view/1295782.htm

CloseHandle       http://baike.baidu.com/view/1288756.htm

WinExec      http://baike.baidu.com/view/1286882.htm

SetServiceStatus      http://msdn.microsoft.com/en-us/libr...41(VS.85).aspx

GetLastError       http://baike.baidu.com/view/1730168.htm

RegisterServiceCtrlHandlerA         http://msdn.microsoft.com/en-us/libr...54(VS.85).aspx

CreateThread     http://baike.baidu.com/view/1191444.htm

ShellExecuteA          http://baike.baidu.com/view/1044533.htm

StartServiceCtrlDispatcherA       http://msdn.microsoft.com/en-us/libr...24(VS.85).aspx

RegCreateKeyExA        http://baike.baidu.com/view/1293831.htm

RegSetValueExA   http://baike.baidu.com/view/1297625.htm

RegCloseKey         http://baike.baidu.com/view/1293825.htm

GetVersionExA       http://baike.baidu.com/view/2267844.html

GetVolumeInformationA   http://baike.baidu.com/view/1292120.htm

OpenSCManagerA        http://msdn.microsoft.com/en-us/libr...23(VS.85).aspx

OpenServiceA         http://msdn.microsoft.com/en-us/libr...30(VS.85).aspx

StartServiceA      http://msdn.microsoft.com/en-us/libr...21(VS.85).aspx

CloseServiceHandle   http://msdn.microsoft.com/en-us/libr...28(VS.85).aspx

LocalAlloc        http://msdn.microsoft.com/en-us/libr...23(VS.85).aspx

QueryServiceConfigA   http://msdn.microsoft.com/en-us/libr...32(VS.85).aspx

ChangeServiceConfigA    http://msdn.microsoft.com/en-us/libr...87(VS.85).aspx

WriteProcessMemory     http://baike.baidu.com/view/1495693.htm

GetProcAddress     http://baike.baidu.com/view/1523523.htm

CreateRemoteThread   http://baike.baidu.com/view/697167.html

GetProcAddress    http://baike.baidu.com/view/1523523.htm

FreeLibrary       http://baike.baidu.com/view/1285888.htm




本文有关图片链接的地
http://photo2.bababian.com/upload1/20091018/5369DFA0EC2EBA674FFD990CA8426C20.jpg

http://photo2.bababian.com/upload1/20091018/85D251CCF73F8A4E29D3D7BD251B2683.jpg

http://photo2.bababian.com/upload1/20091018/DDA6BB772765683156E57CCC60A2E225.jpg

http://photo2.bababian.com/upload1/20091018/C22BDC2D2CC95160BD7BA58A96B7A6AC.jpg

http://photo2.bababian.com/upload1/20091018/289D6E7B661162FC1B980442BA2B8AAE.jpg

http://photo2.bababian.com/upload1/20091018/3782C4892A4D2FA5C858BBD466ED4284.jpg

http://photo2.bababian.com/upload1/20091018/3F4F583DDAF64AA5F3FEB6003855053C.jpg


如果帖子哪里有不合规范,请见谅,并指出,我会在看到的第一时间修改不合规范的地方的。

  • 标 题:答复
  • 作 者:yasm
  • 时 间:2009-10-18 13:20:35

从第一个病毒分析,深切的发现逆向/破解 确实是一个很需要耐心的东西。
从昨天晚上开始,IDA,OD,VMWARE,还有ingshi手杀的各种工具全拿出来,对付一个在大家看来其实很普通的一个病毒。
不过一直到今天中午才把全部的弄完,本想在用OD动态跟一遍的,发现,眼睛有点涨,额。

下次有机会,用OD来分析,学校中的另外的几个病毒好了。
躺一会先。