NtCloseObjectAuditAlarm
Emite la entrada del log de Seguridad que se empareja con una apertura audit-alarm anterior, marcando el cierre del handle.
Prototipo
NTSTATUS NtCloseObjectAuditAlarm( PUNICODE_STRING SubsystemName, PVOID HandleId, BOOLEAN GenerateOnClose );
Argumentos
| Name | Type | Dir | Description |
|---|---|---|---|
| SubsystemName | PUNICODE_STRING | in | Nombre de subsistema, debe coincidir con el valor usado en la llamada NtAccessCheck*AuditAlarm original. |
| HandleId | PVOID | in | ID opaco del handle usado para correlación con el evento de apertura anterior. |
| GenerateOnClose | BOOLEAN | in | TRUE si la llamada NtAccessCheck*AuditAlarm anterior devolvió GenerateOnClose=TRUE; FALSE es no-op. |
IDs de syscalls por versión de Windows
| Versión de Windows | ID de syscall | Build |
|---|---|---|
| Win10 1507 | 0x3B | win10-1507 |
| Win10 1607 | 0x3B | win10-1607 |
| Win10 1703 | 0x3B | win10-1703 |
| Win10 1709 | 0x3B | win10-1709 |
| Win10 1803 | 0x3B | win10-1803 |
| Win10 1809 | 0x3B | win10-1809 |
| Win10 1903 | 0x3B | win10-1903 |
| Win10 1909 | 0x3B | win10-1909 |
| Win10 2004 | 0x3B | win10-2004 |
| Win10 20H2 | 0x3B | win10-20h2 |
| Win10 21H1 | 0x3B | win10-21h1 |
| Win10 21H2 | 0x3B | win10-21h2 |
| Win10 22H2 | 0x3B | win10-22h2 |
| Win11 21H2 | 0x3B | win11-21h2 |
| Win11 22H2 | 0x3B | win11-22h2 |
| Win11 23H2 | 0x3B | win11-23h2 |
| Win11 24H2 | 0x3B | win11-24h2 |
| Server 2016 | 0x3B | winserver-2016 |
| Server 2019 | 0x3B | winserver-2019 |
| Server 2022 | 0x3B | winserver-2022 |
| Server 2025 | 0x3B | winserver-2025 |
Módulo del kernel
APIs relacionadas
Stub del syscall
4C 8B D1 mov r10, rcx B8 3B 00 00 00 mov eax, 0x3B 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
Genera el evento de Seguridad 4658 ("Se cerró el handle a un objeto"). Debe invocarse cuando una llamada NtAccessCheck*AuditAlarm anterior devolvió GenerateOnClose=TRUE, para que el par apertura/cierre quede correctamente correlacionado en el log de Seguridad. La función *no* la llama automáticamente NtClose — el subsistema auditado (LSASS, SAM, SCM, servicios terceros SACL-aware) es responsable del bookkeeping. Eventos de cierre faltantes para un handle auditado abierto conocido indican o bien una salida abrupta del proceso (handle liberado por el kernel sin notificar al subsistema), o bien manipulación activa del log. El SSN `0x3B` ha sido estable desde Windows 10 1507.
Uso común por malware
Prácticamente nulo. El syscall es una primitiva de logging — llamarlo añade entradas al log de Seguridad, lo opuesto a lo que quiere el malware. Ninguna familia commodity se observa invocándolo. La dirección interesante es el 4658 *ausente*: un 4656 (apertura) sin su 4658 correspondiente en la misma sesión es un indicador de alta confianza de disrupción del subsistema de auditoría (a menudo vía detener el servicio EventLog o saturar el canal con NtFlushKey + presión de registro).
Oportunidades de detección
Emparejar cada 4656 (handle solicitado con acceso SACL-monitoreado) con un 4658 (handle cerrado). La distribución de latencia la dominan los handles de vida corta (< 1s para ficheros, < 100ms para claves de registro). Un 4656-sin-4658 persistente sobre objetos con SACL (proceso LSASS, AdminSDHolder, claves de registro de Defender) es señal fuerte de manipulación. Sysmon Event ID 13 (valor de registro establecido) y 16 (config de Sysmon cambiada) más EVENT_TRACE_FLAG_REGISTRY de ETW dan telemetría paralela independiente del canal de Seguridad.
Ejemplos de syscalls directos
asmx64 direct stub
; Direct syscall stub for NtCloseObjectAuditAlarm (SSN 0x3B, Win10 1507+)
NtCloseObjectAuditAlarm PROC
mov r10, rcx ; syscall convention
mov eax, 3Bh ; SSN
syscall
ret
NtCloseObjectAuditAlarm ENDPcPair with NtAccessCheckByTypeAndAuditAlarm
// Bookkeeping pattern used by SACL-aware services.
UNICODE_STRING sub = RTL_CONSTANT_STRING(L"Security");
BOOLEAN gen_on_close = FALSE;
ACCESS_MASK granted = 0;
NTSTATUS access_status = STATUS_ACCESS_DENIED;
NtAccessCheckByTypeAndAuditAlarm(
&sub, (PVOID)hHandleId,
&type_name, &obj_name,
pSd, NULL,
FILE_GENERIC_READ,
AuditEventObjectAccess, 0,
pObjectTypeList, otl_len,
&g_FileMapping, FALSE,
&granted, &access_status, &gen_on_close);
// ... use the handle ...
if (gen_on_close) {
NtCloseObjectAuditAlarm(&sub, (PVOID)hHandleId, TRUE);
// -> Security event 4658 with the same HandleId for correlation.
}
NtClose(hFile);rustWin32 ObjectCloseAuditAlarmW wrapper
use windows_sys::Win32::Security::Authorization::ObjectCloseAuditAlarmW;
unsafe {
let ok = ObjectCloseAuditAlarmW(
windows_sys::w!("Security"),
handle_id as *mut _,
gen_on_close as i32,
);
// ok != 0 -> 4658 emitted.
}Mapeos MITRE ATT&CK
Last verified: 2026-05-20