病毒分析教程第五話--動態除錯分析(下)
動態除錯分析(下)
Lab 9-3
本節實驗使用樣本Lab09-03.exe、DLL1.dll、DLL2.dll、DLL3.dll。
Lab09-03.exe匯入了哪些DLL?
我們用OD開啟函式呼叫,發現Lab09-03.exe顯性地匯入了DLL1和DLL2、kernel32.dll和NetAPI32.dll。為什麼說是顯性呢?因為樣本一般還會通過呼叫LoadLibrary隱形地呼叫敏感的DLL,如下就是,我們看到Lab09-03.exe有呼叫LoadLibrayA。
我們使用IDA可以方便地看到樣本在兩處呼叫了LoadLibraryA,分別匯入了DLL3.dll和user32.dll。
DLL1.dll、DLL2.dll、DLL3.dll要求的基地址是多少?
DLL基地址的值儲存在PE結構的Optional Header -> ImageBase,很多工具都可以檢視,這裡我們發現DLL1.dll、DLL2.dll和DLL3.dll的基地址都為0x10000000。
當使用OllyDbg除錯Lab09-03.exe時,為DLL1.dll、DLL2.dll、DLL3.dll分配的基地址是什麼?
因為DLL1.dll和DLL2.dll在匯入表中,所以它們被立即載入,而DLL3.dll由於是動態載入的,所以我們需要執行到0x401041處 (LoadLibrary)才可以得知DLL3.dll被載入到了哪個地址。使用OD在0x401041下斷點,然後單步步過LoadLibrary。檢視Memory視窗。DLL1.dll獲得了它想得到的基地址0x10000000,DLL2.dll和DLL3.dll分別在0x1E0000和0x1F0000上。
當Lab09-03.exe呼叫DLL1.dll中的一個匯入函式時,這個匯入函式都做了些什麼?
使用IDA開啟DLL1.dll,定位到DLL1Print函式,雖然複雜,但主體功能就是呼叫了_write_char在控制檯處輸出資料。
我們可以看到,輸出的資訊為“DLL 1 mystery data”+PID。
DLL2Print的功能也一樣,也是輸出一段字串。
但它跟DLL1Print輸出PID不一樣,它是輸出了temp.txt的控制代碼值。
當Lab09-03.exe呼叫WriteFile函式時,它寫入的檔名是什麼?
DLL2ReturnJ返回temp.txt的控制代碼,那麼WriteFile寫入的檔名就是temp.txt,內容為“
當Lab09-03.exe使用NetScheduleJobAdd建立一個job時,從哪裡獲取第二個引數的資料?
而DLL3GetStructure函式比較奇怪,它只做了一個操作,將0x1FB0A0寫入0x12FF2C的位置。
而0x1FB0A0恰恰就是後面NetScheduleJobAdd的第二個引數ecx的值。
使用MSDN查詢NetScheduleJobAdd,得知該函式的功能為建立一個定時任務(job),而這個job的內容就是在Buffer中定義的,其中Buffer是一個AT_INFO結構的指標。
也就是說0x1FB0A0指向的是一個AT_INFO結構。
我們使用IDA定位到了修改AT_INFO結構的地方,在DLL3.dll的DllMain裡。
為了更清晰地看出AT_INFO的賦值過程,我們可以在dword_1000B0A0處,選擇Edit->Struct Var,選擇AT_INFO,若你找不到AT_INFO,請看《病毒分析教程第四話–高階靜態逆向分析(上)》如何新增結構。
定義了AT_INFO結構後,顯示友好了很多,我們可以清晰的知道,這個定時任務的功能是,一週中任意一天的1:00AM,執行“ping www.malwareanalysisbook.com”的命令。
在執行除錯Lab09-03.exe時,你會看到Lab09-03.exe打印出三塊神祕資料。DLL1的神祕資料,DLL2的神祕資料,DLL3的神祕資料分別是什麼?
分別是程序的ID,temp.txt的控制代碼,“ping www,malwareanalysisbook.com”的地址。
如何將DLL2.dll載入到IDA Pro中,使得它於OllyDbg使用的載入地址匹配?
我們使用IDA開啟樣本時,勾選Manual load,就可以自定義基地址了,然後輸入DLL2.dll對應的0x1E0000,就可以跟OD中的匹配上了。