1. 程式人生 > >c&c++反彙編與逆向分析學習筆記(2)--反彙編靜態分析工具IDA

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檔案到分析工程中。

另外,書中還給出一段開源的反彙編引擎的程式碼,用於介紹反彙編引擎的工作原理。這些內容過於理論,目前我們只要會用這些工具就好,所以這裡就不貼出了,感興趣的朋友可以去看原書。