> Windows Syscalls
ntoskrnl.exeT1106

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

NameTypeDirDescription
HandleHANDLEinHandle auf ein benanntes Kernel-Objekt, dessen Object-Header als OBJ_PERMANENT markiert wird.

Syscall-IDs pro Windows-Version

Windows-VersionSyscall-IDBuild
Win10 15070xFDwin10-1507
Win10 16070x102win10-1607
Win10 17030x106win10-1703
Win10 17090x107win10-1709
Win10 18030x108win10-1803
Win10 18090x108win10-1809
Win10 19030x109win10-1903
Win10 19090x109win10-1909
Win10 20040x10Ewin10-2004
Win10 20H20x10Ewin10-20h2
Win10 21H10x10Ewin10-21h1
Win10 21H20x10Fwin10-21h2
Win10 22H20x10Fwin10-22h2
Win11 21H20x115win11-21h2
Win11 22H20x116win11-22h2
Win11 23H20x116win11-23h2
Win11 24H20x118win11-24h2
Server 20160x102winserver-2016
Server 20190x108winserver-2019
Server 20220x114winserver-2022
Server 20250x118winserver-2025

Kernel-Modul

ntoskrnl.exeNtMakePermanentObject

Verwandte APIs

NtMakeTemporaryObjectNtCreateSectionNtCreateEventAdjustTokenPrivileges (SeCreatePermanentPrivilege)

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.

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

cPromote 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