程式扎記: [ OllyDbg 教學 ] 第一卷 入門 : 第三篇 - 函數參考

標籤

2011年6月21日 星期二

[ OllyDbg 教學 ] 第一卷 入門 : 第三篇 - 函數參考

參考自 看雪學院 - OllyDB入門教學 
前言 : 
現在進入第三篇,這一篇我們重點講解怎樣使用 OllyDBG 中的函數參考(即名稱參考)功能. 而使用範例是我在Virus Training 第四天分析的第四支 Virus sample. 該 Virus sample 會在已感染的檔案裡做標記, 這樣下次就不會重複感染. 而我們這裡將利用設定函數參考的技巧來幫助我們分析組碼. 

排除病毒自我檢查 : 
由於事先的分析, 我們知道該病毒會透過 API:GetProcAddress 來得到 API:IsDebuggerPresent 函式的位置並知道自己是否在 Debugger 模式下執行藉以避免被分析或追蹤, 因此我們在反編譯視窗按右鍵並 Search for -> All intermodular calls, 並出現下面視窗, 接著鍵入 "GetProcAddress" 得到對應位置 : 
 

接著選擇該行, 點擊右鍵並選擇 > 'Set breakpoint on every call to GetProcAddress' 後 double click 該行回到反編譯組碼視窗 : 
 

回到反編譯組語視窗後, 按下 F9 讓程式繼續執行, 接著會發現 Ollydbg 停在我們剛剛設的斷點 : 
 

接著我們來分析這段組語 : 

00401352 PUSH TestVir.0040819C // 將參數 ProcNameOrOrdinal = "IsDebuggerPresent" 放進堆疊
00401357 PUSH EAX ; |hModule
00401358 CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd> \\呼叫 GetProcAddress
0040135E TEST EAX,EAX // 確認函數呼叫是否成功.
00401360 JE SHORT TestVir.0040136E // 如果呼叫 函數 GetProcAddress 失敗, 則跳到記憶體位置 0040136E
00401362 CALL EAX // 此時 EAX 存放 IsDebuggerPresent 函式的位置, 這裡是呼叫函式 IsDebuggerPresent
00401364 CMP EAX,1 // 判斷執行回傳值是否為 1, 根據 msdn 定義, 如果是執行在 debugger 模式, 則回傳值不為 0.
00401367 MOV EAX,1
0040136C JE SHORT TestVir.00401370 // 如果為 debugger 模式, 則跳到記憶體位置 00401370.
0040136E MOV EAX,ESI
00401370 POP ESI
00401371 RETN // 從堆疊取出返回的記憶體位置並返回該記憶體位置

由上面分析我們知道為了讓病毒相信目前並不是在 debugger 模式下, 我們要在呼叫 API:IsDebuggerPresent 後, 在 CMP EAX,1 時將暫存器 EAX 的值設為0. 所以請按 F8 一直執行到該行, 並在反編譯組碼視窗的右方 暫存器與旗標視窗 在 EAX 暫存器上點擊右鍵並選擇 Modify 修改其值為 0 : 
 

到目前為止, 我們已經成功矇騙該病毒目前為 Debugger 模式, 但還有更精彩的在後面. 接著該病毒會去註冊碼檢查是否有安裝防毒軟體, 藉以逃避防毒軟體的掃描. 從此我們知道了下一步該如何著手了, 因為病毒必須透過函式 RegOpenKey 打開註冊碼, 所以我們必須要找到呼叫該函式的地方並設斷點進行分析. 透過剛剛介紹的技巧, 我們可以很快的找到呼叫 RegOpenKeyA 的位置, 並在呼叫之前設定斷點以便後續分析 : 
 

接著我們來分析這一段的組碼 : 
004013FD PUSH EDX // 放入呼叫函式的參數 pHandle 進入堆疊.
004013FE LEA EAX,DWORD PTR SS:[ESP+58]
00401402 PUSH EAX // 放入呼叫函式的參數 Subkey (SOFTWARE\TrendMicro) 進入堆疊.
00401403 PUSH 80000002 // 放入呼叫函數的參數 hKey = HKEY_LOCAL_MACHINE 進入堆疊
00401408 CALL ESI // 呼叫函式 RegOpenKeyA
0040140A TEST EAX,EAX // 如果該註冊碼存在, 則返回 0. (ZF=1)
0040140C MOV EDI,DWORD PTR DS:[<&ADVAPI32.RegClos>; ADVAPI32.RegCloseKey
00401412 JNZ SHORT TestVir.00401420 // 如果註冊碼不存在(ZF=0), 則跳到記憶體位置 00401420

一樣為了欺騙病毒, 我們必須在每次呼叫完 RegOpenKey 後將 EAX 暫存器設為非零值 (註冊碼開啟失敗) 來讓病毒誤以為沒有裝防毒軟體來讓我們得以分析病毒的行為. 底下是執行過程的截圖, 可以看出病毒嘗試透過註冊碼去檢查電腦是否有安裝 Symantec : 
 

病毒搜尋檔案與感染 : 
接著病毒便會去 C:\WINDOWS, C:\WINDOWS\system32 目錄下去搜尋可執行檔 (.exe) 並將之感染, 並在該檔案記憶體偏移位置 0xc000 位置上留下 Mark, 以避免重複感染. 而後續的分析過程便不在此延續, 只要透過剛剛介紹如何尋找特殊函數的位置與對函數設斷點與適當的修改暫存器便可以很順利的分析出病毒的行為.

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!