
Deshabilitar PatchGuard y la aplicación de firmas de controladores en el momento de arranque
EfiGuard es un bootkit UEFI x64 portátil que parchea el administrador de arranque, el cargador de arranque y el kernel de Windows durante el arranque para deshabilitar PatchGuard y la aplicación de firma de controladores (DSE).
Si solo buscas probar EfiGuard, salta a Uso.
Actualmente es compatible con todas las versiones de Windows x64 compatibles con EFI jamás lanzadas, desde Vista SP1 hasta Windows 11.
Fácil de usar: se puede iniciar desde una unidad USB o la partición EFI de Windows mediante un cargador que encuentra e inicia Windows automáticamente. El controlador también se puede cargar y configurar manualmente usando el shell UEFI o el cargador.
Hace un uso extensivo de la biblioteca desensambladora Zydis para la decodificación rápida de instrucciones en tiempo de ejecución, lo que permite un análisis más robusto que el posible con la coincidencia de firmas, que a menudo requiere cambios con las nuevas actualizaciones del sistema operativo.
Funciona de forma pasiva: el controlador no carga ni inicia el administrador de arranque de Windows. En su lugar, actúa sobre una carga de bootmgfw.efi por parte del administrador de arranque del firmware a través del menú de selección de arranque o una aplicación EFI como el cargador. Si se inicia un sistema operativo que no sea Windows, el controlador se descargará automáticamente.
Admite parcheo en cuatro etapas para cuando bootmgfw.efi inicia bootmgr.efi en lugar de winload.efi. Este es el caso cuando se carga un archivo WIM para iniciar WinPE, la configuración de Windows o el modo de recuperación de Windows.
Recuperación elegante: en caso de fallo del parche, el controlador mostrará información de error y solicitará continuar con el arranque o reiniciar presionando ESC. Esto es cierto incluso hasta la etapa final de parcheo del kernel, porque la última etapa de parcheo ocurre antes de que se llame a ExitBootServices. Muchos bootkits UEFI de Windows enganchan OslArchTransferToKernel, que, aunque es fácil de encontrar mediante coincidencia de patrones, es una función que se ejecuta en modo protegido después de ExitBootServices. Esto significa que no hay servicios de arranque disponibles para informar al usuario de que algo salió mal.

Fallo de parche simulado con información de error
Depurable: puede enviar mensajes a un depurador del kernel y a la pantalla (aunque almacenados en búfer) durante la etapa de parcheo del kernel, y a un puerto serie o sin búfer a la pantalla durante las etapas de parcheo del administrador de arranque y el cargador de arranque. Si el controlador se compila con información de depuración PDB, es posible cargar los símbolos de depuración en cualquier momento después de la inicialización de HAL especificando la base virtual del controlador DXE y depurándolo como lo haría con un controlador NT normal.
Omisiones de DSE: disponibles como una desactivación directa de DSE al estilo UPGDSED en el momento del arranque o como un gancho en el servicio EFI en tiempo de ejecución SetVariable(). Este último sirve como una puerta trasera arbitraria de lectura/escritura en modo kernel que se puede llamar desde Windows usando NtSetSystemEnvironmentValueEx y permite establecer g_CiEnabled/g_CiOptions al valor deseado. Se proporciona una pequeña aplicación similar a DSEFix llamada EfiDSEFix.exe que se puede utilizar para esto. También es posible dejar DSE habilitado y deshabilitar solo PatchGuard. El cargador usará el método de gancho SetVariable por defecto, debido a que algunos programas antichoque y antivirus no entienden la diferencia entre trampas o malware y los controladores autofirmados en general y apuntan a la corrección de UPGDSED.
Admite kernels y cargadores de arranque modificados en disco mediante el parcheo de ImgpValidateImageHash en cada etapa, así como ImgpFilterValidationFailure, que puede denunciar silenciosamente algunas clases de violaciones a un TPM o al archivo de registro SI.
Permite que el Arranque Seguro funcione con Windows 7 (¡no es broma!). Windows 7 en sí mismo es ajeno al Arranque Seguro ya que no lo admite, ni (oficialmente) siquiera arrancar sin CSM. Esto es útil para personas que quieren usar Windows 7 en un dispositivo bloqueado que requiere Arranque Seguro WHQL. Entrada de wiki sobre cómo hacer que esto funcione aquí.

