> Windows Syscalls
ntoskrnl.exeT1542.001T1542.003T1014

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

NameTypeDirDescription
DriverEntryPEFI_DRIVER_ENTRYinZeiger auf eine EFI_DRIVER_ENTRY-Struktur, die den zu registrierenden UEFI-Treiber beschreibt (FriendlyName, DriverFilePath, Attribute).
IdPULONGoutErhält die von der Firmware vergebene Kennung — auf UEFI-Systemen durch eine EFI-`Driver####`-NVRAM-Variable hinterlegt.

Syscall-IDs pro Windows-Version

Windows-VersionSyscall-IDBuild
Win10 15070x69win10-1507
Win10 16070x69win10-1607
Win10 17030x6Awin10-1703
Win10 17090x6Awin10-1709
Win10 18030x6Awin10-1803
Win10 18090x6Awin10-1809
Win10 19030x6Awin10-1903
Win10 19090x6Awin10-1909
Win10 20040x6Bwin10-2004
Win10 20H20x6Bwin10-20h2
Win10 21H10x6Bwin10-21h1
Win10 21H20x6Bwin10-21h2
Win10 22H20x6Bwin10-22h2
Win11 21H20x6Bwin11-21h2
Win11 22H20x6Bwin11-22h2
Win11 23H20x6Bwin11-23h2
Win11 24H20x6Bwin11-24h2
Server 20160x69winserver-2016
Server 20190x6Awinserver-2019
Server 20220x6Bwinserver-2022
Server 20250x6Bwinserver-2025

Kernel-Modul

ntoskrnl.exeNtAddDriverEntry

Verwandte APIs

BcdAddDriverEntry (bcd.dll, less commonly used)SetFirmwareEnvironmentVariableW (Driver####, DriverOrder)NtSetSystemEnvironmentValueExNtModifyDriverEntryNtDeleteDriverEntryNtEnumerateDriverEntries

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.

Erkennungs­mö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 ENDP

cRegister 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