【轉】IDA Pro 初探

tiny丶發表於2019-03-15

IDA Pro(https://yunpan.360.cn/surl_yFS4HRAez3H (提取碼:0b3d))

是一款強大的反彙編軟體,特有的IDA檢視和交叉引用,可以方便理解程式邏輯和快速定位程式碼片斷,以方便修改。

這裡寫圖片描述

這裡寫圖片描述

                            **IDA檢視**

示例程式

下面會通過修改示例程式的輸出字串,來講解如何使用IDA Pro。

#include

main()
{
    int n;
    scanf ("%d",&n);
    if (n > 0)
       printf("a > 0");  //後面會用IDA Pro把'a'改成'n'
    else
       printf("n < 0");
}

編譯後的程式下載:demo

執行IDA Pro

執行IDA Pro,並使用PE檔案的方式開啟示例的test.exe檔案。IDA Pro會新建一個工程,並開始反彙編程式。反彙編完成後,在[IDA-View]視窗中,可以看到程式邏輯的樹形圖,如下:

這裡寫圖片描述

這裡寫圖片描述

樹形圖把條件分支清晰地顯示出來了。左下角有IDA檢視的縮圖,在上面點選可以快速定位到檢視的指定位置。 IDA的View有幾個按鈕對定位程式碼很重要,如下圖所示:

這裡寫圖片描述

這裡寫圖片描述

從上到下分別是:
Open exports window:開啟匯出視窗
Open import window:開啟匯入視窗
Open names window:函式和引數的命名列表
Open functions window:程式呼叫的所有函式視窗
Open strings window:開啟字串顯示視窗,會列出程式中的所有字串,該視窗有助於你通過程式的執行輸出逆向找出對應的程式碼片斷。

定位程式碼片斷

假設我們現在接到個任務,需修正程式,把輸出“a > 0”修正為“n > 0”。示例程式比較簡單,直接看IDA檢視我們就能找到需修改的程式碼片斷,但實際處理時,可能程式有幾m大,通過一個個看IDA檢視已沒法有效找到相關的執行程式碼片斷,這時怎麼辦? 使用字串視窗和IDA強大的交叉引用! 點選View裡的[Open strings windows]按鈕,可以看到如下的程式字串:

這裡寫圖片描述

這裡寫圖片描述

程式的字串較少,可以很快地看到我們需要的字串“a > 0”在資料段00403003位置。假如字串多到已不能肉眼定位查詢,因為字串視窗是沒有查詢功能的,這時需要藉助其他的文字編輯器,如notepad,editplus等。在字串視窗內右鍵,選擇選單[copy]命令,會把字串視窗的所有內容複製到剪貼簿,再貼上到記事本中查詢就可以了。 雙擊字串視窗的該行字串,會跳轉到IDA檢視的00403003位置如下圖所示

這裡寫圖片描述

這裡寫圖片描述

單擊’a > 0’中的a,a會高亮,

這裡寫圖片描述

這裡寫圖片描述

最後定位的程式碼片斷,上圖顯示的彙編指令即是我們要找的程式碼片斷,這時點選[Hex View-A]視窗,會切換到二進位制瀏覽模式,並高亮了彙編程式碼的二進位制格式指令,如下圖所示:

這裡寫圖片描述

這裡寫圖片描述

已找到需修改的程式碼片斷,剩下的只需把a改成n。

修改程式檔案

在IDA中,可以在[Hex View-A]視窗右鍵選擇[Edit]來修改二進位制指令。修改後通過右鍵選擇[Commit Change]可以看到修改後的IDA檢視。但需要注意的是,這種方式的修改並不會更新原始程式檔案,實際只是修改了IDA的專案檔案!IDA中只適合做一些驗證性的修改,確保正確後再使用其他工具修改原始程式檔案。 在IDA中驗證修改正確後,可以使用UltraEdit或Hex Workshop來修改原始程式檔案。下面會以UltraEdit為例來說明如何修改。

這裡寫圖片描述

這裡寫圖片描述

下載好UltraEdit,用UltraEdit直接開啟程式檔案,如上圖所示,UltraEdit會以16進位制模式顯示程式檔案。UltraEdit顯示的地址和IDA顯示的地址是不同的,為了找到對應程式碼片斷在UltraEdit中的實際地址,需要使用到UltraEdit的查詢功能。在IDA中複製需修改的16進位制模式顯示的指令,在UltraEdit中開啟查詢,貼上並查詢該16進位制字串,UltrEdit會很快定位到該指令處,如下圖所示:

這裡寫圖片描述

這裡寫圖片描述

找到了UltraEdit的對應位置 現在我們要把“a > 0”改成“n > 0”,a對應的ASCII碼是61,而n對應的ASCII碼是6E,只需把61改成6E就可以了,修改後儲存

這裡寫圖片描述

這裡寫圖片描述

再次執行,可以看到結果已改變!

這裡寫圖片描述

這裡寫圖片描述

示例只是修改了字串,只需更改資料段內容就可以了,不用更改指令。假如需要更改指令,需要參考指令集的指令操作表寫出對應指今的16進位制形式,再修改。



作者:牧碼人小鵬
連結:https://www.jianshu.com/p/dd49eb38609f
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。

相關文章