
Отключение PatchGuard и принудительной подписи драйверов во время загрузки
EfiGuard — это портативный x64 UEFI буткит, который патчит диспетчер загрузки Windows, загрузчик и ядро во время загрузки для отключения PatchGuard и Driver Signature Enforcement (DSE).
Если вы просто хотите попробовать EfiGuard, перейдите к разделу Использование.
На данный момент поддерживает все EFI-совместимые версии Windows x64, когда-либо выпущенные, от Vista SP1 до Windows 11.
Простота в использовании: можно загрузить с USB-накопителя или EFI-раздела Windows с помощью загрузчика, который автоматически находит и загружает Windows. Драйвер также можно загрузить и настроить вручную с помощью UEFI shell или загрузчика.
Активно использует библиотеку дизассемблера Zydis для быстрого декодирования инструкций во время выполнения, что обеспечивает более надежный анализ, чем при сопоставлении сигнатур, которое часто требует изменений с выходом новых обновлений ОС.
Работает пассивно: драйвер не загружает и не запускает диспетчер загрузки Windows. Вместо этого он реагирует на загрузку bootmgfw.efi диспетчером загрузки прошивки через меню выбора загрузки или EFI-приложение, например загрузчик. Если загружается ОС, отличная от Windows, драйвер автоматически выгружается.
Поддерживает четырехэтапное патчирование для случаев, когда bootmgfw.efi запускает bootmgr.efi вместо winload.efi. Это происходит, когда загружается WIM-файл для загрузки WinPE, установки Windows или режима восстановления Windows.
Восстановление без сбоев: в случае неудачного патча драйвер отобразит информацию об ошибке и предложит продолжить загрузку или перезагрузиться, нажав ESC. Это справедливо даже для финального этапа патча ядра, так как последний этап происходит до вызова ExitBootServices. Многие UEFI-буткиты для Windows перехватывают OslArchTransferToKernel, который, хотя и легко находится по сигнатуре, является функцией, выполняющейся в защищенном режиме после ExitBootServices. Это означает, что службы загрузки недоступны для оповещения пользователя о проблеме.

Имитация сбоя патча с информацией об ошибке
Отладка: может выводить сообщения в отладчик ядра и на экран (буферизованно) на этапе патча ядра, а также на последовательный порт или без буферизации на экран на этапах патча диспетчера загрузки и загрузчика. Если драйвер скомпилирован с отладочной информацией PDB, можно загрузить отладочные символы в любой момент после инициализации HAL, указав виртуальную базу DXE-драйвера и отлаживая его как обычный NT-драйвер.
Обход DSE: доступен либо как прямое отключение DSE в стиле UPGDSED во время загрузки, либо как перехват EFI-службы времени выполнения SetVariable(). Последний служит произвольным бэкдором чтения/записи в режиме ядра, который можно вызвать из Windows с помощью NtSetSystemEnvironmentValueEx и позволяет установить g_CiEnabled/g_CiOptions в желаемое значение. Предоставляется небольшое приложение в стиле DSEFix с именем EfiDSEFix.exe, которое можно использовать для этого. Также можно оставить DSE включенным и отключить только PatchGuard. Загрузчик по умолчанию будет использовать метод перехвата SetVariable, поскольку некоторые античит и антивирусные программы не понимают разницы между читами или вредоносным ПО и самоподписанными драйверами в целом и нацелены на исправление UPGDSED.
Поддерживает модифицированные на диске ядра и загрузчики, патча ImgpValidateImageHash на каждом этапе, а также ImgpFilterValidationFailure, который может молчаливо сообщать о некоторых нарушениях в TPM или журнал SI.
Позволяет Secure Boot работать с Windows 7 (это не шутка!). Сама Windows 7 не поддерживает Secure Boot, и (официально) даже не может загружаться без CSM. Это полезно для тех, кто хочет использовать Windows 7 на защищенном устройстве, требующем WHQL Secure Boot. Запись в вики о том, как это настроить, здесь.

