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
| Name | Type | Dir | Description |
|---|---|---|---|
| SubsystemName | PUNICODE_STRING | in | Nom de sous-système, doit correspondre à la valeur utilisée dans l'appel NtAccessCheck*AuditAlarm d'origine. |
| HandleId | PVOID | in | Identifiant opaque de handle utilisé pour corréler avec l'événement d'ouverture antérieur. |
| GenerateOnClose | BOOLEAN | in | TRUE 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 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 |
Module noyau
APIs liées
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 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.
}Mappings MITRE ATT&CK
Last verified: 2026-05-20