Ghidra的各種模塊可以協助PC固件反向工程。這被接受為GSOC 2019的Coreboot項目。
需要JDK 11(或更新)和Ghidra 10.1(或更新)。
使用Ghidra的標準Gradle構建系統。在構建前將GHIDRA_INSTALL_DIR環境變量設置為ghidra_install_dir環境變量,或將其設置為Gradle屬性(用於在IDE中建造):
$ export GHIDRA_INSTALL_DIR= " /path/to/ghidra "
$ ./gradlew echo GHIDRA_INSTALL_DIR=/path/to/ghidra > gradle.properties模塊ZIP將輸出到dist/ 。使用文件>安裝擴展名,然後選擇“綠色加”以瀏覽擴展名。提示時重新啟動Ghidra。
為了進行適當的功能,應使用與Ghidra安裝相同的JRE構建插件。如果已安裝了多個Java運行時環境,請在構建前設置JAVA_HOME環境變量來選擇正確的JRE。
將PCI選項ROM添加到Ghidra項目中。舊版X86選項ROM可以直接加載以進行分析。確保將二進制格式設置為X86 PCI選項ROM ,並導入二進制。
使用文件系統加載程序應導入包含多個圖像的UEFI選項ROM或選項ROM。當提示選擇導入模式時,請選擇文件系統。選項ROM中包含的圖像將顯示,並且可以導入進行分析。 Legacy X86圖像將被處理X86 PCI選項ROM加載器,UEFI圖像將由PE32加載器處理(支持壓縮)。可以通過在右鍵單擊菜單中選擇獲取信息來顯示每個圖像的信息。
將支持的固件圖像添加到Ghidra項目中。固件圖像加載器使用Flash描述符,帶有FMAP/CBFS佈局的CoreBoot圖像以及UEFI固件量支持英特爾圖像。文件系統導入模式可用於查看指定的固件圖像中的嵌入式文件。
請注意,某些UEFI固件圖像可能會存儲嵌套的固件量(或FreeForm/freefor/raw FFS部分)。可以通過在指定的freeform/raw文件的右鍵單擊菜單中選擇“打開文件系統”來將此類文件作為固件卷導入。如果找不到嵌套固件卷,將顯示錯誤消息( No file system provider for... )。
輔助腳本包含在插件的ghidra_scripts目錄中,該目錄應自動添加到Ghidra的腳本目錄列表中。
通過在腳本管理器窗口中選擇uefihelper.java(從窗口 - >腳本管理器訪問)來運行UEFI助手腳本。
要修改UEFI數據類型庫,請根據需要在data/gen_prf.sh中修改PRF模板,並生成新的PRF文件。在文件 - > parse c源中打開生成的PRF文件。通過選擇文件來構建更新的數據類型庫...。覆蓋data中的原始數據類型庫並重建插件。
這些是一些與UEFI逆轉有關的有趣項目:
Apache 2.0,除了一些例外:
src/efidecompress/c/efidecompress.c :bsd src/efidecompress/c/efidecompress.c是從uefi-firmware-parser(本身衍生自EDK2 basetools in eDK2 basetools中的原始版本)的decompompress.c的修改版本。
lib/xz-1.8.jar是從XZ的Java項目中獲取的。
src/main/java/firmware/ifd中的IFD FS加載器使用Uefitool中的解析器作為參考。
data/guids.csv中的GUID數據庫取自Uefitool。
使用data/gen_prf.sh生成了data/uefi_*.gdt中的UEFI數據類型庫,該庫是根據WRFFRZ的Ghidra Pull請求的uefi Parser定義部分基於的。這些數據類型庫使用來自EDK2 MDEPKG的標題。
Xerpi的Ghidravitaloader被用作UEFI Helper腳本某些部分的參考。