> Windows Syscalls
ntoskrnl.exeT1562.002T1106

NtCloseObjectAuditAlarm

Émet l'entrée du journal Sécurité associée à une ouverture audit-alarm antérieure, marquant la fermeture du handle.

Prototype

NTSTATUS NtCloseObjectAuditAlarm(
  PUNICODE_STRING SubsystemName,
  PVOID           HandleId,
  BOOLEAN         GenerateOnClose
);

Arguments

NameTypeDirDescription
SubsystemNamePUNICODE_STRINGinNom de sous-système, doit correspondre à la valeur utilisée dans l'appel NtAccessCheck*AuditAlarm d'origine.
HandleIdPVOIDinIdentifiant opaque de handle utilisé pour corréler avec l'événement d'ouverture antérieur.
GenerateOnCloseBOOLEANinTRUE si l'appel NtAccessCheck*AuditAlarm antérieur a renvoyé GenerateOnClose=TRUE ; FALSE est un no-op.

IDs de syscalls par version de Windows

Version de WindowsID de syscallBuild
Win10 15070x3Bwin10-1507
Win10 16070x3Bwin10-1607
Win10 17030x3Bwin10-1703
Win10 17090x3Bwin10-1709
Win10 18030x3Bwin10-1803
Win10 18090x3Bwin10-1809
Win10 19030x3Bwin10-1903
Win10 19090x3Bwin10-1909
Win10 20040x3Bwin10-2004
Win10 20H20x3Bwin10-20h2
Win10 21H10x3Bwin10-21h1
Win10 21H20x3Bwin10-21h2
Win10 22H20x3Bwin10-22h2
Win11 21H20x3Bwin11-21h2
Win11 22H20x3Bwin11-22h2
Win11 23H20x3Bwin11-23h2
Win11 24H20x3Bwin11-24h2
Server 20160x3Bwinserver-2016
Server 20190x3Bwinserver-2019
Server 20220x3Bwinserver-2022
Server 20250x3Bwinserver-2025

Module noyau

ntoskrnl.exeNtCloseObjectAuditAlarm

APIs liées

ObjectCloseAuditAlarmWNtAccessCheckAndAuditAlarmNtAccessCheckByTypeAndAuditAlarmNtAccessCheckByTypeResultListAndAuditAlarmNtDeleteObjectAuditAlarmNtClose

Stub du 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

Notes non documentées

Génère l'événement Sécurité 4658 (« Le handle d'un objet a été fermé »). Il doit être invoqué quand un appel NtAccessCheck*AuditAlarm précédent a renvoyé GenerateOnClose=TRUE, pour que la paire ouverture/fermeture soit correctement corrélée dans le journal Sécurité. La fonction *n'est pas* appelée automatiquement par NtClose — le sous-système audité (LSASS, SAM, SCM, services tiers SACL-aware) est responsable de la comptabilité. Des événements de fermeture manquants pour un handle audité ouvert connu signalent soit une fin de processus brutale (handle libéré par le noyau sans notifier le sous-système), soit un tampering actif de journal. Le SSN `0x3B` est stable depuis Windows 10 1507.

Usage courant par les malwares

Pratiquement nul. Le syscall est une primitive de journalisation — l'appeler ajoute des entrées de journal Sécurité, l'inverse de ce que veut le malware. Aucune famille commodity n'est observée l'invoquant. La direction intéressante est le 4658 *manquant* : un 4656 (ouverture) sans son 4658 correspondant dans la même session est un indicateur à haute confiance de perturbation du sous-système d'audit (souvent via arrêt du service EventLog ou saturation du canal par NtFlushKey + pression registre).

Opportunités de détection

Apparier chaque 4656 (handle demandé avec accès SACL-monitoré) avec un 4658 (handle fermé). La distribution de latence est dominée par les handles courts (< 1s pour fichiers, < 100ms pour clés de registre). Un 4656-sans-4658 persistant sur des objets SACLés (processus LSASS, AdminSDHolder, clés registre Defender) est un signal fort de tampering. Sysmon Event ID 13 (valeur de registre définie) et 16 (config Sysmon modifiée) plus EVENT_TRACE_FLAG_REGISTRY ETW fournissent une télémétrie parallèle indépendante du canal Sécurité lui-même.

Exemples de syscalls directs

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 ENDP

cPair 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.
}

Mappings MITRE ATT&CK

Last verified: 2026-05-20