ida pro靜態分析


一、幾個概念

1. 反匯編與反編譯
源代碼程序-->可執行程序,需要經過編譯器-->匯編器-->鏈接器;用來撤銷編譯和匯編的過程,稱之為反編譯和反匯編
反匯編:從機器碼到匯編代碼
反編譯:以匯編代碼或機器碼到高級語言
 
2. 常見的指令架構
指令架構:x86、ARM、MIPS
x86主要應用於pc機上,主要有兩種語法表示匯編代碼:Intel和AT&T
ARM主要應用於移動端,它的分類也很多,這里不展開
MIPS主要應用於路由器等設備上
 
3. 反匯編的主要方法
反匯編的主要方法:線性掃描、遞歸下降
 
4. ida
ida是一種遞歸下降的反匯編器,它支持靜態分析和動態調試程序,尤其是在靜態分析領域,ida是一款神器
下面介紹了ida靜態分析程序的相關約定
ida的命名方式與虛擬地址和棧幀變量有關,常見的有以下幾個
    sub_xxxx  地址xxxx處的子例程(過程/方法)
    loc_xxxx  地址xxxx處的一個指令
    byte_xxxx  位置xxxx處的8位數據
    unk_xxxx  位置xxxx處的大小未知的數據


棧是程序運行是的一種數據傳輸方式,ida在靜態分析中提供了棧視圖來方便用戶的使用
    .text:00401020 ; Attributes: bp-based frame
    .text:00401020
    .text:00401020 ; int __cdecl sub_401020(char *)
    .text:00401020 sub_401020  proc near   ; CODE XREF: sub_401005↑j
    .text:00401020
    .text:00401020 var_4C  = byte ptr -4Ch        //IDA提供的一個摘要棧視圖,列出棧幀內被直接引用的每一個變量,以及大小與幀指針的偏移量
    .text:00401020 var_C   = byte ptr -0Ch         // var_為局部變量名稱的前綴,后面表示變量與被保存的幀指針之間距離
    .text:00401020 var_4   = dword ptr -4
    .text:00401020 arg_0   = dword ptr  8         // 函數參數名以arg_為前綴,后面表示與最頂端參數之間的相對距離(十六進制)
    .text:00401020
    .text:00401020 push ebp ;  
    .text:00401021 mov ebp, esp
    .text:00401023 sub esp, 4Ch
    .text:00401026 push ebx

 下圖為ida通過兩種寄存器ESP和EBP來表示棧

二、ida中具體的操作            

1、靜態分析中常用快捷鍵

F5/tab:功能都是查看偽c代碼,但tab可以在偽c代碼和匯編之間相互切換,且切換時光標位置相同
shift+F12 : strings
shift+F7 :segments
alt+t :text search
ctrl+t: next text
g :快速查找到對應地址
shift+e :提取數據
Enter:跟進函數實現,查看標號對應的地址
Esc  返回跟進處
A  解釋光標處的地址為一個字符串的首地址
B  十六進制數與二進制數轉換
C  解釋光標處的地址為一條指令
D  解釋光標處的地址為數據
H  十六進制數與十進制數轉換
K  將數據解釋為棧變量
X  轉換視圖到交叉參考模式
 
2、ida 對於結構體的定義及標識
 
結構體:IDA會根據文件的類型自動加載相應的類型庫,如vc6win(VisualC++6.0),用戶做底層分析時,可以添加mssdk(windows.h)、ntddk(ntddk.h)等。這些庫中有相應的結構體,用戶分析代碼時,可以直接引用。可以通過快捷鍵”Shitft+F11“,打開加載類型庫窗口,然后用鼠標右鍵選擇”Load Type Library(或快捷鍵Insert)“,在彈出的窗口中選擇相應類型庫。
選擇好類型庫后就可以查看內置數據結構了。選擇菜單”View/Open subviews/Structure就可以打開結構體管理窗口。按Insert鍵,在彈出的窗口中選擇”Add Standard Structure“,打開標准結構庫窗口查找需要的結構名,然后就可以正常使用這些庫了。• 在默認情況下,IDA會加載常用的結構,程序類常用的結構體會顯示出來,在WNDCLASSA結構一行單擊右鍵,在彈出的菜單中選擇Unhide,快捷鍵是Ctrl++可展開結構,程序相應代碼處直接以結構體顯示。收起結構的快捷鍵是Ctrl+-。
定義新的結構體
打開結構體窗口,按下Insert鍵增加一個新的結構體類型,命名為student。把光標停留在student結構的ends一行,按D鍵可以鍵入數據(如id、age)等,重復D鍵可以在db、dw、dd間切換,直到變成dd,表示是dword類型。而按A鍵則是鍵入ASCII字符(如name)為結構體成員。通過N鍵可以修改相應名稱。
創建好結構體后,可以將鼠標放在要被定義的這個位置處,然后執行菜單”Edit/Structs/Sturcuvar“命令,或者快捷鍵alt+Q,然后選擇student結構體。這時對應的數據會被標識為相應的結構體。然后在對應的代碼位置x00401006處,選擇需要重新定義的數據,如[esi+18h] 通過”Edit/Operand types/Offset/Offset(Struct)“或者快捷鍵T可將相應位置的代碼修改為有意義的結構體名稱。

 

三、在linux中安裝ida
wine安裝(官網)-->安裝ida(不安裝python27 x64)-->下載 Python 2.7 的 MSI 文件,命令行下執行:wine64 msiexec /i python-2.7.15.amd64.msi
wine安裝的文件在/home/.wine/drive_c/中,這個相當與windows的c盤


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM