此係列是本人一個字一個字碼出來的,包括範例和實驗截圖。本人非計算機專業,可能對本教學涉及的事物沒有了解的足夠深入,如有錯誤,歡迎批評指正。 如有好的建議,歡迎反饋。碼字不易,如果本篇文章有幫助你的,如有閒錢,可以打賞支援我的創作。如想轉載,請把我的轉載資訊附在文章後面,並宣告我的個人資訊和本人部落格地址即可,但必須事先通知我。
你如果是從中間插過來看的,請仔細閱讀 跟羽夏學 Ghidra ——簡述 ,方便學習本教學。請認準 部落格園 的 寂靜的羽夏 ,目前僅在該平臺釋出。
如果通過Ghidra
圖形介面來進行逆向分析工作,那麼打交道最多的是各種形形色色的視窗,每個視窗各司其職,各有各的功能,這也是本教學的第一個重頭戲。下面開始介紹。
CodeBrowser
應該是與我們打交道最多的視窗了,它也包含了各種小視窗:
我們先說一下選單的主要職能:
Ghidra
特有的,例如工具選項,它允許您儲存和操作CodeBrowser
工具,並解析C
原始碼,它可以通過從C
標頭檔案中提取資料型別資訊來幫助反編譯過程。Tool Options
命令會開啟一個新視窗,允許你控制與CodeBrowser
中可用的許多工具關聯的引數和選項。恢復預設設定按鈕(恢復為預設設定)始終位於右下角。
SRE
資源。其中一個最有用的是處理器手冊選項,它將顯示與當前檔案關聯的處理器手冊。如果您試圖開啟丟失的處理器手冊,系統將為你提供包含該手冊的方法(這個需要自己下載放置):
Ghidra
工作環境。這個選單十分重要,本篇會重點關注。 Ghidra
有一個十分好的地方就是,任何選單功能和工具列功能,都是可以修改熱鍵的,沒有的可以自行新增:
下面我們開始逐個輸入它的子表單。
Listing
視窗左側的邊距提供了有關檔案的重要資訊以及在檔案中的位置。在列表視窗的右側(垂直卷軸的右側)還有一個額外的標記區域,它還提供了重要的資訊和導航功能。卷軸指示您在檔案中的位置,可用於導航。在卷軸的右側是一些資訊顯示,包括書籤,提供了對檔案的更多資訊。
這個視窗是打交道最多的視窗,這毋庸置疑。這個視窗的標題列右側從左到關閉按鈕各有各的功能,下面從左到右依次介紹:
Listing
表單拷貝,也就是無論在新的表單進行任何瀏覽操作,都不會影響到其他表單。這對於同時看兩個函數會十分有用。下面介紹視窗內的內容:
Ghidra
通過對堆疊指標和函數中使用的任何堆疊影格指標的行為進行詳細分析,計算函數堆疊幀(區域性變數)的結構。 雖然組合列表資訊豐富,但通過檢視基於圖形的顯示,程式流程可能更容易理解。這個功能在IDA
中使用空格鍵就可以在組合和圖示之間切換,而在Ghidra
,在Window
選單中的Function Graph
專案中。
你會看到如下類似表單:
在圖形模式下,Ghidra
一次顯示一個函數。Ghidra
通過使用傳統的影象互動技術(如平移和縮放)來進行圖形的導航。大型或複雜的函數可能會導致圖形變得非常雜亂,使圖形難以導航,右下角的衛星檢視就是解決這個問題的。
Ghidra
使用不同顏色的箭頭來區分函數塊之間的各種型別的流。此外,當將滑鼠移到流上以指示方向時,流將變成動畫(見下圖)。以條件跳轉終止的基本塊生成兩種可能的流:預設情況下,滿足跳轉條件的箭頭是綠色,不滿足跳轉條件的為紅色。僅以一個潛在後續塊終止的基本塊使用藍色的線指向要執行的下一個塊。可以單擊任意箭頭以檢視從一個塊到另一個塊的關聯轉換。由於預設情況下圖形和列表工具是同步的,因此在列表檢視和圖形檢視之間切換和導航時,檔案位置通常保持一致。
當我們滑鼠點選某個程式碼塊,它的背景會顯示一個高亮的光圈,與此同時衛星圖也是:
如果我們想導航,滑鼠拖住移動可以改變位置:
滑鼠滾輪可以以滑鼠指標為中心縮放:
按住Ctrl
鍵,可以滑鼠框選多個程式碼塊:
每個程式碼塊的位置都是可以拖動的:
我們也可以將程式碼塊組合/解散:
當然,這些都是一個個功能小小的縮影,具體細節就不扒了,比如右鍵選單的專案,下面我們先介紹幾個特殊的,先從程式碼塊視窗開始:
標題列右上角的按鈕從左到右,依次介紹:
下面介紹Function Graph
右上角的幾個按鈕,去掉開頭的複製貼上倆按鈕,去除最後一個關閉按鈕,開始從左往右依次介紹:
Listing
的瀏覽區域調整的功能是一樣的。Function Graph
表單拷貝,也就是無論在新的表單進行任何瀏覽操作,都不會影響到其他表單。這對於同時看兩個函數會十分有用。 此視窗顯示了組織為資料夾和片段的程式,併為您提供了在自動分析期間優化組織的能力。片段是地址連續範圍的Ghidra
術語。
它是一個連線的視窗,因此單擊視窗中的片段可以將您導航到列表視窗中的該位置。
將檔案匯入到Ghidra
專案中時,將選擇Ghidra
載入程式模組載入檔案內容。當以二進位制形式存在時,載入器能夠提取符號表資訊。Symbol Tree
視窗包括與程式相關的匯入、匯出、函數、標籤、類和名稱空間。
這個視窗是十分重要的,提供了類似於命令列工具的功能,如objdump
、readelf
和dumpbin
。下面詳細介紹每個資料夾的職責。
該資料夾列出了被分析的二進位制檔案匯入的所有函數。只有當二進位制檔案使用共用庫時,它才有用。靜態連結的二進位制檔案沒有外部依賴,因此沒有匯入。它列出匯入的庫,其中包含從該庫匯入的每個項(函數或資料)的條目。單擊符號樹檢視中的任何符號將所有連線的顯示跳轉到選定符號。
該資料夾列出了檔案中的入口點。這些包括程式的執行入口點,如在其頭部分中指定的,以及檔案匯出供其他檔案使用的任何函數和變數。匯出的函數通常在共用庫中找到。匯出的條目按名稱列出,當選擇匯出時,相應的虛擬地址將在列表視窗中突出顯示。對於可執行檔案,該資料夾始終至少包含一個條目——程式入口。Ghidra
根據二進位制檔案的型別將該符號命名為entry
或者_start
。
該資料夾包含Ghidra
在二進位制檔案中識別的每個函數的列表。如下圖所示,將滑鼠懸停在符號樹視窗中的函數名上會生成一個彈出視窗,其中包含函數的詳細資訊。作為載入過程的一部分,載入程式使用各種演演算法,包括檔案結構分析和位元組序列匹配,以推斷用於建立檔案的編譯器。在分析階段,函數ID
分析器利用編譯器標識資訊來執行基於雜湊的函數體匹配,以便標識可能已連結到二進位制的庫函數體的存在。當進行雜湊匹配時,Ghidra
從雜湊資料庫(包含在Ghidra.fidbf
檔案中)檢索匹配的函數名稱,並將該名稱新增為函數符號。雜湊匹配在解構二進位制檔案上特別有用,因為它提供了一種獨立於符號表存在的符號恢復方法。
該資料夾是與Functions
資料夾等效的資料。二進位制符號表中包含的任何資料符號都將列在該資料夾中。此外,無論何時向資料地址新增新標籤名稱,該標籤都將新增到Labels
資料夾中。
資料夾包含Ghidra
在分析階段識別的每個類的條目。在每一項下,Ghidra
列出了識別的資料和方法,這些資料和方法可以幫助理解類的行為。
在該資料夾中,Ghidra
可以建立新的名稱空間以提供組織方式,並確保分配的名稱在二進位制檔案中不衝突。例如,可以為每個已標識的外部庫或使用跳轉表的每個switch
語句建立名稱空間。
該視窗允許您使用資料型別存檔系統定位、組織資料型別並將其應用於檔案。檔案代表了Ghidra
對預定義資料型別的累積知識,這些資料型別是從最流行的編譯器包含的標頭檔案中收集的。通過處理標頭檔案,Ghidra
可以理解公共庫函數所期望的資料型別,並可以相應地註釋反組合和反編譯器列表。類似地,從這些標頭檔案中,Ghidra
瞭解複雜資料結構的大小和佈局。所有這些資訊都收集到存檔檔案中,並在分析二進位制檔案時應用。
即使沒有載入程式,內建型別樹的根也會顯示在資料型別管理器視窗(CodeBrowser
視窗的左下角)中,其中包含無法在資料型別存檔中更改、重新命名或移動的基本型別,如int
。除了內建型別之外,Ghidra
還支援建立使用者定義的資料型別,包括結構、聯合、列舉和型別定義。它還支援陣列和指標作為派生資料型別。
更多詳情使用介紹,將會在之後使用中涉及。
CodeBrowser
視窗底部的Console
視窗用作Ghidra
的外掛和指令碼輸出區域,包括自己開發的外掛和指令碼,並且是在處理檔案時查詢Ghidra
正在執行的任務資訊的地方。
Decompiler
反編譯器視窗允許通過連線的視窗同時檢視和操作二進位制檔案的組合和C
表示。Ghidra
反編譯器生成的C
表示並不總是完美的(所以不要過度依賴),但它在幫助您理解二進位制檔案方面非常有用。反編譯器提供的基本功能包括恢復表示式、變數、函數引數和結構欄位。反編譯器通常還能夠恢復函數的塊結構,這種塊結構在組合語言中往往變得模糊。
反編譯器視窗顯示Listing
視窗中所選函數的C
表示。根據您使用組合語言的經驗,反編譯程式碼可能比Listing
視窗中的程式碼更容易理解。即使是初學者也應該能夠識別反編譯函數中的無限迴圈。
如果要比較多個函數的反編譯版本,或者在列表視窗中移動到其他位置時繼續檢視特定函數,可以使用快照按鈕開啟其他(斷開連線的)反編譯器視窗。匯出按鈕允許您將反編譯函數儲存到C
檔案中。
反編譯是一個非常複雜的過程,反編譯理論仍然是一個活躍的研究領域。與反組合不同,反組合的準確性可以根據製造商的參考手冊進行驗證。事實上,雖然Ghidra
的反編譯器總是生成C
原始碼,但反編譯器正在分析的二進位制檔案可能最初是用C
以外的語言編寫的,反編譯器的許多面向C
的假設可能根本不成立。
與大多數複雜的外掛一樣,反編譯器也有一些特性,其輸出的質量在很大程度上取決於輸入的質量。反編譯器視窗中的許多問題和不規則性可以追溯到底層反組合的問題,因此如果反編譯程式碼沒有意義,您可能需要花費時間改進反組合的質量。在大多數情況下,這涉及使用更精確的資料型別資訊註釋反組合,這將在之後的博文中討論。
這個視窗十分重要,之後會在實驗中繼續介紹如何配合使用。
該視窗提供了檔案位元組級內容的原始檢視。預設情況下,位元組視窗在CodeBrowser
的右上角開啟,並提供程式內容的標準十六進位制轉儲顯示,每行16
位元組。該視窗兼作十六進位制編輯器,可以使用視窗工具列中的設定工具設定為顯示各種格式(扳手圖示)。在許多情況下,將ASCII
顯示新增到位元組視窗可能會有幫助。
該資料視窗顯示當前程式、檢視或選擇中定義的資料的字串表示,以及相關的地址、型別和大小。與大多數列視窗一樣,您可以通過單擊列標題按升序或降序對任何列進行排序。雙擊視窗中的任何行會導致列表視窗跳轉到選定項的地址。
當與交叉參照一起使用時,定義的資料視窗提供了一種方法,可以快速發現一個感興趣的專案,並只需點選幾次即可跟蹤到程式中參照該專案的任何位置。
當然,該列表可以設定過濾器,只需點選該視窗標題列上的齒輪按鈕:
每次設定資料型別過濾器時,Ghidra
將根據新設定重新生成定義的資料視窗內容。
該視窗顯示已在二進位制檔案中定義的字串,可以通過右鍵單擊列標題行來新增列。可能最有用列之一是Has Encoding Error
標誌,它可能表示字元集問題或字串識別錯誤。除此視窗外,Ghidra
中還提供了大量字串搜尋功能。
該視窗提供二進位制檔案中所有全域性名稱的摘要列表。預設情況下顯示八列,如下圖所示。該視窗具有高度可設定性,可以在顯示中新增和刪除列,以及在任何列上按升序或降序排序。前兩個預設列是名稱和位置。名稱只不過是在某個位置定義的符號的符號描述。
符號表連線到Listing
視窗,但提供控制其與列表視窗互動的能力。雙擊任何符號表位置條目將立即跳轉到列表檢視以顯示所選條目。這為快速導航到程式列表中的已知位置提供了一個有用的工具。
同樣,它也可以設定過濾器(齒輪圖示),用於過濾自己需要的資訊。
和Symbol Table
差不多。此外,該視窗的內容由右上角的三個圖示(S
、I
和D
)控制。這些選項相互排斥,意味著一次只能選擇一個選項:
該視窗顯示程式中存在的記憶體塊的摘要列表。請注意,當討論二進位制檔案的結構時,Ghidra
術語記憶體塊通常被稱為節。視窗中顯示的資訊包括記憶體塊(段)名稱、開始和結束地址、長度、許可權標誌、塊型別、初始化標誌,以及原始檔名和使用者註釋的空間。起始地址和結束地址表示程式段在執行時對映到的虛擬地址範圍。
雙擊視窗中的任何開始或結束地址,將列表視窗(以及所有其他連線的視窗)跳轉到指定地址。視窗工具列提供了新增/刪除塊、移動塊、拆分/合併塊、編輯地址和設定基址的選項。當使用非標準格式反向工程檔案時,這些功能特別有用,因為Ghidra
載入程式可能沒有檢測到二進位制檔案的段結構。
在任何程式中,一個函數既可以呼叫,也可以被其他函數呼叫。函數呼叫圖視窗顯示給定函數的近鄰。出於我們的目的,如果Y
直接呼叫X
或X
直接呼叫Y
,我們將Y
稱為X
的近鄰。當您開啟函數呼叫圖視窗時,Ghidra
確定遊標所在函數的鄰居,並生成相關顯示。此顯示在程式檔案中使用的上下文中顯示函數,但它只是全域性的一部分。
在本篇當中,我們介紹了基本常用的視窗,並做了詳細的瞭解。當然學會這些不是特別夠,這些並不完整,算是個拋磚引玉,剩餘的功能還請自行探索。
下一篇,我們就開始接觸逆向的部分,正式走入Ghidra
的世界。
跟羽夏學 Ghidra ——資料