NtMakePermanentObject
Setzt das Attribut OBJ_PERMANENT auf ein benanntes Kernel-Objekt, sodass es das Schließen des letzten Handles überdauert.
Prototyp
NTSTATUS NtMakePermanentObject( HANDLE Handle );
Argumente
| Name | Type | Dir | Description |
|---|---|---|---|
| Handle | HANDLE | in | Handle auf ein benanntes Kernel-Objekt, dessen Object-Header als OBJ_PERMANENT markiert wird. |
Syscall-IDs pro Windows-Version
| Windows-Version | Syscall-ID | Build |
|---|---|---|
| Win10 1507 | 0xFD | win10-1507 |
| Win10 1607 | 0x102 | win10-1607 |
| Win10 1703 | 0x106 | win10-1703 |
| Win10 1709 | 0x107 | win10-1709 |
| Win10 1803 | 0x108 | win10-1803 |
| Win10 1809 | 0x108 | win10-1809 |
| Win10 1903 | 0x109 | win10-1903 |
| Win10 1909 | 0x109 | win10-1909 |
| Win10 2004 | 0x10E | win10-2004 |
| Win10 20H2 | 0x10E | win10-20h2 |
| Win10 21H1 | 0x10E | win10-21h1 |
| Win10 21H2 | 0x10F | win10-21h2 |
| Win10 22H2 | 0x10F | win10-22h2 |
| Win11 21H2 | 0x115 | win11-21h2 |
| Win11 22H2 | 0x116 | win11-22h2 |
| Win11 23H2 | 0x116 | win11-23h2 |
| Win11 24H2 | 0x118 | win11-24h2 |
| Server 2016 | 0x102 | winserver-2016 |
| Server 2019 | 0x108 | winserver-2019 |
| Server 2022 | 0x114 | winserver-2022 |
| Server 2025 | 0x118 | winserver-2025 |
Kernel-Modul
Verwandte APIs
Syscall-Stub
4C 8B D1 mov r10, rcx B8 18 01 00 00 mov eax, 0x118 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
Setzt das Flag `OBJ_PERMANENT` im zugrundeliegenden `_OBJECT_HEADER`, sodass das Objekt *nicht* freigegeben wird, wenn das letzte User-Handle schließt. Kernel-seitig: `ObSetPermanentObject(object, TRUE)` plus eine zusätzliche von Ob gehaltene Referenz. Permanente Objekte sind, wie Win32 benannte Sections, Events und Semaphoren am Leben hält, nachdem ihr Erzeuger beendet wurde — `\BaseNamedObjects\Global\Foo` überlebt, weil SCM, csrss oder der Desktop Window Manager `NtMakePermanentObject` darauf aufgerufen hat (oder das Objekt gleich mit `OBJ_PERMANENT` in `OBJECT_ATTRIBUTES::Attributes` erzeugt hat). Erfordert `SeCreatePermanentPrivilege`, das nur `LocalSystem` und einige Service-Identitäten halten — Nutzung aus einem normalen User-Mode-Token liefert üblicherweise `STATUS_PRIVILEGE_NOT_HELD`. Der Aufruf steht seit Vista auf Microsofts Deprecation-Liste (idiomatisch ersetzt durch Erzeugung mit `OBJ_PERMANENT` im `NtCreate*`-Aufruf), ist aber weiterhin exportiert und funktional. Gegenstück: `NtMakeTemporaryObject`.
Häufige Malware-Nutzung
Geringes Malware-Signal. Der enge legitime Anwendungsfall — `\BaseNamedObjects`-Überlebende — überlappt mit einigen Persistenz-Tricks. Named-Section-Persistenz (Skywiper / Flame-Ära und moderne PoCs) erzeugt eine permanente benannte Section, schreibt ein Payload hinein und beendet sich — ein späteres Mapping derselben Section-Namen durch einen privilegierten Prozess bringt das Payload in einen privilegierten Adressraum zurück. `OBJ_PERMANENT` schon bei der Erzeugung zu setzen ist der gängigere Weg; `NtMakePermanentObject` im Nachhinein zu rufen ist ein weniger leises Muster. Einige Dropper und Rootkit-Installer halten damit ein benanntes IPC-`Event` oder `Mutex`-Objekt prozessneustart-übergreifend am Leben — als Presence-Beacon. Die Privileg-Voraussetzung deckelt realen Missbrauch auf bereits elevierte Payloads.
Erkennungsmöglichkeiten
Kein dediziertes ETW-Event. Die privilegierte Natur von `SeCreatePermanentPrivilege` selbst ist das hochfidele Signal — jeder Nicht-System-Prozess, der es erfolgreich aktiviert und nutzt, verdient Untersuchung, egal welchen Syscall er aufruft. Aus Hunt-Sicht: `\BaseNamedObjects` und `\BaseNamedObjects\Global` beim Boot und periodisch snapshotten (`WinObj` oder `NtQueryDirectoryObject`-Walks); Objekte mit `Permanent`-Attribut, die beim Boot nicht existierten und von einem Nicht-System-Prozess erzeugt wurden, sind der eigentliche IOC. `Microsoft-Windows-Kernel-Object` ETW mit `Handle Create`-Events erlaubt es, das `OBJ_PERMANENT`-Attribut in `ObjectAttributes` zum Erzeugungszeitpunkt zu korrelieren.
Direkte Syscall-Beispiele
asmx64 direct stub (Win11 24H2)
; Direct syscall stub for NtMakePermanentObject (SSN 0x118 on Win11 24H2 / Server 2025)
NtMakePermanentObject PROC
mov r10, rcx ; syscall convention
mov eax, 118h ; SSN — drifts; resolve dynamically for portability
syscall
ret
NtMakePermanentObject ENDPcPromote a named section so it outlives the creator
// Promote an existing named section to OBJ_PERMANENT so closing the last
// handle does not free it — payload-staging persistence pattern.
// Requires SeCreatePermanentPrivilege enabled in the calling token.
UNICODE_STRING name; RtlInitUnicodeString(&name, L"\\BaseNamedObjects\\Global\\__stage__");
OBJECT_ATTRIBUTES oa;
InitializeObjectAttributes(&oa, &name, OBJ_CASE_INSENSITIVE, NULL, NULL);
HANDLE hSec;
LARGE_INTEGER size = { .QuadPart = 0x10000 };
if (NT_SUCCESS(NtCreateSection(&hSec, SECTION_ALL_ACCESS, &oa,
&size, PAGE_EXECUTE_READWRITE,
SEC_COMMIT, NULL))) {
NtMakePermanentObject(hSec); // section now survives our process exit
NtClose(hSec); // a later process can NtOpenSection() it
}MITRE ATT&CK-Mappings
Last verified: 2026-05-20