
Desativar PatchGuard e Driver Signature Enforcement na inicialização
EfiGuard é um bootkit portátil x64 UEFI que modifica o gerenciador de inicialização, o carregador de inicialização e o kernel do Windows durante a inicialização para desabilitar o PatchGuard e a Imposição de Assinatura de Driver (DSE).
Se você está apenas procurando testar o EfiGuard, pule para Uso.
Atualmente suporta todas as versões compatíveis com EFI do Windows x64 já lançadas, do Vista SP1 ao Windows 11.
Fácil de usar: pode ser inicializado a partir de um pendrive ou da partição EFI do Windows através de um carregador que automaticamente encontra e inicializa o Windows. O driver também pode ser carregado e configurado manualmente usando o shell UEFI ou o carregador.
Faz uso extensivo da biblioteca desmontadora Zydis para decodificação rápida de instruções em tempo de execução, suportando análises mais robustas do que o possível com correspondência de assinaturas, que frequentemente exige alterações com novas atualizações do sistema operacional.
Funciona passivamente: o driver não carrega nem inicia o gerenciador de inicialização do Windows. Em vez disso, age sobre um carregamento de bootmgfw.efi pelo gerenciador de inicialização do firmware através do menu de seleção de inicialização ou de um aplicativo EFI como o carregador. Se um sistema operacional não Windows for inicializado, o driver será descarregado automaticamente.
Suporta modificação em quatro estágios para quando bootmgfw.efi inicia bootmgr.efi em vez de winload.efi. Isso ocorre quando um arquivo WIM é carregado para inicializar o WinPE, a Configuração do Windows ou o modo de Recuperação do Windows.
Recuperação elegante: em caso de falha na modificação, o driver exibirá informações de erro e solicitará a continuação da inicialização ou a reinicialização pressionando ESC. Isso é verdade até mesmo no estágio final da modificação do kernel, porque o último estágio de modificação ocorre antes de ExitBootServices ser chamado. Muitos bootkits UEFI do Windows interceptam OslArchTransferToKernel que, embora seja fácil de encontrar por correspondência de padrões, é uma função que executa em modo protegido após ExitBootServices. Isso significa que nenhum serviço de inicialização está disponível para informar ao usuário que algo deu errado.

Falha de modificação simulada com informações de erro
Depurável: pode enviar mensagens para um depurador de kernel e para a tela (embora em buffer) durante o estágio de modificação do kernel, e para uma porta serial ou sem buffer para a tela durante os estágios de modificação do gerenciador de inicialização e do carregador de inicialização. Se o driver for compilado com informações de depuração PDB, é possível carregar os símbolos de depuração em qualquer ponto após a inicialização do HAL especificando a base virtual do driver DXE e depurando-o como faria com um driver NT normal.
Burlas de DSE: disponíveis como uma desativação de DSE direta no estilo UPGDSED na inicialização ou como um gancho no serviço de tempo de execução EFI SetVariable(). Este último serve como uma backdoor arbitrária de leitura/gravação em modo kernel que pode ser chamada do Windows usando NtSetSystemEnvironmentValueEx e permite definir g_CiEnabled/g_CiOptions para o valor desejado. Um pequeno aplicativo no estilo DSEFix chamado EfiDSEFix.exe é fornecido para fazer isso. Também é possível deixar o DSE ativado e desabilitar apenas o PatchGuard. O carregador usará o método de gancho SetVariable por padrão, devido ao fato de que alguns programas anti-cheat e antivírus não entendem a diferença entre cheats ou malware e drivers autoassinados em geral e visam o fix do UPGDSED.
Suporta kernels e carregadores de inicialização modificados em disco ao modificar ImgpValidateImageHash em cada estágio, bem como ImgpFilterValidationFailure, que pode denunciar silenciosamente algumas classes de violações a um TPM ou ao arquivo de log SI.
Permite que o Secure Boot funcione com Windows 7 (não é piada!). O Windows 7 em si é alheio ao Secure Boot, pois não o suporta, ou (oficialmente) nem mesmo inicializar sem CSM. Isso é útil para pessoas que desejam usar o Windows 7 em um dispositivo bloqueado que exige Secure Boot WHQL. Entrada da wiki sobre como fazer isso funcionar aqui.