WinObjEx64 на Windows 7 с включенным Secure Boot
SetVariable вызовет ошибку SECURE_KERNEL_ERROR при попытке записи в g_CiOptions.Существует два способа использования EfiGuard: загрузка приложения-загрузчика, которое загрузит драйвер и запустит Windows, или установка драйвера в качестве записи UEFI-драйвера, чтобы он загружался автоматически прошивкой.
Установка драйвера может быть предпочтительнее в некоторых продвинутых конфигурациях, например при мультизагрузке, но загрузчик проще всего использовать, и он должен хорошо работать во всех конфигурациях. См. таблицу ниже для основных различий между двумя методами. Если сомневаетесь, выбирайте приложение-загрузчик.
| Расположение | Установка | Можно пропустить? | Какая ОС загружается? | |
|---|---|---|---|---|
| UEFI Driver Entry | Должен быть на ESP | Через UEFI Shell |
Сравнение загрузчика и записи UEFI-драйвера
EFI/Boot/Loader.efi в bootx64.efi.X:, пути для двух файлов теперь должны быть X:/EFI/Boot/{bootx64|EfiGuardDxe}.efiSetVariable (по умолчанию), запустите EfiDSEFix.exe -d в командной строке от имени администратора после загрузки, чтобы отключить DSE, или запустите EfiDSEFix.exe для просмотра полного списка опций.Обратите внимание, что вам не нужно использовать отдельный диск для загрузчика. При желании вы можете установить EfiGuard на ESP, на котором уже установлена Windows. Однако это несколько сложнее, так как вам нужно будет добавить запись UEFI-загрузки для загрузчика.
Чтобы сделать это, смонтируйте ESP в X: с помощью mountvol X: /S и выполните шаги выше, но не переименовывайте загрузчик, а просто скопируйте оба файла в X:/EFI/Boot. После этого вам нужно будет вручную добавить запись UEFI-загрузки из UEFI Shell с помощью bcfg boot addp 0 Loader.efi "EfiGuard", или альтернативно с помощью efibootmgr (Linux), EasyUEFI (Windows) или подобных.
X: с помощью mountvol X: /S.EfiGuardDxe.efi в X:/EFI/Boot/EfiGuardDxe.efi.bcfg driver add 0 EfiGuardDxe.efi "EfiGuardDxe".SetVariable (по умолчанию), запустите EfiDSEFix.exe -d в командной строке от имени администратора после загрузки, чтобы отключить DSE, или запустите EfiDSEFix.exe для просмотра полного списка опций.Примечание: в зависимости от вашей прошивки вам может потребоваться использовать "addp" на шаге 3 вместо "add". Известно, что VirtualBox требует этого, и, возможно, некоторые прошивки материнских плат тоже.
Примечание: некоторые очень старые или несовместимые прошивки могут вообще не поддерживать этот метод установки. На таких системах вам не останется ничего, кроме как использовать загрузчик.
EfiGuard требует EDK2 для сборки. Если у вас не установлен EDK2, сначала следуйте шагам из Getting Started with EDK2, так как система сборки EDK2 довольно сложна в настройке. В этом разделе предполагается, что у вас есть каталог workspace, на который указывает переменная окружения WORKSPACE, с копией EDK2, проверенной в workspace/edk2. Поддерживаемые компиляторы: MSVC, Clang, GCC и ICC.
workspace/edk2/EfiGuardPkg.build -a X64 -t VS2019 -p EfiGuardPkg/EfiGuardPkg.dsc -b RELEASE, заменив VS2019 на ваш набор инструментов.Это создаст EfiGuardDxe.efi и Loader.efi в workspace/Build/EfiGuard/RELEASE_VS2019/X64.
EfiDSEFix требует Visual Studio для сборки.
EfiGuard.sln и соберите решение.Выходной бинарный файл EfiDSEFix.exe будет в Application/EfiDSEFix/bin.
Решение Visual Studio также включает проекты для EfiGuardDxe.efi и Loader.efi, которые можно использовать с VisualUefi, но эти проекты не собираются по умолчанию, так как они не будут линковаться без дополнительного кода, а выходные данные будут хуже (больше), чем то, что производит EDK2. Loader.efi вообще не будет линковаться из-за отсутствия UefiBootManagerLib в VisualUefi. Таким образом, эти файлы проектов предназначены только для помощи в разработке, и EFI-файлы все равно следует компилировать с помощью EDK2. Чтобы настроить VisualUefi для этой цели, клонируйте репозиторий в workspace/VisualUefi и откройте EfiGuard.sln.
Хотя EfiGuard является UEFI-буткитом, он начинался не как таковой. Изначально EfiGuard был патчером на диске, работающим на NT (похожим на UPGDSED), предназначенным для проверки жизнеспособности подхода на основе дизассемблера, в отличие от использования PDB-символов и версионно-зависимых сигнатур. PatchNtoskrnl.c до сих пор очень похож на этот оригинальный дизайн. Только после того, как этот подход оказался успешным, и за более чем год обновлений Windows не потребовалось никаких изменений кода, UEFI появился как способ дальнейшего улучшения возможностей и простоты использования.
Некоторые преимущества, предоставляемые подходом буткита, включают:
bcdedit.ImgpValidateImageHash (хотя это все еще делается опционально).db.Первая инкарнация EfiGuard в качестве буткита была попыткой заставить UEFI-Bootkit от dude719 работать с последними версиями Windows 10, так как он устарел и больше не работает на новейших версиях (как и UPGDSED, часто из-за версионно-чувствительных поисков по сигнатурам). Хотя в итоге мне удалось заставить его работать, я был недоволен результатом, в основном из-за выбора перехвата OslArchTransferToKernel, который, как указано выше, выполняется в защищенном режиме и после вызова ExitBootServices. Кроме того, меня не устраивало, что я мог патчить только некоторые версии Windows 10; я хотел, чтобы буткит работал на каждой EFI-совместимой версии Windows x64, выпущенной на сегодняшний день. Из-за этого я переписал буткит с нуля со следующими целями:
Обзорная схема конечного потока загрузки EfiGuard показана на диаграмме выше. Для конкретных для компонентов перехватов и патчей смотрите EfiGuardDxe/PatchXxx.c в исходных файлах. Для инициализации/выгрузки драйвера и перехватов EFI Boot и Runtime Services смотрите EfiGuardDxe.c.
EfiGuard лицензирован под GPLv3. Файлы в подмодуле EfiGuardDxe/Zydis лицензированы под лицензией MIT.
| ❌ |
| Та же, что и раньше |
| Loader | Где угодно | Не требуется | ✔️ | Windows |