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
| Name | Type | Dir | Description |
|---|---|---|---|
| Handle | HANDLE | in | Handle a un objeto kernel con nombre cuyo header subyacente se marcará OBJ_PERMANENT. |
IDs de syscalls por versión de Windows
| Versión de Windows | ID de syscall | 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 |
Módulo del kernel
APIs relacionadas
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 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
}Mapeos MITRE ATT&CK
Last verified: 2026-05-20