跟羽夏學 Ghidra ——視窗

2022-09-13 15:06:38

寫在前面

  此係列是本人一個字一個字碼出來的,包括範例和實驗截圖。本人非計算機專業,可能對本教學涉及的事物沒有了解的足夠深入,如有錯誤,歡迎批評指正。 如有好的建議,歡迎反饋。碼字不易,如果本篇文章有幫助你的,如有閒錢,可以打賞支援我的創作。如想轉載,請把我的轉載資訊附在文章後面,並宣告我的個人資訊和本人部落格地址即可,但必須事先通知我

你如果是從中間插過來看的,請仔細閱讀 跟羽夏學 Ghidra ——簡述 ,方便學習本教學。請認準 部落格園寂靜的羽夏 ,目前僅在該平臺釋出。

前言

  如果通過Ghidra圖形介面來進行逆向分析工作,那麼打交道最多的是各種形形色色的視窗,每個視窗各司其職,各有各的功能,這也是本教學的第一個重頭戲。下面開始介紹。

CodeBrowser

  CodeBrowser應該是與我們打交道最多的視窗了,它也包含了各種小視窗:

  我們先說一下選單的主要職能:

  • File :提供大多數檔案操作的基本功能,包括開啟/關閉、匯入/匯出、儲存和列印選項。此外,一些選項是Ghidra特有的,例如工具選項,它允許您儲存和操作CodeBrowser工具,並解析C原始碼,它可以通過從C標頭檔案中提取資料型別資訊來幫助反編譯過程。
  • Edit :提供與編輯相關的操作。其中Tool Options命令會開啟一個新視窗,允許你控制與CodeBrowser中可用的許多工具關聯的引數和選項。恢復預設設定按鈕(恢復為預設設定)始終位於右下角。

  • Analysis :允許你重新分析二進位制或選擇性地執行單個分析任務。
  • Navigation :這有助於檔案內的導航。該選單提供了許多應用程式支援的基本導航的功能,併為二進位制檔案新增了特殊的選項。雖然選單提供了一種在檔案中移動的方法,但在獲得導航可用選項的經驗後,您可能會使用工具列選項或快捷方式。
  • Search :提供記憶體、程式文字、字串、地址表、直接參照、指令模式等搜尋功能。
  • Select :提供識別檔案的一部分以用於特定任務的功能。選擇可以基於子例程、函數、控制流,或者只需突出顯示檔案的所需部分。
  • Tools :包括一些有趣的功能,允許您在桌面上放置額外的SRE資源。其中一個最有用的是處理器手冊選項,它將顯示與當前檔案關聯的處理器手冊。如果您試圖開啟丟失的處理器手冊,系統將為你提供包含該手冊的方法(這個需要自己下載放置):

  • Window :允許您為工作流設定Ghidra工作環境。這個選單十分重要,本篇會重點關注。
  • Help :提供豐富、組織良好和非常詳細的選項。幫助視窗支援搜尋、不同檢視、收藏夾、放大/縮小以及列印和頁面設定選項。

  Ghidra有一個十分好的地方就是,任何選單功能和工具列功能,都是可以修改熱鍵的,沒有的可以自行新增:

  下面我們開始逐個輸入它的子表單。

Listing

  Listing視窗左側的邊距提供了有關檔案的重要資訊以及在檔案中的位置。在列表視窗的右側(垂直卷軸的右側)還有一個額外的標記區域,它還提供了重要的資訊和導航功能。卷軸指示您在檔案中的位置,可用於導航。在卷軸的右側是一些資訊顯示,包括書籤,提供了對檔案的更多資訊。

  這個視窗是打交道最多的視窗,這毋庸置疑。這個視窗的標題列右側從左到關閉按鈕各有各的功能,下面從左到右依次介紹:

  • 複製:複製選中內容,如果不可複製,則會顯示錯誤資訊。
  • 貼上:從剪貼簿拷貝到當前位置,如果不可貼上,則會顯示錯誤資訊。
  • 滑鼠懸浮工具提示:如果選中,如果滑鼠遊標懸浮到一個位置,如果有資訊,則會顯示內容。
  • 瀏覽區域調整:這個應該算是能用到的功能,點中它之後,就可以彈出一個調整條,調整顯示資料的寬度:

  • 比較差異:用於比較兩個檔案之間的差異。
  • 快照:建立一個斷開的Listing表單拷貝,也就是無論在新的表單進行任何瀏覽操作,都不會影響到其他表單。這對於同時看兩個函數會十分有用。
  • 概覽區域顯示:它會設定熵和概覽是否顯示。

  下面介紹視窗內的內容:

  • ① 邊距標記:用於指示當前遊標的所在行。
  • ② 跳轉流指示線:跳轉指令如果滿足跳轉到指示。如果是虛線,則為條件跳轉;如果為實線,則為絕對跳轉。
  • ③ 宣告:顯示對函數堆疊框架佈局的最佳推算。Ghidra通過對堆疊指標和函數中使用的任何堆疊影格指標的行為進行詳細分析,計算函數堆疊幀(區域性變數)的結構。
  • ④ 交叉參照:如果某個函數或者資料參照了該地址,就會顯示該條目。如果將遊標懸浮在上面,就會顯示參照的函數組合內容。

