NtDeleteBootEntry
Entfernt einen BOOT_ENTRY anhand der ID aus der BCD und löscht auf UEFI die zugehörige Firmware-Variable.
Prototyp
NTSTATUS NtDeleteBootEntry( ULONG Id );
Argumente
| Name | Type | Dir | Description |
|---|---|---|---|
| Id | ULONG | in | BCD-Kennung des zu entfernenden Booteintrags (Wert, den NtAddBootEntry zuvor zurückgegeben oder NtEnumerateBootEntries aufgelistet hat). |
Syscall-IDs pro Windows-Version
| Windows-Version | Syscall-ID | Build |
|---|---|---|
| Win10 1507 | 0xC2 | win10-1507 |
| Win10 1607 | 0xC5 | win10-1607 |
| Win10 1703 | 0xC8 | win10-1703 |
| Win10 1709 | 0xC9 | win10-1709 |
| Win10 1803 | 0xCA | win10-1803 |
| Win10 1809 | 0xCB | win10-1809 |
| Win10 1903 | 0xCC | win10-1903 |
| Win10 1909 | 0xCC | win10-1909 |
| Win10 2004 | 0xD0 | win10-2004 |
| Win10 20H2 | 0xD0 | win10-20h2 |
| Win10 21H1 | 0xD0 | win10-21h1 |
| Win10 21H2 | 0xD1 | win10-21h2 |
| Win10 22H2 | 0xD1 | win10-22h2 |
| Win11 21H2 | 0xD6 | win11-21h2 |
| Win11 22H2 | 0xD7 | win11-22h2 |
| Win11 23H2 | 0xD7 | win11-23h2 |
| Win11 24H2 | 0xD9 | win11-24h2 |
| Server 2016 | 0xC5 | winserver-2016 |
| Server 2019 | 0xCB | winserver-2019 |
| Server 2022 | 0xD5 | winserver-2022 |
| Server 2025 | 0xD9 | winserver-2025 |
Kernel-Modul
Verwandte APIs
Syscall-Stub
4C 8B D1 mov r10, rcx B8 D9 00 00 00 mov eax, 0xD9 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
Syscall mit nur einem Argument — der BCD-ID. Entspricht `BcdDeleteObject` im User-Mode bzw. `bcdedit /delete {GUID}` auf der Kommandozeile. Erfordert SeSystemEnvironmentPrivilege. Auf UEFI setzt der Kernel `EFI_SET_VARIABLE` mit `DataSize = 0` gegen die passende `Boot####`-NVRAM-Variable ab — die durch die Firmware definierte Löschsemantik.
Häufige Malware-Nutzung
Bootkits nutzen NtDeleteBootEntry für **forensische Bereinigung** und **Anti-Recovery**. Forensische Bereinigung: nach Nutzung eines temporären Booteintrags zum Flashen eines UEFI-Implants (LoJax-/MosaicRegressor-Muster) wird der Helfereintrag entfernt, sodass ein nachgelagerter `bcdedit /enum FIRMWARE`-Lauf nichts zeigt. Anti-Recovery: Ransomware (insbesondere ein TrickBoot-Derivat) löscht die `{recovery}`- und Windows-RE-Einträge, damit Opfer WinRE nicht booten und nicht aus VSS wiederherstellen oder MBR/GPT reparieren können. Wiper gehen weiter und löschen `{bootmgr}` selbst, um den Host nach der Verschlüsselung unbrauchbar zu machen.
Erkennungsmöglichkeiten
ETW Microsoft-Windows-Kernel-Boot ist die primäre Quelle; das Löschereignis identifiziert die entfernte GUID. Mit einem periodischen Enumerations-Snapshot kombinieren — wenn ein Eintrag, der gestern Abend noch in `bcdedit /enum FIRMWARE` stand, heute fehlt, **ohne** dass eine entsprechende Admin-Aktion dokumentiert ist, ist das ein Alarm hoher Konfidenz. Das Löschen von `{default}`, `{bootmgr}` oder einer beliebigen `{recovery*}`-GUID gilt als Indikator für einen destruktiven Angriff (BCDEdit-Ransomware-Playbook) und sollte sofort eine VSS-/Backup-Integritätsprüfung auslösen.
Direkte Syscall-Beispiele
asmx64 direct stub (Win11 24H2, SSN 0xD9)
NtDeleteBootEntry PROC
mov r10, rcx ; ULONG Id
mov eax, 0D9h ; Win11 24H2
syscall
ret
NtDeleteBootEntry ENDPcAnti-recovery sweep (DO NOT RUN)
// Mirrors what ransomware does after encryption to prevent WinRE-based recovery.
// Public defensive analysis only.
NTSTATUS sweep_recovery(void) {
// IDs harvested from NtEnumerateBootEntries; filter on FriendlyName == "Windows Recovery Environment".
ULONG recovery_ids[] = { 0x10, 0x11 };
for (size_t i = 0; i < ARRAYSIZE(recovery_ids); ++i) {
NTSTATUS s = NtDeleteBootEntry(recovery_ids[i]);
if (!NT_SUCCESS(s)) return s;
}
return STATUS_SUCCESS;
}rustNaked stub
use std::arch::asm;
#[unsafe(naked)]
unsafe extern "system" fn nt_delete_boot_entry(_id: u32) -> i32 {
asm!(
"mov r10, rcx",
"mov eax, 0xD9", // Win11 24H2
"syscall",
"ret",
options(noreturn),
);
}MITRE ATT&CK-Mappings
Last verified: 2026-05-20