
Disabilita PatchGuard e Driver Signature Enforcement all'avvio
EfiGuard è un bootkit UEFI x64 portatile che modifica il boot manager, il boot loader e il kernel di Windows all'avvio per disabilitare PatchGuard e Driver Signature Enforcement (DSE).
Se stai solo cercando di provare EfiGuard, passa a Utilizzo.
Supporta attualmente tutte le versioni di Windows x64 compatibili con EFI mai rilasciate, da Vista SP1 a Windows 11.
Facile da usare: può essere avviato da una chiavetta USB o dalla partizione EFI di Windows tramite un loader che trova e avvia automaticamente Windows. Il driver può anche essere caricato e configurato manualmente usando sia la shell UEFI che il loader.
Fa ampio uso della libreria disassemblatrice Zydis per la decodifica rapida delle istruzioni in runtime, supportando un'analisi più robusta rispetto a quella possibile con il pattern matching, che spesso richiede modifiche con i nuovi aggiornamenti del sistema operativo.
Funziona passivamente: il driver non carica né avvia il boot manager di Windows. Agisce invece sul caricamento di bootmgfw.efi da parte del boot manager del firmware tramite il menu di selezione di avvio o un'applicazione EFI come il loader. Se viene avviato un sistema operativo non Windows, il driver si scaricherà automaticamente.
Supporta la patch a quattro stadi per quando bootmgfw.efi avvia bootmgr.efi invece di winload.efi. Questo accade quando viene caricato un file WIM per avviare WinPE, Configurazione di Windows o la modalità di ripristino di Windows.
Recupero graduale: in caso di fallimento della patch, il driver visualizzerà informazioni sull'errore e richiederà di continuare l'avvio o riavviare premendo ESC. Questo è vero anche fino allo stadio finale della patch del kernel, perché l'ultimo stadio della patch avviene prima che venga chiamata ExitBootServices. Molti bootkit UEFI di Windows hookano OslArchTransferToKernel che, sebbene facile da trovare tramite pattern matching, è una funzione che viene eseguita in modalità protetta dopo ExitBootServices. Ciò significa che non sono disponibili servizi di avvio per informare l'utente che qualcosa è andato storto.

Simulazione di fallimento della patch con informazioni sull'errore
Debuggabile: può inviare messaggi a un debugger del kernel e allo schermo (sebbene bufferizzati) durante la fase di patching del kernel, e a una porta seriale o non bufferizzati allo schermo durante le fasi di patching del boot manager e del boot loader. Se il driver è compilato con informazioni di debug PDB, è possibile caricare i simboli di debug in qualsiasi momento dopo l'inizializzazione di HAL specificando la base virtuale del driver DXE e debugandolo come si farebbe con un normale driver NT.
Bypass DSE: disponibile come disabilitazione DSE diretta all'avvio (stile UPGDSED) o come hook sul servizio EFI runtime SetVariable(). Quest'ultimo funge da backdoor arbitraria in lettura/scrittura in modalità kernel che può essere chiamata da Windows usando NtSetSystemEnvironmentValueEx e permette di impostare g_CiEnabled/g_CiOptions al valore desiderato. Viene fornita una piccola applicazione in stile DSEFix chiamata EfiDSEFix.exe che può essere utilizzata per farlo. È anche possibile lasciare DSE abilitato e disabilitare solo PatchGuard. Il loader utilizzerà il metodo hook SetVariable per impostazione predefinita, poiché alcuni programmi anti-cheat e antivirus non comprendono la differenza tra cheat/malware e driver autofirmati in generale e prendono di mira la fix UPGDSED.
Supporta kernel e boot loader modificati su disco patchando ImgpValidateImageHash in ogni stadio, oltre a ImgpFilterValidationFailure, che potrebbe silenziosamente segnalare alcune classi di violazioni a un TPM o al file di log SI.
Consente l'avvio protetto (Secure Boot) con Windows 7 (non è uno scherzo!). Windows 7 stesso ignora l'avvio protetto poiché non lo supporta, o (ufficialmente: ufficialmente) nemmeno l'avvio senza CSM. Questo è utile per chi vuole usare Windows 7 su un dispositivo bloccato che richiede l'avvio protetto WHQL. Voce della wiki su come farlo funzionare qui.