Function Graph

  雖然組合列表資訊豐富,但通過檢視基於圖形的顯示,程式流程可能更容易理解。這個功能在IDA中使用空格鍵就可以在組合和圖示之間切換,而在Ghidra,在Window選單中的Function Graph專案中。

  你會看到如下類似表單:

  在圖形模式下,Ghidra一次顯示一個函數。Ghidra通過使用傳統的影象互動技術(如平移和縮放)來進行圖形的導航。大型或複雜的函數可能會導致圖形變得非常雜亂,使圖形難以導航,右下角的衛星檢視就是解決這個問題的。
  Ghidra使用不同顏色的箭頭來區分函數塊之間的各種型別的流。此外,當將滑鼠移到流上以指示方向時,流將變成動畫(見下圖)。以條件跳轉終止的基本塊生成兩種可能的流:預設情況下,滿足跳轉條件的箭頭是綠色,不滿足跳轉條件的為紅色。僅以一個潛在後續塊終止的基本塊使用藍色的線指向要執行的下一個塊。可以單擊任意箭頭以檢視從一個塊到另一個塊的關聯轉換。由於預設情況下圖形和列表工具是同步的,因此在列表檢視和圖形檢視之間切換和導航時,檔案位置通常保持一致。

  當我們滑鼠點選某個程式碼塊,它的背景會顯示一個高亮的光圈,與此同時衛星圖也是:

  如果我們想導航,滑鼠拖住移動可以改變位置:

  滑鼠滾輪可以以滑鼠指標為中心縮放:

  按住Ctrl鍵,可以滑鼠框選多個程式碼塊:

  每個程式碼塊的位置都是可以拖動的:

  我們也可以將程式碼塊組合/解散:

  當然,這些都是一個個功能小小的縮影,具體細節就不扒了,比如右鍵選單的專案,下面我們先介紹幾個特殊的,先從程式碼塊視窗開始:

  標題列右上角的按鈕從左到右,依次介紹:

  • 背景色設定:該按鈕可以設定該程式碼塊的背景色。
  • 交叉參照:點選該按鈕就會顯示該程式碼塊的交叉參照。

  • 全螢幕:將程式碼塊部分全螢幕顯示。全螢幕之後該按鈕圖示改變,再次點選恢復。
  • 組合:將程式碼塊進行組合。
  • 恢復組合:將原來的程式碼塊重新組合。

  下面介紹Function Graph右上角的幾個按鈕,去掉開頭的複製貼上倆按鈕,去除最後一個關閉按鈕,開始從左往右依次介紹:

  • 跳轉到函數頭:該按鈕可以跳轉到所在函數的首地址。
  • 重新整理:重新載入程式碼塊圖形。
  • 重新佈局:該按鈕可以更改程式碼塊各種佈局,自己可以自行挑選。
  • 程式碼塊區域修改:和Listing的瀏覽區域調整的功能是一樣的。
  • 程式碼塊焦點流線:設定當某個程式碼塊獲得焦點時,程式碼流指示線的樣式。
  • 快照:建立一個斷開的Function Graph表單拷貝,也就是無論在新的表單進行任何瀏覽操作,都不會影響到其他表單。這對於同時看兩個函數會十分有用。

Program Trees

  此視窗顯示了組織為資料夾和片段的程式,併為您提供了在自動分析期間優化組織的能力。片段是地址連續範圍的Ghidra術語。

  它是一個連線的視窗,因此單擊視窗中的片段可以將您導航到列表視窗中的該位置。

Symbol Tree

  將檔案匯入到Ghidra專案中時,將選擇Ghidra載入程式模組載入檔案內容。當以二進位制形式存在時,載入器能夠提取符號表資訊。Symbol Tree視窗包括與程式相關的匯入、匯出、函數、標籤、類和名稱空間。

  這個視窗是十分重要的,提供了類似於命令列工具的功能,如objdumpreadelfdumpbin。下面詳細介紹每個資料夾的職責。

Import

  該資料夾列出了被分析的二進位制檔案匯入的所有函數。只有當二進位制檔案使用共用庫時,它才有用。靜態連結的二進位制檔案沒有外部依賴,因此沒有匯入。它列出匯入的庫,其中包含從該庫匯入的每個項(函數或資料)的條目。單擊符號樹檢視中的任何符號將所有連線的顯示跳轉到選定符號。