WinObjEx64 en Windows 7 con Arranque Seguro habilitado
SetVariable causará una comprobación de error SECURE_KERNEL_ERROR si se usa para escribir en g_CiOptions.Hay dos formas de usar EfiGuard: iniciar la aplicación cargadora, que cargará el controlador e iniciará Windows por usted, o instalar el controlador como una entrada de controlador UEFI para que el firmware lo cargue automáticamente.
Instalar el controlador puede ser preferible en algunas configuraciones avanzadas, como cuando se arranca múltiples sistemas, pero el cargador es el más fácil de usar y debería funcionar bien en todas las configuraciones. Consulta la tabla a continuación para ver las diferencias más importantes entre los dos métodos. Si no estás seguro, elige la aplicación cargadora.
| Ubicación | Instalación | ¿Se puede saltar? | ¿Qué SO se inicia? | |
|---|---|---|---|---|
| Entrada de controlador UEFI | Debe estar en la ESP | Mediante Shell UEFI |
Comparación entre cargador y entrada de controlador UEFI
EFI/Boot/Loader.efi a bootx64.efi.X:, las rutas para los dos archivos deberían ser ahora X:/EFI/Boot/{bootx64|EfiGuardDxe}.efiSetVariable (el predeterminado), ejecuta EfiDSEFix.exe -d desde un símbolo del sistema como Administrador después del arranque para deshabilitar DSE, o ejecuta EfiDSEFix.exe para ver la lista completa de opciones.Ten en cuenta que no necesitas usar una unidad separada para el cargador. Si lo prefieres, puedes instalar EfiGuard en la ESP donde ya está instalado Windows. Sin embargo, esto es algo más complicado, ya que necesitarás agregar una entrada de arranque UEFI para el cargador.
Para hacer esto, monta la ESP en X: usando mountvol X: /S y sigue los pasos anteriores, pero no renombres el cargador y simplemente copia ambos archivos a X:/EFI/Boot. Después de eso, necesitarás agregar manualmente una entrada de arranque UEFI desde el Shell UEFI usando bcfg boot addp 0 Loader.efi "EfiGuard", o alternativamente usando efibootmgr (Linux), EasyUEFI (Windows) o similar.
X: usando mountvol X: /S.EfiGuardDxe.efi a X:/EFI/Boot/EfiGuardDxe.efi.bcfg driver add 0 EfiGuardDxe.efi "EfiGuardDxe".SetVariable (el predeterminado), ejecuta EfiDSEFix.exe -d desde un símbolo del sistema como Administrador después del arranque para deshabilitar DSE, o ejecuta EfiDSEFix.exe para ver la lista completa de opciones.Nota: dependiendo de tu firmware, es posible que necesites usar "addp" en el paso 3 en lugar de "add". Se sabe que VirtualBox requiere esto, y posiblemente algunos firmwares de placas base también.
Nota: algunos firmwares muy antiguos o no conformes pueden no soportar este método de instalación en absoluto. En estos sistemas no tendrás más opción que usar el cargador.
EfiGuard requiere EDK2 para compilar. Si no tienes EDK2 instalado, sigue primero los pasos en Getting Started with EDK2 ya que el sistema de compilación de EDK2 es bastante complejo de configurar. Esta sección asume que tienes un directorio workspace al que apunta tu variable de entorno WORKSPACE, con una copia de EDK2 desplegada en workspace/edk2. Los compiladores compatibles son MSVC, Clang, GCC e ICC.
workspace/edk2/EfiGuardPkg.build -a X64 -t VS2019 -p EfiGuardPkg/EfiGuardPkg.dsc -b RELEASE, sustituyendo tu cadena de herramientas por VS2019.Esto producirá EfiGuardDxe.efi y Loader.efi en workspace/Build/EfiGuard/RELEASE_VS2019/X64.
EfiDSEFix requiere Visual Studio para compilar.
EfiGuard.sln y compila la solución.El binario de salida EfiDSEFix.exe estará en Application/EfiDSEFix/bin.
La solución de Visual Studio también incluye proyectos para EfiGuardDxe.efi y Loader.efi que se pueden usar con VisualUefi, pero estos proyectos no se compilan de forma predeterminada porque no enlazarán sin código adicional, y el resultado de la compilación será inferior (más grande) que el que produce EDK2. Loader.efi no enlazará en absoluto debido a que VisualUefi carece de UefiBootManagerLib. Por lo tanto, estos archivos de proyecto están destinados solo como ayuda para el desarrollo y los archivos EFI aún deben compilarse con EDK2. Para configurar VisualUefi para este propósito, clona el repositorio en workspace/VisualUefi y abre EfiGuard.sln.
Aunque EfiGuard es un bootkit UEFI, no comenzó como tal. EfiGuard era originalmente un parcheador en disco que se ejecutaba en NT (similar a UPGDSED), destinado a probar la viabilidad de un enfoque basado en desensamblador, en lugar de usar símbolos PDB y firmas específicas de versión. PatchNtoskrnl.c todavía se parece mucho a este diseño original. Solo después de que este enfoque demostró ser exitoso, sin necesidad de modificaciones en el código durante más de un año de actualizaciones de Windows, UEFI entró en escena como una forma de mejorar aún más las capacidades y la facilidad de uso.
Algunos de los beneficios proporcionados por un enfoque de bootkit incluyen:
bcdedit.ImgpValidateImageHash (aunque esto todavía se hace opcionalmente).db.La encarnación inicial de EfiGuard como bootkit fue un intento de hacer que el UEFI-Bootkit de dude719 funcionara con versiones recientes de Windows 10, porque se había vuelto obsoleto y ya no funciona en las últimas versiones (como UPGDSED, a menudo causado por escaneos de patrones sensibles a la versión). Aunque eventualmente logré que funcionara, no quedé satisfecho con el resultado, principalmente debido a la elección de enganchar OslArchTransferToKernel, que como se señaló anteriormente se ejecuta en modo protegido y después de que se haya llamado a ExitBootServices. Aparte de esto, no estaba satisfecho con solo poder parchear algunas versiones de Windows 10; quería que el bootkit funcionara en todas las versiones de Windows x64 compatibles con EFI lanzadas hasta la fecha. Debido a esto, reescribí el bootkit desde cero con los siguientes objetivos:
Una visión general del flujo de arranque final de EfiGuard se muestra en el diagrama anterior. Para los ganchos y parches específicos de componentes individuales, consulta EfiGuardDxe/PatchXxx.c en los archivos fuente. Para la inicialización/descarga del controlador y los ganchos de los Servicios de Arranque y Tiempo de Ejecución EFI, consulta EfiGuardDxe.c.
EfiGuard está licenciado bajo GPLv3. Los archivos en el submódulo EfiGuardDxe/Zydis están licenciados bajo la licencia MIT.
| ❌ |
| Igual que antes |
| Cargador | En cualquier lugar | No es necesario | ✔️ | Windows |