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脚本某些部分的参考。