Exports

  該資料夾列出了檔案中的入口點。這些包括程式的執行入口點,如在其頭部分中指定的,以及檔案匯出供其他檔案使用的任何函數和變數。匯出的函數通常在共用庫中找到。匯出的條目按名稱列出,當選擇匯出時,相應的虛擬地址將在列表視窗中突出顯示。對於可執行檔案,該資料夾始終至少包含一個條目——程式入口。Ghidra根據二進位制檔案的型別將該符號命名為entry或者_start

Functions

  該資料夾包含Ghidra在二進位制檔案中識別的每個函數的列表。如下圖所示,將滑鼠懸停在符號樹視窗中的函數名上會生成一個彈出視窗,其中包含函數的詳細資訊。作為載入過程的一部分,載入程式使用各種演演算法,包括檔案結構分析和位元組序列匹配,以推斷用於建立檔案的編譯器。在分析階段,函數ID分析器利用編譯器標識資訊來執行基於雜湊的函數體匹配,以便標識可能已連結到二進位制的庫函數體的存在。當進行雜湊匹配時,Ghidra從雜湊資料庫(包含在Ghidra.fidbf檔案中)檢索匹配的函數名稱,並將該名稱新增為函數符號。雜湊匹配在解構二進位制檔案上特別有用,因為它提供了一種獨立於符號表存在的符號恢復方法。

Labels

  該資料夾是與Functions資料夾等效的資料。二進位制符號表中包含的任何資料符號都將列在該資料夾中。此外,無論何時向資料地址新增新標籤名稱,該標籤都將新增到Labels資料夾中。

Classes

  資料夾包含Ghidra在分析階段識別的每個類的條目。在每一項下,Ghidra列出了識別的資料和方法,這些資料和方法可以幫助理解類的行為。

Namespaces

  在該資料夾中,Ghidra可以建立新的名稱空間以提供組織方式,並確保分配的名稱在二進位制檔案中不衝突。例如,可以為每個已標識的外部庫或使用跳轉表的每個switch語句建立名稱空間。

Data Type Manager

  該視窗允許您使用資料型別存檔系統定位、組織資料型別並將其應用於檔案。檔案代表了Ghidra對預定義資料型別的累積知識,這些資料型別是從最流行的編譯器包含的標頭檔案中收集的。通過處理標頭檔案,Ghidra可以理解公共庫函數所期望的資料型別,並可以相應地註釋反組合和反編譯器列表。類似地,從這些標頭檔案中,Ghidra瞭解複雜資料結構的大小和佈局。所有這些資訊都收集到存檔檔案中,並在分析二進位制檔案時應用。
  即使沒有載入程式,內建型別樹的根也會顯示在資料型別管理器視窗(CodeBrowser視窗的左下角)中,其中包含無法在資料型別存檔中更改、重新命名或移動的基本型別,如int。除了內建型別之外,Ghidra還支援建立使用者定義的資料型別,包括結構、聯合、列舉和型別定義。它還支援陣列和指標作為派生資料型別。

  更多詳情使用介紹,將會在之後使用中涉及。

Console

  CodeBrowser視窗底部的Console視窗用作Ghidra的外掛和指令碼輸出區域,包括自己開發的外掛和指令碼,並且是在處理檔案時查詢Ghidra正在執行的任務資訊的地方。

Decompiler

  Decompiler反編譯器視窗允許通過連線的視窗同時檢視和操作二進位制檔案的組合和C表示。Ghidra反編譯器生成的C表示並不總是完美的(所以不要過度依賴),但它在幫助您理解二進位制檔案方面非常有用。反編譯器提供的基本功能包括恢復表示式、變數、函數引數和結構欄位。反編譯器通常還能夠恢復函數的塊結構,這種塊結構在組合語言中往往變得模糊。
  反編譯器視窗顯示Listing視窗中所選函數的C表示。根據您使用組合語言的經驗,反編譯程式碼可能比Listing視窗中的程式碼更容易理解。即使是初學者也應該能夠識別反編譯函數中的無限迴圈。

  如果要比較多個函數的反編譯版本,或者在列表視窗中移動到其他位置時繼續檢視特定函數,可以使用快照按鈕開啟其他(斷開連線的)反編譯器視窗。匯出按鈕允許您將反編譯函數儲存到C檔案中。
  反編譯是一個非常複雜的過程,反編譯理論仍然是一個活躍的研究領域。與反組合不同,反組合的準確性可以根據製造商的參考手冊進行驗證。事實上,雖然Ghidra的反編譯器總是生成C原始碼,但反編譯器正在分析的二進位制檔案可能最初是用C以外的語言編寫的,反編譯器的許多面向C的假設可能根本不成立。
  與大多數複雜的外掛一樣,反編譯器也有一些特性,其輸出的質量在很大程度上取決於輸入的質量。反編譯器視窗中的許多問題和不規則性可以追溯到底層反組合的問題,因此如果反編譯程式碼沒有意義,您可能需要花費時間改進反組合的質量。在大多數情況下,這涉及使用更精確的資料型別資訊註釋反組合,這將在之後的博文中討論。
  這個視窗十分重要,之後會在實驗中繼續介紹如何配合使用。

