在默認配置下,IDA(從 6.1 版開始)會在對新二進制文件的初始加載和分析階段創建 7 個顯示窗口
3 個立即可見的窗口分別為 IDA-View 窗口、函數窗口和消息輸出窗口
可以通過 View -> Open Subviews 菜單打開這些窗口
在 IDA 中,ESC 鍵是一個非常有用的熱鍵
在反匯編窗口中,ESC 鍵的作用與Web瀏覽器的“后退”按鈕類似
在打開的其他窗口中,ESC 鍵用於關閉窗口
反匯編窗口
反匯編窗口也叫 IDA-View 窗口,它是操作和分析二進制文件的主要工具
反匯編窗口有兩種顯示格式:默認的基於圖形的視圖和面向文本的列表視圖
可以使用空格鍵在圖形視圖與列表視圖之間切換
IDA 圖形視圖
圖形視圖將一個函數分解成許多基本塊,以生動顯示該函數由一個塊到另一個塊的控制流程
基本塊是一個不包含分支,從頭執行到尾的最大指令序列
基本塊中的第一條指令通常是分支指令的目標,而最后一條指令則往往是一條分支指令
IDA 使用不同的彩色箭頭區分函數塊之間各種類型的流
正常流(也叫做普通流)表示指令默認連續執行,跳轉流表示當前的指令跳轉到(或可能跳轉到)某個非連續性位置,調用流表示當前指令會調用一個子例程
根據測試條件,在條件跳轉位置終止的基本塊可能會生成兩種流:Yes 邊的箭頭(是的,執行分支)默認為綠色,No 邊的箭頭(不,不執行分支)默認為紅色
只有一個后繼塊的基本塊會利用一個正常邊(默認為藍色)指向下一個即將執行的塊
在圖形模式下,IDA 一次顯示一個函數
使用滑輪鼠標的用戶,可以使用“CTRL+鼠標滑輪”來調整圖形的大小
概況窗口始終顯示圖形完整的塊狀結構,並用一個虛線框指出你當前在反匯編窗口中查看的圖形區域
可以用鼠標在概況窗口中拖動該虛線框,以迅速將圖形視圖調整到任何想到的位置
控制圖形視圖的顯示方式:
1.平移。首先,除了使用“圖形概況”窗口迅速定位圖形外,你還可以通過單擊和拖動圖形視圖的背景來定位圖形
2.重新調整塊位置。通過單擊指定塊的標題欄並將其拖動到一個新位置,用戶可以移動圖形中的每一個塊的位置
IDA 會盡可能少地重新設定一個被移動的塊的連接線的位置,即連接兩個塊的帶箭頭的折線
如果想還原默認的圖形布局,可以右擊圖形,並選擇 Layout Graph
可以拖動連接線的頂點,手動更改連接線的路徑
在按下 shift 鍵的同時,在連接線的任何位置雙擊鼠標,即可在該位置添加一個新頂點
3.分組和折疊塊。可以對塊分組,每個塊單獨分組,或者與其他塊一起分組,並可將分組后的塊折疊起來,以減少顯示的混亂程度
折疊塊可以幫助追蹤已經分析過的塊,要折疊塊,可以右擊塊的標題欄,然后選擇 Group Nodes
4.創建其他反匯編窗口。如果想要同時查看兩個不同函數的圖形,可以通過 Views -> Open Subviews -> Disassembly 命令打開另一個反匯編窗口
這樣打開的第一個反匯編窗口叫做 IDA View-A,隨后的反匯編窗口叫做 IDA View-B、IDA View-C,依次類推
每個反匯編窗口都獨立於其他窗口,可以在一個窗口中查看一個圖形,在另一個窗口中查看文本列表,或者在 3 個不同的窗口中查看 3 個不同的圖形
IDA 文本視圖
面向文本的反匯編窗口是查看和操作 IDA 生成的反匯編代碼的傳統顯示窗口
文本顯示窗口會呈現一個程序的完整反匯編代碼清單(而在圖形模式下一次只能顯示一個函數),用戶只有通過這個窗口才能查看一個二進制文件的數據部分
圖形顯示窗口中的所有信息均以某種形式存在於文本顯示窗口中
在使用圖形視圖時,獲得的有關每一個反匯編代碼行的信息似乎要更少一些
因為 IDA 隱藏了許多與每個反匯編行有關的更加傳統的信息(如虛擬地址信息),以最大限度地減少顯示每個基本塊所需的空間
要想顯示與每個反匯編行有關的其他信息,可以通過 Options -> General 命令打開 IDA 常規選項,然后在 Disassembly 選項卡的可用的反匯編行部分選擇相應的選項
例如,要給每一個反匯編行添加虛擬地址,可以啟用“行前綴”
啟用行前綴
函數的文本視圖列表如下圖
窗口中的反匯編代碼分行顯示,虛擬地址則默認顯示
通常,虛擬地址以 [ 區域名稱 ]:[ 虛擬地址 ] 這種格式顯示,如 .text:00401589
顯示窗口的左邊部分叫做箭頭窗口(1),用於描述函數中的非線性流程
實線箭頭表示非條件跳轉,虛線箭頭則表示條件跳轉
如果一個跳轉(條件或非條件)將控制權轉交給程序中的某個地址(以前的),這時會使用粗線(實線或虛線)
出現這類逆向流程,通常表示程序中存在循環
在上圖中,地址 0040158E 至 00401592 之間就有一個循環箭頭
位置 1 的聲明(也出現在圖形視圖中)是 IDA 對於函數棧幀布局的最准確估算
IDA 會對函數棧指針及函數使用的任何棧幀指針的行為進行仔細分析,從而計算出該函數的棧幀的結構
棧幀(或激活記錄)是在程序的運行時棧中分配的一個內存塊,其中包含傳遞給一個函數的參數和該函數聲明的局部變量
棧幀在函數的入口點位置分配,並在函數退出時釋放
位置 2 的注釋(以分號開頭)屬於交叉引用
代碼交叉引用(而不是數據交叉引用),它表示另一個程序指令將控制權轉交給交叉引用注釋所在位置的指令
函數窗口
函數窗口用於列舉 IDA 在數據庫中識別的每一個函數
Functions 窗口中的條目如下所示:
在二進制文件中虛擬地址為 0040E600 的 .text 部分找到 scanf 函數,該函數長為 41 字節(十六進制為 29 字節)
它返回調用方( R ),並使用 EBP 寄存器( B )引用它的局部變量
雙擊 Functions 窗口中的一個條目,反匯編窗口將跳轉到選定函數所在的位置
輸出窗口
打開一個新文件時,IDA 工作區底部的輸出窗口與其他窗口一起組成了 IDA 的默認窗口
輸出窗口是 IDA 的輸出控制台,從中可以找到與 IDA 所執行的任務有關的信息
例如,初次打開一個二進制文件時,IDA 將生成消息,指出它在某個時刻所處的分析階段,以及它為創建新數據庫而執行的操作
當你使用數據庫時,輸出窗口將輸出你所執行的各種操作的狀態
可以將輸出窗口中的內容復制到系統剪貼板中,也可以右擊窗口的任何位置,並在出現的菜單中選擇相應的操作而完全刪除輸出窗口的內容
通常,輸出窗口是顯示 IDA 開發的任何腳本和插件的輸出的主要窗口