> Windows Syscalls
ntoskrnl.exeT1542.001T1014T1542.003

NtModifyDriverEntry

Überschreibt einen vorhandenen EFI_DRIVER_ENTRY anhand seiner ID und schreibt die UEFI-Driver####-NVRAM-Variable an Ort und Stelle neu.

Prototyp

NTSTATUS NtModifyDriverEntry(
  PEFI_DRIVER_ENTRY DriverEntry
);

Argumente

NameTypeDirDescription
DriverEntryPEFI_DRIVER_ENTRYinZeiger auf einen EFI_DRIVER_ENTRY, dessen `Id`-Feld den zu überschreibenden Eintrag auswählt; der Rest der Struktur ersetzt den aktuellen Inhalt.

Syscall-IDs pro Windows-Version

Windows-VersionSyscall-IDBuild
Win10 15070x103win10-1507
Win10 16070x108win10-1607
Win10 17030x10Cwin10-1703
Win10 17090x10Dwin10-1709
Win10 18030x10Fwin10-1803
Win10 18090x110win10-1809
Win10 19030x111win10-1903
Win10 19090x111win10-1909
Win10 20040x116win10-2004
Win10 20H20x116win10-20h2
Win10 21H10x116win10-21h1
Win10 21H20x117win10-21h2
Win10 22H20x117win10-22h2
Win11 21H20x11Dwin11-21h2
Win11 22H20x11Ewin11-22h2
Win11 23H20x11Ewin11-23h2
Win11 24H20x120win11-24h2
Server 20160x108winserver-2016
Server 20190x110winserver-2019
Server 20220x11Cwinserver-2022
Server 20250x120winserver-2025

Kernel-Modul

ntoskrnl.exeNtModifyDriverEntry

Verwandte APIs

SetFirmwareEnvironmentVariableW (Driver####)BcdSetElementData (Driver Entry GUID)NtAddDriverEntryNtDeleteDriverEntryNtEnumerateDriverEntries

Syscall-Stub

4C 8B D1            mov r10, rcx
B8 20 01 00 00      mov eax, 0x120
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

Pendant zu NtModifyBootEntry, jedoch für den UEFI-`Driver####`-Namespace. Die ID ist der Primärschlüssel innerhalb der EFI_DRIVER_ENTRY; der Kernel löst sie auf, findet die zugehörige Firmware-Variable und schreibt sie in einem einzigen atomaren SetVariable-Aufruf neu. SeSystemEnvironmentPrivilege ist Pflicht.

Häufige Malware-Nutzung

Wird genutzt, wenn bereits ein legitimer OEM-DXE-Treiber für Diagnose oder Firmware-Update in `DriverOrder` existiert. Statt einen neuen (verdächtigen) Eintrag zu registrieren, patcht Malware den `DriverFilePath` des bestehenden Eintrags, sodass er auf ein vom Angreifer kontrolliertes `.efi`-Binary auf der ESP zeigt, und erbt damit den OEM-Slot in DriverOrder samt plausiblem FriendlyName. Diese Technik ist in den LoJax-/MosaicRegressor-Analysen dokumentiert, wo APT28 die bestehende Firmware-Infrastruktur ausnutzte, statt einen neuen Eintrag zu schnitzen. Verteidiger, die nur unbekannte DRIVER_ENTRY-*Hinzufügungen* suchen, verpassen die Mutation.

Erkennungs­möglichkeiten

Sowohl Modifikation als auch Hinzufügung erscheinen in ETW Microsoft-Windows-Kernel-Boot. Diagnostisches Signal ist hier die **Datei-Inhalts-Drift**: die registrierten `Driver####`-Pfade lassen sich enumerieren und hashen; ein veränderter On-Disk-Hash eines zuvor bekannten DXE-Binaries (ohne entsprechendes signiertes Firmware-Update des OEM) ist starkes Indiz für einen `DriverFilePath`-Hijack. Eclypsium, CHIPSEC und das Tooling von Binarly baselinen DXE-Treiber-Hashes; Microsoft Defender for Endpoint zeigt UEFI-Treiber-Telemetrie in den „Boot driver and firmware"-Berichten.

Direkte Syscall-Beispiele

asmx64 direct stub (Win11 24H2, SSN 0x120)

NtModifyDriverEntry PROC
    mov  r10, rcx          ; PEFI_DRIVER_ENTRY (Id inside struct)
    mov  eax, 0120h        ; Win11 24H2
    syscall
    ret
NtModifyDriverEntry ENDP

cRedirect an OEM driver entry to a rogue ESP path

// Defensive analysis: shows the shape of what LoJax-style attackers do.
NTSTATUS hijack_driver(ULONG id, const wchar_t* shim) {
    BYTE buf[1024] = {0};
    PEFI_DRIVER_ENTRY de = (PEFI_DRIVER_ENTRY)buf;
    de->Version = 1;
    de->Length  = sizeof(buf);
    de->Id      = id;                  // existing OEM diagnostic driver
    de->Attributes = LOAD_OPTION_ACTIVE;
    de->BootFilePathOffset = FIELD_OFFSET(EFI_DRIVER_ENTRY, OsOptions);
    // populate FILE_PATH(shim) into buf[BootFilePathOffset..] (omitted)
    return NtModifyDriverEntry(de);
}

rustNaked stub

use std::arch::asm;

#[unsafe(naked)]
unsafe extern "system" fn nt_modify_driver_entry(_entry: *mut u8) -> i32 {
    asm!(
        "mov r10, rcx",
        "mov eax, 0x120",  // Win11 24H2
        "syscall",
        "ret",
        options(noreturn),
    );
}

MITRE ATT&CK-Mappings

Last verified: 2026-05-20