Bytes

  該視窗提供了檔案位元組級內容的原始檢視。預設情況下,位元組視窗在CodeBrowser的右上角開啟,並提供程式內容的標準十六進位制轉儲顯示,每行16位元組。該視窗兼作十六進位制編輯器,可以使用視窗工具列中的設定工具設定為顯示各種格式(扳手圖示)。在許多情況下,將ASCII顯示新增到位元組視窗可能會有幫助。

Defined Data

  該資料視窗顯示當前程式、檢視或選擇中定義的資料的字串表示,以及相關的地址、型別和大小。與大多數列視窗一樣,您可以通過單擊列標題按升序或降序對任何列進行排序。雙擊視窗中的任何行會導致列表視窗跳轉到選定項的地址。
  當與交叉參照一起使用時,定義的資料視窗提供了一種方法,可以快速發現一個感興趣的專案,並只需點選幾次即可跟蹤到程式中參照該專案的任何位置。

  當然,該列表可以設定過濾器,只需點選該視窗標題列上的齒輪按鈕:

  每次設定資料型別過濾器時,Ghidra將根據新設定重新生成定義的資料視窗內容。

Defined Strings

  該視窗顯示已在二進位制檔案中定義的字串,可以通過右鍵單擊列標題行來新增列。可能最有用列之一是Has Encoding Error標誌,它可能表示字元集問題或字串識別錯誤。除此視窗外,Ghidra中還提供了大量字串搜尋功能。

Symbol Table

  該視窗提供二進位制檔案中所有全域性名稱的摘要列表。預設情況下顯示八列,如下圖所示。該視窗具有高度可設定性,可以在顯示中新增和刪除列,以及在任何列上按升序或降序排序。前兩個預設列是名稱和位置。名稱只不過是在某個位置定義的符號的符號描述。

  符號表連線到Listing視窗,但提供控制其與列表視窗互動的能力。雙擊任何符號表位置條目將立即跳轉到列表檢視以顯示所選條目。這為快速導航到程式列表中的已知位置提供了一個有用的工具。
  同樣,它也可以設定過濾器(齒輪圖示),用於過濾自己需要的資訊。

Symbol References

  和Symbol Table差不多。此外,該視窗的內容由右上角的三個圖示(SID)控制。這些選項相互排斥,意味著一次只能選擇一個選項:

  • S :選擇此圖示時,視窗將顯示在符號表中選擇的符號的所有參照。
  • I :選擇此圖示後,視窗將顯示您在符號表中選擇的函數的所有指令參照。
  • D :選擇此圖示後,視窗將顯示您在符號表中選擇的函數的所有資料參照。如果未選擇函數入口點或函數未參照任何資料符號,則此列表將為空。

Memory Map

  該視窗顯示程式中存在的記憶體塊的摘要列表。請注意,當討論二進位制檔案的結構時,Ghidra術語記憶體塊通常被稱為節。視窗中顯示的資訊包括記憶體塊(段)名稱、開始和結束地址、長度、許可權標誌、塊型別、初始化標誌,以及原始檔名和使用者註釋的空間。起始地址和結束地址表示程式段在執行時對映到的虛擬地址範圍。

  雙擊視窗中的任何開始或結束地址,將列表視窗(以及所有其他連線的視窗)跳轉到指定地址。視窗工具列提供了新增/刪除塊、移動塊、拆分/合併塊、編輯地址和設定基址的選項。當使用非標準格式反向工程檔案時,這些功能特別有用,因為Ghidra載入程式可能沒有檢測到二進位制檔案的段結構。

Function Call Graph

  在任何程式中,一個函數既可以呼叫,也可以被其他函數呼叫。函數呼叫圖視窗顯示給定函數的近鄰。出於我們的目的,如果Y直接呼叫XX直接呼叫Y,我們將Y稱為X的近鄰。當您開啟函數呼叫圖視窗時,Ghidra確定遊標所在函數的鄰居,並生成相關顯示。此顯示在程式檔案中使用的上下文中顯示函數,但它只是全域性的一部分。

總結

  在本篇當中,我們介紹了基本常用的視窗,並做了詳細的瞭解。當然學會這些不是特別夠,這些並不完整,算是個拋磚引玉,剩餘的功能還請自行探索。
  下一篇,我們就開始接觸逆向的部分,正式走入Ghidra的世界。

下一篇

  跟羽夏學 Ghidra ——資料