這個實驗性的 Ghidra 外掛程式可讓您輕鬆處理本機 pcode 模擬。不再需要腳本,只需直接從 Ghidra 使用它即可。它對於使用常見模擬器不支援的各種奇異處理器特別有用。
如果處理器/虛擬機器支援 Ghidra 進行逆向工程,則可以對其進行模擬!例如,eBPF指令仿真示範如下:
本質上,該插件是ghidra.app.emulator
包內類別的擴展包裝器。以下是已實施的內容:
儘管 PCode 仿真在理想情況下意味著統一,但大多數處理器需要自己的方法。請隨時報告您遇到的任何問題。我真的很想測試所有處理器,但這幾乎不可能。
包含所有外掛程式視窗:堆疊視圖、暫存器、斷點視圖和主視窗。
包含用於設定模擬開始和結束、斷點以及將變更的位元組應用於模擬器狀態的熱鍵。
根據需要更改暫存器。設定連結暫存器(綠色箭頭)將幫助模擬器了解哪個暫存器包含返回位址。該插件透過堆疊、lr 暫存器、AARCH64 和 MIPS 暫存器了解其工作原理。如果您有異國情調,請選擇連結寄存器並按下按鈕。
當您在 СodeBrowser 中開啟程式時,GhidraEmu 將自動映射堆疊空間。堆疊指標將設定在堆疊範圍的中間。這允許您在堆疊幀的頂部或底部設定值。如果您在更新或重置時遇到凍結,請滾動它。在模擬過程中,如果程式需要更多的堆疊空間,插件會自動分配。
如果在模擬過程中任何位元組發生變化,您將在經典的 ByteViewer 中看到它們。不用擔心,按下“重置”按鈕後它們將重置為原始值。
如果您進行了更改,請讓模擬器知道更改的位元組(堆疊自動更新 - 不需要)。更改後,選擇它們(它們將呈綠色),然後按此選項(或使用熱鍵“M”)。
這裡插件列印輸出資訊。例如,模擬錯誤訊息如下:
如果您因為某些原因不想模擬目前指令,「跳轉」功能可讓您向前跳轉一條指令。由於如果偵測到嘗試讀取未初始化的內存,仿真過程將中止,因此此功能允許您繞過它。看一個例子。這是許多 x86_64 程式中的第一個指令,金絲雀堆疊保存:
MOV RAX, qword ptr FS:[0x28]
我們將嘗試作一點小作弊並透過增加 PC 值來跳過它。為此,請停在您不想模擬的指令處,然後按J
熱鍵。否則,進一步執行將導致未初始化的記憶體讀取錯誤。
如果您停在導致子程式(內部呼叫)的指令處,並且想要模擬下一條指令之前的所有內容(經典的「跳過」),請按F6
熱鍵,這肯定會發生:
需要考慮的幾個要點:
使用 gradle 建立擴充功能: GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle
並使用 Ghidra 安裝它: File → Install Extensions...
在 CodeBrowser 中,前往File → Configure → Miscellaneous
,然後選取 GhidraEmu 外掛程式的核取方塊。
使用插件時遇到任何錯誤或有改進的想法嗎?不要羞於提出新問題,我會弄清楚的。
EmulatorHelper 限制不允許在另一個程式中使用程式空間。因此,例如,您的外部共享庫永遠不會知道程式記憶體空間,反之亦然。所以你不能將其模擬為一個具有一個記憶體空間的進程。如果我在這裡遺漏了什麼,請告訴我。