WinObjEx64 su Windows 7 con Avvio Protetto abilitato
SetVariable causerà un bugcheck SECURE_KERNEL_ERROR se usato per scrivere su g_CiOptions.Ci sono due modi per usare EfiGuard: avviare l'applicazione loader, che caricherà il driver e avvierà Windows per te, oppure installare il driver come voce di driver UEFI in modo che venga caricato automaticamente dal firmware.
Installare il driver può essere preferibile in alcune configurazioni avanzate come quando si avviano più sistemi operativi, ma il loader è il più semplice da usare e dovrebbe funzionare bene in tutte le configurazioni. Vedi la tabella qui sotto per le differenze più importanti tra i due metodi. In caso di dubbio, scegli l'applicazione loader.
| Posizione | Installazione | Saltabile? | Quale sistema operativo viene avviato? | |
|---|---|---|---|---|
| Voce driver UEFI | Deve essere su ESP | Tramite Shell UEFI |
Confronto tra loader e voce driver UEFI
EFI/Boot/Loader.efi in bootx64.efi.X:, i percorsi per i due file dovrebbero ora essere X:/EFI/Boot/{bootx64|EfiGuardDxe}.efiSetVariable (predefinito), esegui EfiDSEFix.exe -d da un prompt dei comandi come Amministratore dopo l'avvio per disabilitare DSE, oppure esegui EfiDSEFix.exe per vedere l'elenco completo delle opzioni.Nota che non hai bisogno di usare un'unità separata per il loader. Se preferisci, puoi installare EfiGuard sull'ESP su cui Windows è già installato. Tuttavia, questo è leggermente più complicato poiché dovrai aggiungere una voce di avvio UEFI per il loader.
Per farlo, monta l'ESP su X: usando mountvol X: /S e segui i passaggi sopra, ma non rinominare il loader e copia semplicemente entrambi i file in X:/EFI/Boot. Dopodiché, dovrai aggiungere manualmente una voce di avvio UEFI dalla Shell UEFI usando bcfg boot addp 0 Loader.efi "EfiGuard", o in alternativa usando efibootmgr (Linux), EasyUEFI (Windows) o simili.
X: usando mountvol X: /S.EfiGuardDxe.efi in X:/EFI/Boot/EfiGuardDxe.efi.bcfg driver add 0 EfiGuardDxe.efi "EfiGuardDxe".SetVariable (predefinito), esegui EfiDSEFix.exe -d da un prompt dei comandi come Amministratore dopo l'avvio per disabilitare DSE, oppure esegui EfiDSEFix.exe per vedere l'elenco completo delle opzioni.Nota: a seconda del tuo firmware, potresti dover usare "addp" al punto 3 invece di "add". È noto che VirtualBox richiede questo, e forse anche alcuni firmware di schede madri.
Nota: alcuni firmware molto vecchi o non conformi potrebbero non supportare affatto questo metodo di installazione. Su questi sistemi non avrai altra scelta che usare il loader.
EfiGuard richiede EDK2 per essere compilato. Se non hai EDK2 installato, segui prima i passaggi in Getting Started with EDK2 poiché il sistema di compilazione EDK2 è piuttosto complesso da configurare. Questa sezione presuppone che tu abbia una directory workspace a cui punta la variabile d'ambiente WORKSPACE, con una copia di EDK2 nella directory workspace/edk2. I compilatori supportati sono MSVC, Clang, GCC e ICC.
workspace/edk2/EfiGuardPkg.build -a X64 -t VS2019 -p EfiGuardPkg/EfiGuardPkg.dsc -b RELEASE, sostituendo la tua toolchain con VS2019.Questo produrrà EfiGuardDxe.efi e Loader.efi in workspace/Build/EfiGuard/RELEASE_VS2019/X64.
EfiDSEFix richiede Visual Studio per essere compilato.
EfiGuard.sln e compila la soluzione.Il binario di output EfiDSEFix.exe si troverà in Application/EfiDSEFix/bin.
La soluzione Visual Studio include anche progetti per EfiGuardDxe.efi e Loader.efi che possono essere utilizzati con VisualUefi, ma questi progetti non vengono compilati per impostazione predefinita poiché non linkeranno senza codice aggiuntivo e l'output di compilazione sarà inferiore (più grande) rispetto a quello prodotto da EDK2. Loader.efi non linkerà affatto a causa della mancanza di UefiBootManagerLib in VisualUefi. Questi file di progetto sono quindi destinati solo come aiuto allo sviluppo e i file EFI dovrebbero comunque essere compilati con EDK2. Per configurare VisualUefi per questo scopo, clona il repository in workspace/VisualUefi e apri EfiGuard.sln.
Sebbene EfiGuard sia un bootkit UEFI, non è nato come tale. EfiGuard era originariamente un patcher su disco eseguito su NT (simile a UPGDSED), inteso a testare la fattibilità di un approccio basato su disassemblatore, invece di utilizzare simboli PDB e firme specifiche per versione. PatchNtoskrnl.c assomiglia ancora molto a questo progetto originale. Solo dopo che questo approccio si è dimostrato vincente, senza necessità di modifiche al codice in oltre un anno di aggiornamenti di Windows, l'UEFI è entrato in gioco come modo per migliorare ulteriormente le capacità e la facilità d'uso.
Alcuni dei vantaggi forniti da un approccio bootkit includono:
bcdedit.ImgpValidateImageHash (anche se questo è ancora opzionalmente fatto).db.L'incarnazione iniziale di EfiGuard come bootkit è stato un tentativo di far funzionare UEFI-Bootkit di dude719 con le versioni recenti di Windows 10, poiché era diventato datato e non funziona più sulle ultime versioni (come UPGDSED, spesso causato da scansioni di pattern sensibili alla versione). Sebbene alla fine sia riuscito a farlo funzionare, non ero soddisfatto del risultato principalmente a causa della scelta di hookare OslArchTransferToKernel, che come notato sopra viene eseguita in modalità protetta e dopo che ExitBootServices è stata chiamata. Oltre a questo, non ero soddisfatto di poter patchare solo alcune versioni di Windows 10; volevo che il bootkit funzionasse su ogni versione di Windows x64 compatibile con EFI rilasciata fino ad oggi. Per questo motivo, ho riscritto il bootkit da zero con i seguenti obiettivi:
Una panoramica generale del flusso di avvio finale di EfiGuard è mostrata nel diagramma sopra. Per gli hook e le patch specifici dei singoli componenti, consulta EfiGuardDxe/PatchXxx.c nei file sorgente. Per l'inizializzazione/scaricamento del driver e gli hook EFI Boot e Runtime Services, consulta EfiGuardDxe.c.
EfiGuard è concesso in licenza sotto GPLv3. I file nel sottomodulo EfiGuardDxe/Zydis sono concessi in licenza sotto la licenza MIT.
| ❌ |
| Uguale a prima |
| Loader | Ovunque | Non necessaria | ✔️ | Windows |