IDA Pro 權威指南學習筆記(七) - 其他 IDA 顯示窗口


默認情況下 IDA 不會打開這些窗口,可通過 View -> Open Subviews 命令打開

Strings 窗口(Strings)

Strings 窗口中顯示的是從二進制文件中提取出的一組字符串,以及每個字符串所在的地址

雙擊 Strings 窗口中的任何字符串,反匯編窗口和十六進制窗口將跳轉到該字符串所在的地址

將 Strings 窗口與交叉引用相結合,可迅速定位感興趣的字符串,並追蹤到程序中任何引用該字符串的位置

例如,看到 SOFTWARE\Microsoft\Windows\CurrentVersion\Run 這個字符串,並想知道應用程序為什么會引用這個特殊的 Windows 注冊表項

每次打開 Strings 窗口,IDA 都會掃描或重新掃描整個數據庫,查找其中的字符串

掃描字符串的操作遵照 Strings 窗口的設置來完成,右擊該窗口,在出現的菜單中選擇 Setup,即可開始設置

Setup Strings 窗口用於指定 IDA 應掃描的字符串類型

IDA 默認掃描的字符串類型為至少包含 5 個字符的 C 風格、以 null 結尾的 7 位 ASCII 字符串

每次單擊 OK 按鈕關閉 Setup Strings 窗口后,IDA 都會根據新的設置重新掃描數據庫,查找相應的字符串

Display only defined strings(僅顯示已定義的字符串),這個選項使 Strings 窗口僅顯示 IDA 自動創建或用戶手動創建的已命名字符串數據項

在選中這個選項的同時禁用所有其他選項,IDA 將不會自動掃描其他類型的字符串

Ignore instructions/data definitions(忽略指令/數據定義),這個選項會使 IDA 掃描指令和現有數據定義中的字符串

使用這個選項,可以讓 IDA 掃描二進制代碼中錯誤地轉換成指令的字符串,或掃描數據中非字符串格式(如字節數組或整數)的字符串

這個選項還會導致 IDA 生成許多垃圾字符串,即那些由 5 個或更多 ASCII 字符構成的字符串(無論其是否合法)

使用這個選項的效果類似於使用 strings -a 命令

Names 窗口(Names)

Names 窗口簡要列舉了一個二進制文件的所有全局名稱

名稱是指對一個程序虛擬地址的符號描述

名稱可以按字母排序,也可以按虛擬地址排序(升序或降序)

雙擊 Names 窗口中的名稱,可跳轉到顯示該名稱的反匯編視圖

Names 窗口中顯示的名稱采用了顏色和字母編碼:

f 為常規函數,IDA 認為這些函數不屬於庫函數

i 為導入的名稱,通常為共享庫導入的函數名稱

它與庫函數的區別在於:導入的名稱沒有代碼,而庫函數的主體將在反匯編代碼清單中顯示

D 為數據,已命名數據的位置通常表示全局變量

C 為命名代碼,這些是已命名的程序指令位置,IDA 認為它們不屬於任何函數

當 IDA 在程序的符號表中找到一個名稱,但沒發現對程序位置的任何調用時,就會出現這種情況

A 為字符串數據,這是一個被引用的數據位置,其中包含的一串字符符合 IDA 的某種已知的字符串數據類型,如以 '\0' 字節結束的 ASCII 字符串

在對一個程序進行反匯編的過程中,IDA 會為所有直接作為代碼(分支或調用目標)或數據(讀取的、寫入的或使用的地址)引用的位置生成名稱

如果一個位置已在程序符號表中命名,IDA 將采用該名稱

如果符號表中某一程序位置沒有名稱,則 IDA 會生成一個默認的名稱,以在反匯編過程中使用

在 IDA 給某個位置命名時,它會使用該位置的虛擬地址和一個表示該位置的類型的前綴進行命名

將虛擬地址合並到生成的名稱中,可確保生成的所有名稱的唯一性,因為沒有兩個位置的虛擬地址是相同的,這種自動生成的名稱並不在 Names 窗口中顯示

用於自動生成名稱的一些常用前綴:

sub_xxxxxx:地址 xxxxxx 處的子例程

