
Некоторые скрипты для IDA Pro, помогающие в реверс-инжиниринге EFI-бинарных файлов
Некоторые IDA-скрипты для помощи в реверс-инжиниринге EFI-исполняемых файлов.
Этот пакет содержит следующие файлы:
efiutils.py — модуль IDAPython с некоторыми вспомогательными функциями
efiguids.py — коллекция известных GUID для EFI-протоколов
efiguids_ami.py — коллекция известных GUID для протоколов, используемых в AMI BIOS
behemoth.h — огромный заголовочный файл, содержащий коллекцию определений типов и структур для EFI
structs.idc — IDC-скрипт, содержащий некоторые определения структур (заменён behemoth.h)
te_image.bt — шаблон 010 Editor для TE-двоичных образов
te_loader.py — скрипт-загрузчик IDA Pro для TE-двоичных образов
Это моя первая попытка написания IDA-скриптов, так что прошу прощения и сообщите мне, если я изобрёл велосипед или сделал что-то глупое.
Основные полезные функции описаны ниже. Дополнительную информацию о других функциях см. в коде и docstring.
rename_tables()Находит первую точку входа для двоичного файла, пытается отследить параметры, переданные функции точки входа, и переименовать глобальные переменные, в которых хранятся ключевые EFI-таблицы. Выполняются следующие операции переименования:
Глобальная переменная, в которую попадает ImageHandle, переименовывается в gImageHandle.
Глобальная переменная, в которую попадает SystemTable, переименовывается в gSystemTable.
Глобальная переменная, в которую попадает SystemTable->BootServices, переименовывается в gBootServices.
Глобальная переменная, в которую попадает SystemTable->RuntimeServices, переименовывается в gRuntimeServices.
Инструкции вызова будут отслеживаться только на один уровень вглубь, так как большинство исполняемых файлов копируют ссылки на таблицы в точке входа или в функции, вызываемой из точки входа. При необходимости измените MAX_STACK_DEPTH.
update_structs()Находит перекрёстные ссылки на таблицы, переименованные выше, и обновляет их имена, превращая их в смещения структур из соответствующих структур. Если rename_tables() завершилась неудачей, вам придётся переименовать вещи вручную, как указано выше, чтобы это работало корректно.
Например:
mov rax, cs:qword_whatever
call qword ptr [rax+150h]
Превращается в:
mov rax, cs:gBootServices
call [rax+EFI_BOOT_SERVICES.UninstallMultipleProtocolInterfaces]
rename_guids()Находит GUID в сегментах данных и переименовывает их. 470 GUID протоколов были извлечены из исходников TianoCore, а проприетарные GUID Apple (и других производителей) будут добавляться по мере их обнаружения.
go()Удобный метод, который выполняет всё вышеперечисленное.
Загрузите ваш EFI-двоичный файл в IDA Pro
Импортируйте behemoth.h для определения необходимых структур данных
Добавьте структуры из локальных типов в вашу IDB
Запустите efiutils.py, чтобы добавить его в путь python (или сделайте это другим способом)
Ознакомьтесь с кодом/docstring, но, вероятно:
import efiutils; efiutils.go()
Чтобы использовать загрузчик TE-образов te_loader.py, установите его как любой другой загрузчик. В OS X это делается путём копирования или создания символической ссылки внутри папки загрузчиков по пути idaq.app/Contents/MacOS/loaders/.