NtAddDriverEntry
Registriert einen neuen EFI_DRIVER_ENTRY in der Firmware, damit die UEFI-Umgebung einen Treiber vor dem Betriebssystem lädt.
Prototyp
NTSTATUS NtAddDriverEntry( PEFI_DRIVER_ENTRY DriverEntry, PULONG Id );
Argumente
| Name | Type | Dir | Description |
|---|---|---|---|
| DriverEntry | PEFI_DRIVER_ENTRY | in | Zeiger auf eine EFI_DRIVER_ENTRY-Struktur, die den zu registrierenden UEFI-Treiber beschreibt (FriendlyName, DriverFilePath, Attribute). |
| Id | PULONG | out | Erhält die von der Firmware vergebene Kennung — auf UEFI-Systemen durch eine EFI-`Driver####`-NVRAM-Variable hinterlegt. |
Syscall-IDs pro Windows-Version
| Windows-Version | Syscall-ID | Build |
|---|---|---|
| Win10 1507 | 0x69 | win10-1507 |
| Win10 1607 | 0x69 | win10-1607 |
| Win10 1703 | 0x6A | win10-1703 |
| Win10 1709 | 0x6A | win10-1709 |
| Win10 1803 | 0x6A | win10-1803 |
| Win10 1809 | 0x6A | win10-1809 |
| Win10 1903 | 0x6A | win10-1903 |
| Win10 1909 | 0x6A | win10-1909 |
| Win10 2004 | 0x6B | win10-2004 |
| Win10 20H2 | 0x6B | win10-20h2 |
| Win10 21H1 | 0x6B | win10-21h1 |
| Win10 21H2 | 0x6B | win10-21h2 |
| Win10 22H2 | 0x6B | win10-22h2 |
| Win11 21H2 | 0x6B | win11-21h2 |
| Win11 22H2 | 0x6B | win11-22h2 |
| Win11 23H2 | 0x6B | win11-23h2 |
| Win11 24H2 | 0x6B | win11-24h2 |
| Server 2016 | 0x69 | winserver-2016 |
| Server 2019 | 0x6A | winserver-2019 |
| Server 2022 | 0x6B | winserver-2022 |
| Server 2025 | 0x6B | winserver-2025 |
Kernel-Modul
Verwandte APIs
Syscall-Stub
4C 8B D1 mov r10, rcx B8 6B 00 00 00 mov eax, 0x6B F6 04 25 08 03 FE 7F 01 test byte ptr [0x7FFE0308], 1 75 03 jne short +3 0F 05 syscall C3 ret CD 2E int 2Eh C3 ret
Undokumentierte Hinweise
EFI_DRIVER_ENTRY ist strukturell identisch zu BOOT_ENTRY, adressiert aber den UEFI-**DriverOrder**-Namespace statt BootOrder. UEFI dispatcht jede in `DriverOrder` gelistete `Driver####`-Variable während der DXE/BDS-Phase — *bevor* irgendein Boot-Manager läuft. Der Kernel erreicht die Firmware über `HalSetEnvironmentVariableEx` mit Vendor-GUID `{8BE4DF61-93CA-11d2-AA0D-00E098032B8C}`. SeSystemEnvironmentPrivilege erforderlich; auf den meisten OEM-Firmwares verlangt der Variablen-Schreibvorgang zusätzlich, dass Secure Boot deaktiviert ist oder die Binärsignatur akzeptiert.
Häufige Malware-Nutzung
Noch gefährlicher als Boot-Entry-Persistenz: ein UEFI-Treiber läuft im **EFI-Boot-Services-Kontext**, in der Flat-Memory-CPL0-Umgebung der Firmware, **vor ExitBootServices**, bevor der Windows-Kernel geladen ist und damit vor PatchGuard, DSE, HVCI oder jedem EDR. Dies ist der Persistenzvektor von MosaicRegressor / LoJax (APT28), das einen bösartigen DXE-Treiber per `SetVariable` registrierte, und von MoonBounce (APT41), das Code in CORE_DXE platzierte. ESPecter und das CosmicStrand-SPI-Implant persistieren letztlich ebenfalls als DXE-Treiber. Eine erfolgreich registrierte DRIVER_ENTRY verschafft Angreifern dauerhafte Pre-OS-Codeausführung, die Disk-Wipe und Windows-Neuinstallation überlebt.
Erkennungsmöglichkeiten
ETW Microsoft-Windows-Kernel-Boot protokolliert DRIVER_ENTRY-Änderungen zusammen mit BOOT_ENTRY-Änderungen. Die wertvollste Einzelmaßnahme ist **Measured Boot + Remote Attestation**: jeder dispatchete UEFI-DXE-Treiber erweitert PCR[2], sodass ein bislang nicht gesehener Treiber-Hash die Attestation gegen die geräteseitig erfasste Baseline scheitern lässt. CHIPSECs `tools.uefi.scan_image` und `common.bios_kbrd_buffer` sowie Eclypsiums Firmware-Monitoring entdecken bösartige DXE-Binaries auf der Disk. Windows selbst loggt Event ID 1035 (Microsoft-Windows-TPM-WMI) bei PCR-Abweichungen, wenn die BitLocker-Wiederherstellung ausgelöst wird. Audit 4673 auf SeSystemEnvironmentPrivilege-Nutzung erfasst den In-OS-Staging-Schritt.
Direkte Syscall-Beispiele
asmx64 direct stub (Win11 24H2, SSN 0x6B)
NtAddDriverEntry PROC
mov r10, rcx ; PEFI_DRIVER_ENTRY
mov eax, 6Bh ; Win11 24H2
syscall
ret
NtAddDriverEntry ENDPcRegister a DXE driver (defensive analysis only)
// Structurally mirrors NtAddBootEntry but targets DriverOrder.
// Practical use requires SeSystemEnvironmentPrivilege and Secure Boot bypass / disable.
extern NTSTATUS NTAPI NtAddDriverEntry(PEFI_DRIVER_ENTRY, PULONG);
NTSTATUS plant_driver(void) {
BYTE buf[512] = {0};
PEFI_DRIVER_ENTRY de = (PEFI_DRIVER_ENTRY)buf;
de->Version = 1;
de->Length = sizeof(buf);
de->Attributes = 0;
de->FriendlyNameOffset = FIELD_OFFSET(EFI_DRIVER_ENTRY, OsOptions);
wcscpy_s((wchar_t*)(buf + de->FriendlyNameOffset), 32, L"Diagnostic DXE");
ULONG id = 0;
return NtAddDriverEntry(de, &id);
}rustNaked stub
use std::arch::asm;
#[unsafe(naked)]
unsafe extern "system" fn nt_add_driver_entry(_entry: *mut u8, _id: *mut u32) -> i32 {
asm!(
"mov r10, rcx",
"mov eax, 0x6B", // Win11 24H2
"syscall",
"ret",
options(noreturn),
);
}MITRE ATT&CK-Mappings
Last verified: 2026-05-20