1. 程式人生 > >原始碼閱讀SourceInsight與靜態反彙編IDA Pro

原始碼閱讀SourceInsight與靜態反彙編IDA Pro

1.原始碼閱讀SI

    1.1呼叫關係圖(正向和方向關係調用)

                 Sourceinsight可以方便的檢視函式呼叫關係,點選圖示   開啟如下:

                 點選函式的末尾可以展開下一級呼叫關係,如上圖滑鼠彈出”加號“的位置。呼叫關係圖,右鍵可以設定查詢的關係:

                 

                                          for types:檢視變數型別關係設定

                                          for functions:檢視函式呼叫關係或索引關係

                                          for variables,constants:檢視變數值

                                          for classes:檢視類呼叫關係或繼承關係

                                          for files:檢視檔案呼叫關係

    1.2 快捷鍵

                       Ctrl+O:開啟工程檔案視窗

                       Ctrl+?:搜尋內容視窗

                       Shit+F8:高量標記變數或函式

                       Shit+F9:搜尋結果中,往前遍歷查詢結果的檔案索引

                       Alt+L:只有焦點處於程式碼文字視窗中時,可以是焦點快捷地調到左邊的名稱空間視窗

2.靜態反彙編IDA

     2.1反彙編演算法

           a.線性掃描反彙編:無法將嵌入的資料和程式碼區分開

           b.遞迴下降反彙編:無法處理間接程式碼路徑(如利用指標表來查詢目標地址的跳轉和呼叫)

     2.2 常用操作與快捷方式(IDA6.5.1版本)

          名稱:sub_xxxx:地址xx子例程          loc_xxxx:地址xx指令          byte_xxxx:位置xx8位資料                unk_xxxx:位置xx大小未知資料

          節:idata:函式匯入段          edata:函式匯出段            data:資料段              rdata:資源段

          1.Num ”-“或”+“ 圖形檢視和程式碼檢視切換(6.5版本,5.5版本使用space空格切換)

          2.Ctrl+s 段跳轉    Ctrl+P 函式跳轉   Ctrl+E 跳轉到函式入口點

          3.Shift+F3 函式名視窗       Shift+F4 所有名稱空間視窗     Ctrl+X交叉引用(函式和資料交叉引用,交叉引用:引用其他位置的顯示,Data Xref註釋處)

          4.程式碼呼叫關係,選單欄結構圖

          5.text view和graph view(單個函式的流程圖) 程式碼跳轉關係

          6.ESC 回退檢視     Ctrl+Enter 前進檢視

          7.F5外掛   可以翻譯彙編程式碼成pseudocode(虛擬碼)C語言版   -----使用IDA5.5版本較穩定

          8.IDA載入過程出現oops錯誤,需要安裝python 2.6版本

          9.text view 模式,粗虛線:迴圈,細虛線:條件跳轉,實線:非條件跳轉,紅線:同一函式內

          10.Alt+T 搜尋字串

11.選單view->open subviews->cross renferencesfunction call檢視    (alt+num切換tab)          function call和反彙編視窗組合檢視閱讀程式碼

          12. Alt+M標記---->Ctrl+M跳轉到標記處

          13.IDA 不能確定函式分散到各個段裡的函式邊界,所以有sub_XX和.text的跳轉

                             函式通過function call聯絡

                             .text這種分散的函式片段可以通過cross renferences確定

14.F1 IDA幫助文件檢視INC指令碼內部提供的系統函式編寫指令碼

      2.3 exe檔案修改

          1.修改原則:

                  單條指令替換

                            retn返回的    call指令   ------->>替換      nop(0x90)   

                            retn XX返回的   call指令    ---------->>替換    add esp XX

                  替換所有指令保持棧平衡

                            push、retn和retn XX    call指令  ------------->>替換  nop(0x90)

                  彙編函式返回值:ret 前賦值給 EAX,資料過大高位存在EDX,再大指標

          2.修改方法:

          直接修改機械碼,可能導致兩條nop語句之間的彙編程式碼對應的機械碼發生變化,使用如下操作修改

          IDA->Options->General->設定opcode byte機器碼顯示

          

          IDA配置檔案cfg目錄下的idagui.cfg,修改DISPLAY_PATCH_SUBMENU=YES,重啟ida可以看到Edit->Patch Program->assembly

          

          使用IDA查詢到程式碼對應的16進位制碼,在UtrlEdit下查詢後,使用以下原則進行全指令替換

          

      2.4 堆疊平衡

           call呼叫前,需要壓棧引數,出棧需要彈出堆疊內所有資料,retn xx 或 ret後呼叫處add esp xx平衡,類似prinf函式引數數量不可確定,需要出棧時調整esp

            (rop攻擊:面向返回值的錯誤跳轉攻擊)

      2.5 反彙編技巧

            1.閱讀反彙編時,資料最好從初始化源頭追蹤,如視窗控制代碼需要檢視createwindow函式,否則很難以閱讀

            2.lea offset 函式,push入函式代表回撥函式;如果在定義在數組裡,陣列首地址呼叫處,可能是事件迴圈

            3.反編譯工具未能識別的函式,以.text塊跳轉     (可以載入pdb檔案匯入本模組的符號表,需要設定pdb.cfg)

            4.for、while迴圈jmp無條件回跳的程式碼

               if條件判斷:cmp等標誌暫存器控制  和  跳轉命令

               結構體:dword ptr 表明[]字定址、雙字定址或位元組定址,其中Dword Ptr可能是4位元組指標

               switch:連續多處調轉

      2.6入口函式OEP    

               幾種語言的入口函式特徵:

              C++的入口函式GetVersion
              彙編的入口API函式   GetModuleHandleA
              DELPHI入口特徵 GetModuleHandleA
              易語言入口API函式 GetVersion
              VC8入口特徵查詢 GetStartupInfoW
              VB入口特徵查詢函式 ThunRTMain
         2.7反彙編基礎(16位AX、32位EAX、64位RAX)                      AX 累加暫存器 (除法和函式返回值中隱含使用,資料過大DX輔助)   CX  記數暫存器 (迴圈中隱含使用)                      SI、DI 基址變址暫存器         SP、BP、IP 指標暫存器                      C++入口函式在link配置裡面可修改      關注call和jmp、lea(move offset),結構體和類反彙編相同

參考:

1.《IDA Pro權威指南 (第2版)》

2. http://blog.csdn.net/chenyujing1234/article/details/7766639

3.http://www.doc88.com/p-774671348081.html 部落格例項

4.http://www.pediy.com/kssd/pediy12/142766.html 讀書筆記

5.http://bbs.pediy.com/showthread.php?t=160887  連連看新人外掛入門

6.http://ajiannet.cnblogs.com/遊戲外掛

7.http://www.eefocus.com/book/09-05/740251276059759.html彙編指令入門

8.http://blog.csdn.net/chinabinlang/article/details/19476941

9.http://www.cnblogs.com/jack204/archive/2011/12/02/2271884.html(反彙編技巧)