4.2使用IDA Pro分析實戰--《惡意程式碼分析實戰》
使用 IDA Pro 分析 Lab05-01.dll
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的交叉引用。)
10、在位於0x1009FF58處的子過程中的幾百行指令中,一系列使用memcmp來比較字串的比較。如果對robotwork的字串比較是成功的(當memcmp返回0) ,會發生什麼?
11、PSLIST匯出函式做了什麼?
12、使用圖模式來繪製出對sub_10004E79的交叉引用圖。當進入這個函式時,哪個API函式可能被呼叫?僅僅基於這些API函式,你會如何重新命名這個函式?
13、D11Main直接呼叫了多少個Windows API?多少個在深度為2時被呼叫?
14、在0x10001358處,有一個對Sleep (一個使用一個包含要睡眠的毫秒數的引數的API函式)的呼叫。順著程式碼向後看,如果這段程式碼執行,這個程式會睡眠多久?
15、在0x10001701處是一個對socket的呼叫。它的3個引數是什麼?
16、使用MSDN頁面的socket和IDA Pro中的命名符號常量,你能使引數更加有意義嗎?在你應用了修改以後,引數是什麼?
17、搜尋in指令(opcode 0xED)的使用。這個指令和一個魔術字串VMXh用來進行VMware檢測。這在這個惡意程式碼中被使用了嗎?使用對執行in指令函式的交叉引用,能發現進一步檢測VMware的證據嗎?
1.分析DllMain地址
設定影象顯示地址位置:Options->General->選擇Line Prefixex(記憶體位置顯示)並設定Number of Opcode Bytes為6(顯示程式碼清單中每條指令的操作碼值)
DllMain地址如圖。
2.檢視匯入表
view -> Open Subviews -> Imports
使用Imports視窗並瀏覽到的gethostbyname,匯入函式定位到函式地址
3.交叉引用 - 檢視誰呼叫了這個函式
X - 檢視交叉引用
Type:p代表的被呼叫的引用,r代表的是“讀取”引用(因為是對一個匯入項call dword ptr[...],所以CPU必須先讀取這個匯入項,再呼叫它)
這裡9個p並不能程式碼是9個函式呼叫了,我們在仔細來看圖2,其中他有很多地址重複的,所以我們按照地址來分一共可以分析出是5處函式呼叫了gethostbyname。
4、將精力集中在位於0x10001757處的對gethostbyname的呼叫,你能找出哪個DNS請求將被觸發嗎?
G(Jump to address)輸入0x10001757地址
F5 反彙編(Tab切換回彙編)
對於引數off_10019040 + 13,即 pics.praticalmalwareanalys,這個域名將被解析。
5、IDA Pro識別了在0x10001656處的子過程中的多少個區域性變數?
6、IDA Pro識別了在0x10001656處的子過程中的多少個引數?
G跳轉到 0x10001656,
帶符號的都是區域性變數,共有23個。
帶正好的是引數,這裡只有lpThreadParameter
7、使用Strings視窗,來在反彙編中定位字串\cmd.exe /c 。它位於哪?
8、在引用\cmd.exe /c的程式碼所在的區域發生了什麼?
View -> Open SubView -> String
找到\cmd.exe /c後,雙擊檢視,X交叉引用
在呼叫這個字串的函式中,發現了這樣的一個字元Remote Shell Session,所以這個程式應該是一個惡意遠端Shell程式。
詳細過程:
9、在同一的區域,在0x100101C8處,看起來好像是dword_1008E5C4是一個全域性變數,它幫助決定走哪條路徑。那惡意程式碼是如何設定dword_1008E5C4的呢?(提示:使用dword_1008E5C4的交叉引用。)
交叉引用 dword_1008E5C4 變數發現有讀、寫,因為這個變數的比較涉及到走哪條路徑,因此我們看寫的就好。
看到是eax賦值給了 dword_1008E5C4 變數,eax一般是上個函式的返回值。
sub_10003695函式獲取系統版本資訊,之後判斷是否為NT系統,是返回true,否返回false。
因此,dword_1008E5C4 就是指示了系統版本是否是NT系統,如果是,不會跳轉,會去執行之後"\cmd.exe /c",也就是上面我們分析的流程。
10、在位於0x1000FF58處的子過程中的幾百行指令中,一系列使用memcmp來比較字串的比較。如果對robotwork的字串比較是成功的(當memcmp返回0) ,會發生什麼?
對比成功,會呼叫sub_100052a2函式
sub_100052a2函式詳細如下:查詢了兩個登錄檔值,並呼叫加密和傳送的函式sub_100038EE
sub_100038EE函式詳細如下,將字串中每個字元+一個全域性變數值,可能是加密操作,並進行傳送
而這個全域性變數通過交叉引用,可以看到是在這裡進行賦值的
11、PSLIST匯出函式做了什麼?
開啟匯出函式
匯出函式如下
一開始不知道PName_Str是什麼,後面函式呼叫,發現用於對比枚舉出程序的名稱,才知道PName_Str是傳入用對比的程序名
sub_1000664函式如下:
進行目標程序資訊的列舉,並寫入到xinstall.dll中,還進行資料的send傳送
(另一個sub_10006518函式也差不,只不過是列舉所有程序的資訊,且最後沒有傳送資料)
資料傳送:
12、使用圖模式來繪製出對sub_10004E79函式的交叉引用圖。當進入這個函式時,哪個API函式可能被呼叫?僅僅基於這些API函式,你會如何重新命名這個函式?
選中函式名稱,如下操作開啟交叉引用圖
13、D11Main直接呼叫了多少個Windows API?多少個在深度為2時被呼叫?
選中DllMain名稱,如下操作開啟交叉引用圖
設定遞迴深度Recursion depth為1時:
Cross references to:顯示被那些函式呼叫,相當於Xrefs to
Cross references from:顯示呼叫那些函式,相當於Xrefs from
Recursive:遞迴顯示, 若取消則僅顯示上下直接呼叫函式
Follow only current direction:僅當前函式,若取消就變成了顯示全部的函式呼叫
Recursion depth:顯示呼叫的深度
Externals:是否忽略外部Windows API函式
Data:是否忽略資料
From Library Functions:是否忽略庫函式內部的交叉參考
To Library functions:是否忽略外部的交叉參考
Print Comment:是否對外部函式列印註釋
設定遞迴深度為2時,會看到是一個非常大的圖:
15、在0x10001701處是一個對socket的呼叫。它的3個引數是什麼?
16、使用MSDN頁面的socket和IDA Pro中的命名符號常量,你能使引數更加有意義嗎?在你應用了修改以後,引數是什麼?
查詢MSDN發現,三引數對應IPPROTO_TCP、SOCK_STREAM、AF_INET
選中數字,右鍵使用符號常量
搜尋上面查詢出的符號常量,選擇
17、搜尋in指令(opcode 0xED)的使用。這個指令和一個魔術字串VMXh用來進行VMware檢測。這在這個惡意程式碼中被使用了嗎?使用對執行in指令函式的交叉引用,能發現進一步檢測VMware的證據嗎?
我們需要搜尋in指令,這可以通過選擇選單的Search→Text,然後輸入in來做到(還可以選擇Search→Sequence of Bytes,然後搜尋in指令的opcode,也就是ED),這裡選擇Find All Occurrences,搜尋所有。
這段程式碼有VMXh字樣,表明這段惡意程式碼可能會有反虛擬機器的技巧,在17章我們會詳細討論。