WinObjEx64 no Windows 7 com Secure Boot ativado
SetVariable causará um bugcheck SECURE_KERNEL_ERROR se for usado para escrever em g_CiOptions.Há duas maneiras de usar o EfiGuard: inicializando o aplicativo carregador, que carregará o driver e iniciará o Windows para você, ou instalando o driver como uma entrada de driver UEFI para que seja carregado automaticamente pelo firmware.
Instalar o driver pode ser preferível em algumas configurações avançadas, como ao fazer multi-boot, mas o carregador é mais fácil de usar e deve funcionar bem em todas as configurações. Veja a tabela abaixo para as diferenças mais importantes entre os dois métodos. Se não tiver certeza, escolha o aplicativo carregador.
| Localização | Instalação | Ignorável? | Qual SO é inicializado? | |
|---|---|---|---|---|
| Entrada de Driver UEFI | Deve estar na ESP | Via Shell UEFI |
Comparação entre carregador e entrada de driver UEFI
EFI/Boot/Loader.efi para bootx64.efi.X:, os caminhos para os dois arquivos devem ser agora X:/EFI/Boot/{bootx64|EfiGuardDxe}.efiSetVariable (o padrão), execute EfiDSEFix.exe -d em um prompt de comando como Administrador após a inicialização para desabilitar o DSE, ou execute EfiDSEFix.exe para ver a lista completa de opções.Observe que você não precisa usar uma unidade separada para o carregador. Se preferir, você pode instalar o EfiGuard na ESP onde o Windows já está instalado. No entanto, isso é um pouco mais complicado, pois você precisará adicionar uma entrada de inicialização UEFI para o carregador.
Para fazer isso, monte a ESP em X: usando mountvol X: /S e siga os passos acima, mas não renomeie o carregador e simplesmente copie ambos os arquivos para X:/EFI/Boot. Depois disso, você precisará adicionar manualmente uma entrada de inicialização UEFI a partir do Shell UEFI usando bcfg boot addp 0 Loader.efi "EfiGuard", ou alternativamente usando efibootmgr (Linux), EasyUEFI (Windows), ou similar.
X: usando mountvol X: /S.EfiGuardDxe.efi para X:/EFI/Boot/EfiGuardDxe.efi.bcfg driver add 0 EfiGuardDxe.efi "EfiGuardDxe".SetVariable (o padrão), execute EfiDSEFix.exe -d em um prompt de comando como Administrador após a inicialização para desabilitar o DSE, ou execute EfiDSEFix.exe para ver a lista completa de opções.Nota: dependendo do seu firmware, você pode precisar usar "addp" no passo 3 em vez de "add". Sabe-se que o VirtualBox exige isso, e possivelmente alguns firmwares de placa-mãe também.
Nota: alguns firmwares muito antigos ou não compatíveis podem não suportar este método de instalação. Nesses sistemas, você não terá outra opção senão usar o carregador.
O EfiGuard requer o EDK2 para compilar. Se você não tiver o EDK2 instalado, siga primeiro os passos em Getting Started with EDK2, pois o sistema de compilação do EDK2 é bastante complexo de configurar. Esta seção pressupõe que você tenha um diretório workspace para o qual sua variável de ambiente WORKSPACE aponta, com uma cópia do EDK2 baixada em workspace/edk2. Os compiladores suportados são MSVC, Clang, GCC e ICC.
workspace/edk2/EfiGuardPkg.build -a X64 -t VS2019 -p EfiGuardPkg/EfiGuardPkg.dsc -b RELEASE, substituindo seu conjunto de ferramentas por VS2019.Isso produzirá EfiGuardDxe.efi e Loader.efi em workspace/Build/EfiGuard/RELEASE_VS2019/X64.
O EfiDSEFix requer o Visual Studio para compilar.
EfiGuard.sln e compile a solução.O binário de saída EfiDSEFix.exe estará em Application/EfiDSEFix/bin.
A solução do Visual Studio também inclui projetos para EfiGuardDxe.efi e Loader.efi que podem ser usados com VisualUefi, mas esses projetos não são compilados por padrão, pois não serão vinculados sem código adicional, e a saída da compilação será inferior (maior) do que a produzida pelo EDK2. Loader.efi não será vinculado devido à ausência de UefiBootManagerLib no VisualUefi. Esses arquivos de projeto são, portanto, destinados apenas como auxílio ao desenvolvimento, e os arquivos EFI ainda devem ser compilados com o EDK2. Para configurar o VisualUefi para esse fim, clone o repositório em workspace/VisualUefi e abra EfiGuard.sln.
Embora o EfiGuard seja um bootkit UEFI, ele não começou como um. O EfiGuard era originalmente um modificador em disco executado no NT (semelhante ao UPGDSED), destinado a testar a viabilidade de uma abordagem baseada em desmontador, em vez de usar símbolos PDB e assinaturas específicas de versão. PatchNtoskrnl.c ainda se parece muito com esse design original. Somente depois que essa abordagem se mostrou bem-sucedida, sem necessidade de modificações no código por mais de um ano de atualizações do Windows, o UEFI entrou em cena como uma forma de melhorar ainda mais as capacidades e a facilidade de uso.
Alguns dos benefícios fornecidos por uma abordagem de bootkit incluem:
bcdedit.ImgpValidateImageHash (embora isso ainda seja feito opcionalmente).db.A primeira encarnação do EfiGuard como bootkit foi uma tentativa de fazer o UEFI-Bootkit do dude719 funcionar com versões recentes do Windows 10, porque ele havia se tornado desatualizado e não funcionava mais nas versões mais recentes (como o UPGDSED, frequentemente causado por varreduras de padrão sensíveis à versão). Embora eu tenha conseguido fazer isso funcionar, fiquei insatisfeito com o resultado, principalmente devido à escolha de interceptar OslArchTransferToKernel, que, como observado acima, executa em modo protegido e após a chamada de ExitBootServices. Além disso, não estava satisfeito em poder modificar apenas algumas versões do Windows 10; queria que o bootkit funcionasse em todas as versões compatíveis com EFI do Windows x64 já lançadas. Por isso, reescrevi o bootkit do zero com os seguintes objetivos:
Uma visão geral do fluxo de inicialização final do EfiGuard é mostrada no diagrama acima. Para os ganchos e modificações específicos de cada componente, veja EfiGuardDxe/PatchXxx.c nos arquivos fonte. Para a inicialização/descarregamento do driver e os ganchos dos Serviços de Inicialização e Tempo de Execução EFI, veja EfiGuardDxe.c.
O EfiGuard é licenciado sob a GPLv3. Os arquivos no submódulo EfiGuardDxe/Zydis são licenciados sob a licença MIT.
| ❌ |
| O mesmo de antes |
| Carregador | Em qualquer lugar | Não é necessário | ✔️ | Windows |