
Расширение Ghidra для реверс-инжиниринга прошивок ПК, предоставляющее загрузчики для PCI option ROM, Intel Flash Descriptor, coreboot CBFS и томов прошивки UEFI, а также вспомогательные скрипты UEFI для восстановления типов и идентификации GUID.
Различные модули для Ghidra, помогающие в реверс-инжиниринге прошивок ПК. Этот проект был принят как проект coreboot для GSoC 2019.
Требуются 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/. Используйте File > Install Extensions и
выберите зелёный плюс, чтобы указать путь к расширению. Перезапустите Ghidra при появлении
соответствующего запроса.
Для корректной работы плагин должен быть собран с той же JRE, которая используется
вашей установкой Ghidra. Если у вас установлено несколько сред выполнения Java,
выберите нужную JRE, задав переменную окружения JAVA_HOME перед сборкой.
Добавьте PCI option ROM в проект Ghidra. Legacy x86 option ROM можно загружать напрямую для анализа. Убедитесь, что формат бинарника установлен как x86 PCI Option ROM, и импортируйте бинарник.
UEFI option ROM или option ROM, содержащие более одного образа, следует импортировать с помощью загрузчика файловой системы. При появлении запроса о выборе режима импорта выберите File system. Содержащиеся в option ROM образы будут отображены и могут быть импортированы для анализа. Legacy x86 образы будут обработаны загрузчиком x86 PCI Option ROM, а UEFI образы — загрузчиком PE32 (поддерживается сжатие). Информацию о каждом образе можно просмотреть, выбрав Get Info в контекстном меню.
Добавьте поддерживаемый образ прошивки в проект Ghidra. Загрузчик образов прошивки поддерживает образы Intel с Flash Descriptor, образы coreboot с разметкой FMAP/CBFS и тома прошивки UEFI. Режим импорта File system можно использовать для просмотра встроенных файлов внутри указанного образа прошивки.
Обратите внимание, что некоторые образы прошивки UEFI могут хранить вложенные тома
прошивки внутри файлов/секций freeform/raw (или секций FFS freeform/raw). Такие файлы
можно импортировать как тома прошивки, выбрав Open File System в контекстном меню
для указанного файла freeform/raw. Если вложенный том прошивки не найден, будет
отображено сообщение об ошибке (No file system provider for...).
Вспомогательный скрипт включён в каталог ghidra_scripts плагина, который должен автоматически добавляться в список каталогов скриптов в Ghidra.
Запустите вспомогательный скрипт UEFI, выбрав UEFIHelper.java в окне Script Manager (доступно через Window -> Script Manager).
Чтобы изменить библиотеку типов данных UEFI, измените шаблон PRF в
data/gen_prf.sh по мере необходимости и сгенерируйте новые PRF-файлы. Откройте
сгенерированный PRF-файл в File -> Parse C Source. Соберите обновлённую библиотеку
типов данных, выбрав Parse to File.... Перезапишите исходные библиотеки типов данных
в data и пересоберите плагин.
Вот несколько интересных проектов, связанных с реверсом UEFI:
Apache 2.0, с некоторыми исключениями:
src/efidecompress/c/efidecompress.c: BSDsrc/efidecompress/c/efidecompress.c — слегка модифицированная версия
Decompress.c из uefi-firmware-parser (который, в свою очередь, происходит из
оригинала в EDK2 BaseTools).
Загрузчик FS IFD в src/main/java/firmware/ifd использует парсер из
UEFITool в качестве справочного материала.
База данных GUID в data/guids.csv взята из UEFITool.
Библиотеки типов данных UEFI в data/uefi_*.gdt были сгенерированы с помощью
data/gen_prf.sh, который частично основан на определении парсера UEFI
из pull request для Ghidra от wrffrz. Эти библиотеки типов данных используют
заголовки из EDK2 MdePkg.
GhidraVitaLoader от xerpi использовался как справочный материал для некоторых частей вспомогательного скрипта UEFI.