用于 Ghidra 的各种模块,协助进行 PC 固件逆向工程。 该项目已被接受为 GSoC 2019 的 coreboot 项目。
需要 JDK 21(或更新版本)和 Ghidra 12.0(或更新版本)。
使用 Ghidra 的标准 Gradle 构建系统。在构建前设置 GHIDRA_INSTALL_DIR 环境变量,或将其设置为 Gradle 属性(便于在 IDE 中构建):
$ export GHIDRA_INSTALL_DIR="/path/to/ghidra"
$ ./gradlew
echo GHIDRA_INSTALL_DIR=/path/to/ghidra > gradle.properties
[!NOTE]
GHIDRA_INSTALL_DIR应指向包含support/buildExtension.gradle的目录。例如,使用 Flathub 软件包 的用户应使用/var/lib/flatpak/app/org.ghidra_sre.Ghidra/current/active/files/lib/ghidra。
模块 ZIP 将输出到 dist/ 目录。使用 文件 > 安装扩展,然后选择绿色加号浏览到该扩展。在提示时重启 Ghidra。
为获得正常功能,插件应使用与您的 Ghidra 安装相同的 JRE 构建。如果安装了多个 Java 运行时环境,请在构建前通过设置 JAVA_HOME 环境变量来选择正确的 JRE。
将 PCI 选项 ROM 添加到 Ghidra 项目中。传统 x86 选项 ROM 可直接加载进行分析。确保二进制格式设置为 x86 PCI Option ROM,然后导入该二进制文件。
UEFI 选项 ROM 或包含多个镜像的选项 ROM 应使用文件系统加载器导入。当提示选择导入模式时,选择 文件系统。选项 ROM 中包含的镜像将被显示,并可导入进行分析。传统 x86 镜像将由 x86 PCI Option ROM 加载器处理,UEFI 镜像将由 PE32 加载器处理(支持压缩)。可通过在右键菜单中选择 获取信息 来显示每个镜像的信息。
将受支持的固件镜像添加到 Ghidra 项目中。固件镜像加载器支持带有 Flash Descriptor 的 Intel 镜像、带有 FMAP/CBFS 布局的 coreboot 镜像以及 UEFI 固件卷。可使用 文件系统 导入模式查看指定固件镜像中嵌入的文件。
请注意,某些 UEFI 固件镜像可能在自由格式/原始文件(或自由格式/原始 FFS 节)中存储嵌套的固件卷。此类文件可通过在指定自由格式/原始文件的右键菜单中选择 打开文件系统 作为固件卷导入。如果未找到嵌套固件卷,将显示错误消息(No file system provider for...)。
辅助脚本包含在插件的 ghidra_scripts 目录中,该目录应会自动添加到 Ghidra 的脚本目录列表中。
通过在脚本管理器窗口(通过 窗口 -> 脚本管理器 访问)中选择 UEFIHelper.java 来运行 UEFI 辅助脚本。
要修改 UEFI 数据类型库,请根据需要修改 data/gen_prf.sh 中的 PRF 模板并生成新的 PRF 文件。在 文件 -> 解析 C 源文件 中打开生成的 PRF 文件。通过选择 解析到文件... 构建更新后的数据类型库。覆盖 data 中的原始数据类型库并重新构建插件。
以下是一些与 UEFI 逆向相关的有趣项目:
Apache 2.0,但有以下例外:
src/efidecompress/c/efidecompress.c:BSDsrc/efidecompress/c/efidecompress.c 是 uefi-firmware-parser 中 Decompress.c 的轻量修改版本(其本身源自 EDK2 BaseTools 中的原始版本)。
src/main/java/firmware/ifd 中的 IFD FS 加载器参考了 UEFITool 中的解析器。
data/guids.csv 中的 GUID 数据库取自 UEFITool。
data/uefi_*.gdt 中的 UEFI 数据类型库由 data/gen_prf.sh 生成,该脚本部分基于 wrffrz 的 Ghidra 拉取请求 中的 UEFI 解析器定义。这些数据类型库使用 EDK2 MdePkg 中的头文件。
UEFI 辅助脚本的部分内容参考了 xerpi 的 GhidraVitaLoader。