> Windows Syscalls
ntoskrnl.exeT1106

NtMakePermanentObject

Establece el atributo OBJ_PERMANENT en un objeto kernel con nombre para que sobreviva tras cerrarse el último handle.

Prototipo

NTSTATUS NtMakePermanentObject(
  HANDLE Handle
);

Argumentos

NameTypeDirDescription
HandleHANDLEinHandle a un objeto kernel con nombre cuyo header subyacente se marcará OBJ_PERMANENT.

IDs de syscalls por versión de Windows

Versión de WindowsID de syscallBuild
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

Módulo del kernel

ntoskrnl.exeNtMakePermanentObject

APIs relacionadas

NtMakeTemporaryObjectNtCreateSectionNtCreateEventAdjustTokenPrivileges (SeCreatePermanentPrivilege)

Stub del syscall

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

Notas no documentadas

Establece el flag `OBJ_PERMANENT` en el `_OBJECT_HEADER` subyacente para que el objeto *no* se libere cuando el último handle de usuario se cierre. Lado kernel: `ObSetPermanentObject(object, TRUE)` seguido de una referencia extra mantenida por Ob. Los objetos permanentes son cómo Win32 mantiene secciones con nombre, events y semáforos vivos después de que su creador sale — `\BaseNamedObjects\Global\Foo` sobrevive porque SCM, csrss o el desktop window manager llamó `NtMakePermanentObject` sobre él (o creó el objeto directamente con `OBJ_PERMANENT` en `OBJECT_ATTRIBUTES::Attributes`). Requiere `SeCreatePermanentPrivilege`, mantenido solo por `LocalSystem` y un puñado de identidades de servicio — así que el uso desde un token user-mode normal normalmente devuelve `STATUS_PRIVILEGE_NOT_HELD`. La llamada está en la lista de deprecación de Microsoft desde Vista (reemplazada por crear con `OBJ_PERMANENT` directamente en la llamada `NtCreate*`), pero aún exportada y funcional. Contraparte: `NtMakeTemporaryObject`.

Uso común por malware

Señal de malware baja. El caso de uso legítimo estrecho — mantener supervivientes en `\BaseNamedObjects` — solapa con un pequeño conjunto de trucos de persistencia. La persistencia por sección con nombre (era Skywiper / Flame, y PoCs modernos) crea una sección nombrada permanente, escribe un payload en ella y luego sale — un map posterior por un proceso privilegiado del mismo nombre de sección trae el payload de vuelta a un espacio de direcciones privilegiado. Poner `OBJ_PERMANENT` al crear es la vía más común; llamar `NtMakePermanentObject` después es un patrón menos sigiloso. Algunos droppers e instaladores de rootkits lo usan para mantener un objeto nombrado IPC `Event` o `Mutex` vivo a través de reinicios de proceso como baliza de presencia. El requisito de privilegio limita el abuso real a payloads ya elevados.

Oportunidades de detección

Sin evento ETW dedicado. La naturaleza privilegiada de `SeCreatePermanentPrivilege` en sí es la señal de alta fidelidad — cualquier proceso no-sistema que lo habilite y use exitosamente merece investigación sin importar qué syscall llame. Desde el ángulo de hunt, snapshot `\BaseNamedObjects` y `\BaseNamedObjects\Global` (`WinObj` o recorridos `NtQueryDirectoryObject`) al boot y a intervalos; objetos con atributo `Permanent` que no existían al boot y fueron creados por un proceso no-sistema son el IOC real. ETW `Microsoft-Windows-Kernel-Object` con eventos `Handle Create` permite correlacionar el atributo `OBJ_PERMANENT` en `ObjectAttributes` al momento de creación.

Ejemplos de syscalls directos

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
}

Mapeos MITRE ATT&CK

Last verified: 2026-05-20