loc_xxxxxx:地址 xxxxxx 處的一個指令

byte_xxxxxx:位置 xxxxxx 處的 8 位數據

word_xxxxxx:位置 xxxxxx 處的 16 位數據

dword_xxxxxx:位置 xxxxxx 處的 32 位數據

unk_xxxxxx:位置 xxxxxx 處的大小未知的數據

段窗口(Segments)

段窗口顯示的是在二進制文件中出現的段的簡要列表

在討論二進制文件的結構時,IDA 術語段(segment)常稱為節(section)

段窗口中顯示的信息包括段名稱、起始和結束地址以及許可標志

起始和結束地址代表程序段在運行時對應的虛擬地址范圍

雙擊段窗口中的任何條目,IDA 將跳轉到反匯編窗口中該段的起始位置

右擊一個條目,IDA 將顯示一個上下文菜單,你可以選擇添加新段、刪除現有段、或者編輯現有段的屬性

段窗口所對應的命令行工具包括 objdump (-h) 、 readelf (-s) 和 dumpbin (/HEADERS)

簽名窗口(Signatures)

簽名窗口顯示的是 IDA 對打開的二進制文件所使用的簽名

簽名用於識別由編譯器生成的常用啟動順序,以確定可能已被用來構建給定二進制文件的編譯器

簽名還可用於將函數划歸為由編譯器插入的已知庫函數,或者因為靜態鏈接而添加到二進制文件中的函數

IDA 對該二進制文件應用了 vcseh 簽名(來自<IDADIR>/sigs目錄),並在這個過程中將 0 個函數識別為庫函數

至少在兩種情況下,需要知道如何對二進制文件應用其他簽名:

第一種情況:IDA 無法識別用於構建二進制文件的編譯器,因而無法選擇所需的相應簽名

這時,需要根據自己的初步分析,確認 IDA 應嘗試使用的簽名,並迫使 IDA 使用一個或幾個簽名

第二種情況:IDA 中沒有針對某些庫的現成簽名,這時需要自己為這些庫創建你自己的簽名

類型庫窗口(Type libraries)

類型庫保存 IDA 積累的一些信息,即 IDA 從最常用的編譯器的頭文件中搜集到的有關預定義數據類型和函數原型的信息

通過處理頭文件,IDA 可確定常用庫函數所需的數據類型,並為反匯編代碼提供相應的注釋

IDA 還可從這些頭文件中了解復雜數據結構的大小和布局所有這些信息都收集在 TIL 文件(<IDADIR/til 目錄>)中,並可在任何時候應用於分析的二進制文件

與應用簽名時一樣,在選擇加載一組適當的 TIL 文件之前,IDA 必須首先確定一個程序所使用的庫

要請求 IDA 加載其他類型庫,可以在類型庫窗口中按下 INSERT 鍵,或右擊窗口並在出現的菜單中選擇 Load Type Library(加載類型庫)

函數調用窗口(Function calls)

如果 Y 函數直接調用 X 函數,或者 X 函數直接調用 Y 函數,則稱 Y 函數是 X 函數的近鄰

打開函數調用窗口時,IDA 會確定光標所在位置的函數的“近鄰”

函數 ___pow5mult_D2A 被 ___gdtoa 從 3 個不同的位置調用,被 ___strtodg 從 2 個不同的位置調用,而這個函數又調用了另外 9 個函數

雙擊函數調用窗口中的任何一行,IDA 將跳轉到反匯編窗口中對應的調用或被調用函數(即調用方或被調用方)

IDA 交叉引用(xrefs)是用於生成函數調用窗口的機制

問題窗口(Problems)

IDA 在問題窗口中顯示它在反匯編二進制文件時遇到的困難,以及它如何處理這些困難

每個問題都注明了問題發生的地址、問題的類型以及問題所在位置的指令

在上圖中,有一個 NODISASM 問題和一個 DECISION 問題

DECISION 問題通常表示 IDA 決定將一個地址上的字節作為指令而非數據進行反匯編,即使這個地址在遞歸下降指令遍歷過程中從未被引用也是如此


免責聲明!

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



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