惡意程式碼分析實戰四:IDA Pro神器的使用
這節課主要通過使用IDA Pro來進行靜態高階分析
實驗:
---------------- Lab05-01.dll ---------------- 使用工具: 1. IDA Pro -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 1、DllMain的地址是什麼? 2、使用Imports視窗並瀏覽到的gethostbyname,匯入函式定位到什麼地址? 3、有多少函式呼叫了gethostbyname? 4、將精力集中在位於0x10001757處的對gethostbyname的呼叫,你能找出哪個DNS請求將被觸發嗎? 5、IDA Pro識別了在0x10001656處的子過程中的多少個區域性變數? 6、IDA Pro識別了在0x10001656處的子過程中的多少個引數? 7、使用Strings視窗,來在反彙編中定位字串\cmd.exe /c 。它位於哪? 8、在引用\cmd.exe /c的程式碼所在的區域發生了什麼? 9、在同一的區域,在0x100101C8處,看起來好像是dword_1008E5C4是一個全域性變數,它幫助決定走哪條路徑。那惡意程式碼是如何設定dword_1008E5C4的呢?(提示:使用dword_1008E5C4的交叉引用。) -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
題目1:利用IDA Pro分析dll的入口點並顯示地址
按照如下步驟開啟IDA Pro並且載入dll檔案進行分析。
等待分析完畢後,IDA Pro自動的會顯示出dll的入口點函式dllmain
,如圖。
題目1讓我們顯示出dllmain函式的地址,這裡有兩種方法,第一種方法是直接按空格切換成文字檢視,第二種方法是在設定中顯示帶地址的圖形顯示。
空格切換文字檢視:
帶地址顯示圖形介面
點選選單 Options->General...->勾上 Line prefixes (graph)
題目2:IDA Pro匯入表視窗
在Imports
視窗中按ctrl+f
進行搜尋輸入gethostbyname
題目3:交叉應用,看多少處函式呼叫了
在gethostbyname
處按ctrl+x
調出交叉引用
,能看到所有對gethostbyname處有呼叫讀取寫入等的所有地方。
點選Type
進行型別排序,然後我們仔細來看這裡有兩個Type,一個是p
代表的是函式,r
代表的是讀取屬性,
所以這裡一共有9個p,但是這9個p並不能程式碼是9個函式呼叫了,我們在仔細來看圖2,其中他有很多地址重複的,所以我們按照地址來分一共可以分析出是4處函式呼叫了gethostbyname。
題目4:利用ctrl+g跳轉地址
將精力集中在位於0x10001757處的對gethostbyname的呼叫,你能找出哪個DNS請求將被觸發嗎?
首先我們用ctrl+c拷貝0x10001757
這個地址,然後在IDA Pro文字檢視或介面檢視,按g
按鍵,跳轉到對應的地址處。
切換到介面檢視,然後對題目4的問題進行分析:你能找出哪個DNS請求將被觸發嗎?,我們找找gethostbyname的引數,一般call的意思就是呼叫函式,這裡call gethostbyname就是呼叫gethostbyname這個api函式,然後call上面挨著的push就是函式引數,可以看到這裡就一個引數push eax
,引數是eax,所以我們來看看是什麼給eax進行了賦值,往上可以看到有一句mov eax,off_10019040
,這種帶off_或者dword_下劃線後面加個地址的可能都是全域性變數
,在後面有個註釋是IDA Pro自動加上的,他這裡分析出來off_10019040是一個字串[This is RDO]pics.praticalmalwareanalys
我們也可以直接雙擊全域性變數過去,跳到他的定義處,在圖一中還有一句add eax,0Dh
,意思是將eax字串的指標指向從開頭後0xD也就是後13處,那麼正好是pics.praticalmalwareanalys
這個域名被解析。(答案)
題目5:區域性變數分析
IDA Pro識別了在0x10001656處的子過程中的多少個區域性變數?
首先跳轉到地址處,不再重複如何跳轉。然後我們在彙編程式碼的上面可以看到這些東西,紅色標記的地方,這些都是區域性變數和引數,其中帶負號的
都是區域性變數,這裡一共有23個帶負號的,也就是23個區域性變數。
題目6:函式引數分析
IDA Pro識別了在0x10001656處的子過程中的多少個引數?
看上面的圖,其中正數
的就是引數,這裡只有一個引數lpThreadParameter
,其實也可以看函式頭註釋那裡,IDA Pro自動分析出了DWORD __stdcall sub_10001656(LPVOID lpThreadParameter)
,可以看出是一個引數。
題目7:Strings字串視窗
使用Strings視窗,來在反彙編中定位字串\cmd.exe /c 。它位於哪?
我們可以按shift+f12
來開啟字串視窗,可以在選單中點選View->Open subviews->Strings
開啟字串視窗。
雙擊過去之後點選這個地方,然後在圖2中可以看到是0x100101D0
位置的反彙編push offset aCmdExeC
處。
題目8:程式碼分析
在引用\cmd.exe /c的程式碼所在的區域發生了什麼?
我們在100101D0
地址處,按一下按鍵F5
進入反編譯C++虛擬碼
進行程式碼分析。
首先我們在函式開頭的地方開始逐步分析,可以看到一些敏感的字串,這裡有個關鍵字Remote Shell Session
,所以這個程式應該是一個惡意遠端Shell程式。
接著就是用控制命令,遠端建立cmd命令來達到執行Shell的目的。
題目9:進階分析
在同一的區域,在0x100101C8處,看起來好像是dword_1008E5C4是一個全域性變數,它幫助決定走哪條路徑。那惡意程式碼是如何設定dword_1008E5C4的呢?(提示:使用dword_1008E5C4的交叉引用。)
跳轉到地址,然後點選全域性變數,在全域性變數位置處按ctrl+x
調出交叉引用,然後可以看到有w 和r兩種屬性,其中我們可以知道w就是寫入屬性,而題目中需要我們來cmp
走哪條分支,還有如何設定dword_1008E5C4全域性變數,那麼肯定是要看w屬性看是什麼東西寫入到了全域性變數dword_1008E5C4
。
可以看到程式碼處是eax複製給了全域性變數dword_1008E5C4
,而eax來源於上一句call的返回值,所以我們需要繼續跟入Call來看他的返回值是什麼?
sub_10003695函式功能是獲取系統版本資訊,並且判斷系統版本是否為NT系統,如果是返回true,否則返回false。
根據上面的分析我們可以得出結論,dword_1008E5C4的值應該是true也就是不為0,所以他不會跳轉到loc_1001d7處,而是繼續執行"cmd.exe /c"處。
總結:
這一節我們學習了IDA Pro的很多知識,主要學會了IDA Pro
- 文字檢視和介面檢視的切換(用空格按鍵)
- 在介面檢視顯示地址
- 檢視IDA Pro的匯入表視窗
- 交叉引用,檢視被多少處函式呼叫(ctrl + x)
- 地址的跳轉(ctrl + g)
- 函式內區域性變數的分析(帶負號的)
- 函式引數分析(push xx,call xxx)、(正數的)
- Strings 字串視窗的檢視(shift + f12)
- 程式碼分析(f5)
- 靜態分析流程分支,追溯(利用ctrl +x) 看w和r屬性,分析函式返回值