c&c++反彙編與逆向分析學習筆記(2)--反彙編靜態分析工具IDA
所謂“靜態分析”,是相對於前面提到的“動態分析”而言的。在“動態分析”過程中,偵錯程式載入程式,並以除錯模式執行起來,分析者可以在程式的執行過程中觀察程式的執行流程和計算記過。但是,在實際分析中,很多場合不方便執行目標,比如軟體的某一模組(無法單獨執行)、病毒程式、裝置環境不相容導致的無法執行……那麼,在這個時候,需要直接把程式的二進位制程式碼翻譯程組合語言,方便程式設計師閱讀。想這樣由目標軟體的二進位制程式碼到彙編程式碼的翻譯過程,我們稱之為”反彙編”。OllyDBG也有反彙編功能。但OllyDBG是除錯工具,其反彙編輔助分析功能有限,不適合靜態分析。
下面介紹輔助功能極其強大的反彙編靜態分析工具—IDA。據說它的圖示是被稱為“世界上第一位程式設計師”的Ada Lovelace的頭像,中文名為阿達。書中使用IDA版本為5.5英文版。為了減少學習的干擾因素,我也使用的5.5英文版。成功安裝IDA後,會出現兩個可執行程式圖示,一個是黑白的阿達頭像,另一個是在阿達頭部寫有”64”字樣的頭像,分別對應32位和64位程式的分析。
IDA快捷鍵使用說明
編號 快捷鍵 功能說明
01 Enter 跟進函式實現,檢視標號對應的地址
02 Esc 返回跟進處
03 A 解釋游標處的地址為一個字串的首地址
04 B 十六進位制數與二進位制數轉換
05 C 解釋游標處的地址為一條指令
06 D 解釋光標出的地址為資料,每按一次將會轉換這個地址的資料長度
07 G 快速查詢到對應地址
08 H 十六進位制與十進位制轉換
09 K 將資料解釋為棧變數
10 ; 添加註釋
11 M 解釋為列舉成員
12 N 重新命名
13 O 解釋地址為資料段偏移量,用於字串標號
14 T 解釋資料為一個結構體成員
15 X 轉換檢視到交叉參考模式
16 Shift+F9 新增結構體
我們可以通過分析上一節中的”HelloWorld”程式來進一步學習IDA的基本使用方法。
(1)載入分析檔案
IDA載入分析檔案後,會詢問分析的方式,有3中分析方案供選擇
1> Portableexecutable for 80386(PE)[pe.ldw]:分析檔案為一個PE格式的檔案(想要了解PE檔案格式可以去看《程式設計師的自我修養》這本書,很經典)
2> MS-DOSexecuteble(EXE)[dos.ldw]:分析檔案為DOS控制檯下的一個檔案
3> Binaryfile:分析一個二進位制檔案
(2)各檢視功能
1>IDAView-A:分析檢視視窗,用於顯示分析結果,可選用流程圖或程式碼形式
2>HexView-A:二進位制檢視視窗,開啟一個檔案的二進位制資訊。
3>Exports:分析檔案中的匯出函式資訊視窗。
4> Imports:分析檔案中的匯入函式資訊視窗。
5> Names:名稱視窗,分析文件中用到的標號名稱
6> Functions:分析檔案中的函式資訊視窗。
7> Structures:新增結構體資訊視窗。
8> Enums:新增列舉資訊視窗。
(3)檢視分析結果
上一節中的“Hello world”程式反彙編分析示例如圖所示。
IDA的資料查詢非常簡單,只需要雙擊標號,即可跟蹤到該資料的定義處。檢視函式實現的方式也是如此,比如,如果需要返回呼叫處,只需按Esc鍵即可返回。有了IDA的幫助,使得將一個二進位制檔案還原成等價的C\C++程式碼的難度大大降低。通過圖示我們可以看到IDA並沒有識別出整個”第一個Win32程式”字串,而是隻顯示”第一?”我們雙擊跟進這個字串,找到一連串的db “…”,這就是我們要找的整個字串,用滑鼠選中這些內容,按a鍵(或滑鼠右鍵裡的<s”第一個Win32程式”>選項)。IDA立即把這些資料理解為一整個字串,很方便有木有。
(4)切換反彙編檢視和流程檢視
反彙編程式碼是從IDA的反彙編檢視中提取的。在函式體內,右擊選擇Text view進入反彙編檢視,右擊選擇Graph view進入流程檢視。流程檢視使得程式的流程結構和工作量的分析變得異常容易。
(5)IDA函式名稱的識別
IDA可以識別出函式MessageBoxA及其各引數的資訊。IDA是通過SIG檔案來識別已知的函式資訊。安裝IDA的時候,已將常用庫製作成SIG檔案放置在IDA安裝目錄中的SIG資料夾下。利用此功能可識別出第三方提供的庫函式,從而簡化分析流程。
附:SIG檔案製作步驟(使用前需要設定環境變數).
1> 從LIB檔案提取出OBJ檔案:可以在控制檯下使用link.exe連結器將從LIB檔案生成OBJ檔案。在控制檯下使用link命令,link –lib /extract:[File name][Libname].lib
2> 將每個OBJ檔案製作程PAT檔案:OBJ檔案中包含函式的名稱和對應程式碼的二進位制機器碼。在PAT檔案的製作過程中,會提取出這些二進位制機器碼的特徵,並將二進位制機器碼的特徵碼及對應函式的名稱儲存到PAT檔案中。OBJ生成PAT時使用的pcf.exe。在控制檯下使用pcf命令,pcf [Obj name].obj
3> 多個PAT檔案聯合編譯SIG檔案:一個SIG檔案是由一個或多個PAT檔案編譯而成的。在生成SIG的過程中,如果多個PAT檔案中兩個或兩個以上的函式特徵碼相同,將會過濾掉重複特徵,只儲存一份。在控制檯下使用sigmake.exe將PAT檔案編譯成為SIG檔案, sigmake [Pat name].pat [Sig name].sig(注:可用*代替名稱,將編譯該目錄想所有後綴為.pat的檔案).
4> 將生成後的SIG檔案放置在IDA的安裝目錄SIG資料夾下。使用快捷鍵Shift+F5新增SIG檔案到分析工程中。
另外,書中還給出一段開源的反彙編引擎的程式碼,用於介紹反彙編引擎的工作原理。這些內容過於理論,目前我們只要會用這些工具就好,所以這裡就不貼出了,感興趣的朋友可以去看原書。