在嘗試學習分析的過程當中,判斷結論不必定準確,只是一些我本身的思考和探索。敬請批評指正!html
運行IDA Pro,打開Lab05-01.dll,以圖形化界面顯示:windows
直接定位到DLLMain開始的位置上。用空格鍵能夠切換到文本模式查看:api
程序中的全部函數包括:導入函數、導出函數、在中間過程當中使用的函數。
咱們能夠從Import窗口查看導入函數,Export窗口查看導出函數,Function Window查看程序中全部函數:socket
打開字符串strings視圖:tcp
這裏就能夠看到全部的字符串:函數
隨便在左側函數欄找一個函數,雙擊到達這個函數所在位置.text節10011F40:工具
使用圖形化工具查看:學習
Function calls
顯示全部的函數調用;插件
Xrefs to
查看哪些函數調用了這個函數:code
Xrefs from
查看這個函數調用了那些函數:
User Xrefs chart
可讓用戶選擇顯示內容:
一打開lab05-01.dll程序,自動停到入口地址DLLMain的位置:
能夠看到DLLMain的地址是在.text節1000D02E的位置
打開導入表:
經過ALT+T調出查找gethostbyname:
而後被定位到:
雙擊該項,跳轉到其定位的地址100163CC的位置上:
使用IDAPro的交叉引用功能,在上述位置用快捷鍵Ctrl+X打開交叉引用窗口:
p是gethostbyname被調用的引用,通過觀察可得,在5個不一樣的位置調用了gethostbyname。
使用快捷鍵G快速定位到0x10001757:
這裏是一段彙編代碼,call指令調用gethostbyname:
這一段裏面,首先在eax中壓入偏移,雙擊off_10019040能夠查看:
這裏能夠經過IDA的自動註釋功能看到部份內容,雙擊aThisIsRdoPics查看完整的內容:
接着,eax加上了0Dh,咱們經過hex界面可能看得更直觀,右擊aThisIsRdoPics選擇在新的十六進制視圖打開:
光標放在網址最前位置,能夠在下方看到相對偏移,除去中括號中內容的網址部分開始位置的偏移就是0Dh:
而後將這個指向這個URL的eax壓入棧,調用gethostbyname函數。
在字符串視圖查找字符串「\cmd.exe /c」:
雙擊打開:
能夠看到位置是xdoors_d:10095B34。經過雙擊字符串後面註釋中的上箭頭或Ctrl+C查看交叉引用找到其引用:
定位到:
彙編學的很差,在這裏看彙編代碼也實在是費勁,爲了大致判斷這一部分的功能,我採用圖形化界面,直接雙擊藍色無條件跳轉指向線、綠色條件跳轉指向線查看代碼的流程。
能夠看到一些有用的信息:
call ds:GetCurrentDirectoryA:是一個系統參數,在一個緩衝區中裝載當前目錄。 call ds:GetLocalTime:獲取本地時間。
字符串位置:
雙擊查看:
得到關鍵信息:「Shell Session」會話
call ds:CreatePipe:建立匿名管道的同時返回兩個句柄:管道讀句柄和管道寫句柄。 call ds:GetStartupInfoA:獲取進程起始信息。 call ds:recv:套接字接收函數 call ds:closesocket:關閉套接字。
綜合來看,這一部分可能完成的做用是使用套接字的一個遠程會話。
在左側函數欄查找到sub_10004E79,雙擊查看:
使用圖形化工具查看這個函數調用了那些函數:
函數sub_10004E79調用了直接調用了四個函數,間接調用了四個函數。
API函數有:
GetSystemDefaultLangID:取得系統的默認語言ID Sprintf:把格式化的數據寫入某個字符串中
C語言庫函數有:
Send:向一個已經鏈接的socket發送數據 Strlen:檢測字符串實際長度 Malloc:向系統申請分配指定個字節的內存空間 Free:釋放指向的存儲空間
猜想這個函數應該是獲取了系統語言並打印出來,能夠在左側函數欄右擊函數編輯:
重命名函數,方便進一步研究:
更改後能夠看到函數名都已經被修改了:
首先到達0x10001701處,看到其三個參數分別爲:2,1,6:
可使用hex-ray反彙編C語言僞代碼看得更清楚:
在MSDN中查找socket function:
能夠找到咱們須要的參數:
AF
Type
protocol
Socket函數中的三個參數分別爲:
2:AF_INET使用IPv4協議 1:SOCK_STREAM使用流式Socket 6:IPPROTO_TCP使用tcp協議
能夠右擊更改成對應的名稱方便理解:
這個標誌其實是一個枚舉型變量:
更改後效果:
有同窗遇到了這樣一個問題來問我:在Function window中搜索後面某一題中調用的函數沒有找到,在Import中搜索到了,這個Function Window不該該包含這個程序裏全部的函數嗎,爲何會找不到一個確實被調用了的函數呢?
我看了一下,確實是這樣,打開其它程序,一樣不顯示導入函數:
查看Function Window中的標誌F,由於標誌F表示多是導入函數,也多是本身寫的函數,沒有看到有該標誌的,多是由於IDA版本問題或者是自己導入函數就不算在程序中寫的函數?
IDA Pro功能實在是太強大了,在這麼短的時間內只作到了根據問題粗略的使用,《惡意代碼分析實戰》用了一章的篇幅講這個強大的反彙編器,讀完了以後感受有不少可拓展的使用方法(有些插件須要付費才能下載,免費版的功能和上面說的不大同樣),還須要必定時間的學習。
在作此次實踐的過程當中,我一直在想如何在沒有這些問題的提示下使用IDAPro對一個惡意代碼進行高級靜態分析。彙編和反彙編很重要,對程序及工具交互能力的利用也很重要。在接下來的學習過程當中須要逐步解決這個問題。