NtOpenEvent
Abre un handle a un objeto de evento nombrado existente.
Prototipo
NTSTATUS NtOpenEvent( PHANDLE EventHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes );
Argumentos
| Name | Type | Dir | Description |
|---|---|---|---|
| EventHandle | PHANDLE | out | Recibe el handle al evento existente si tiene éxito. |
| DesiredAccess | ACCESS_MASK | in | Derechos de acceso solicitados, p. ej. EVENT_MODIFY_STATE | SYNCHRONIZE. |
| ObjectAttributes | POBJECT_ATTRIBUTES | in | Debe especificar el nombre del evento existente bajo \BaseNamedObjects (o un namespace privado). |
IDs de syscalls por versión de Windows
| Versión de Windows | ID de syscall | Build |
|---|---|---|
| Win10 1507 | 0x40 | win10-1507 |
| Win10 1607 | 0x40 | win10-1607 |
| Win10 1703 | 0x40 | win10-1703 |
| Win10 1709 | 0x40 | win10-1709 |
| Win10 1803 | 0x40 | win10-1803 |
| Win10 1809 | 0x40 | win10-1809 |
| Win10 1903 | 0x40 | win10-1903 |
| Win10 1909 | 0x40 | win10-1909 |
| Win10 2004 | 0x40 | win10-2004 |
| Win10 20H2 | 0x40 | win10-20h2 |
| Win10 21H1 | 0x40 | win10-21h1 |
| Win10 21H2 | 0x40 | win10-21h2 |
| Win10 22H2 | 0x40 | win10-22h2 |
| Win11 21H2 | 0x40 | win11-21h2 |
| Win11 22H2 | 0x40 | win11-22h2 |
| Win11 23H2 | 0x40 | win11-23h2 |
| Win11 24H2 | 0x40 | win11-24h2 |
| Server 2016 | 0x40 | winserver-2016 |
| Server 2019 | 0x40 | winserver-2019 |
| Server 2022 | 0x40 | winserver-2022 |
| Server 2025 | 0x40 | winserver-2025 |
Módulo del kernel
APIs relacionadas
Stub del syscall
4C 8B D1 mov r10, rcx B8 40 00 00 00 mov eax, 0x40 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
Abre un objeto de evento existente por su nombre, devolviendo STATUS_OBJECT_NAME_NOT_FOUND si el nombre nunca se ha creado. La SSN `0x40` es estable en todas las builds Win10/11 lanzadas. La búsqueda ocurre dentro de `ObOpenObjectByName` bajo el directorio especificado por `ObjectAttributes->RootDirectory` (típicamente `\BaseNamedObjects` o un `\Sessions\<n>\BaseNamedObjects` por sesión). El handle devuelto es independiente del ciclo de vida del creador — una vez que creador y abridor cierran sus handles, el objeto kernel se libera.
Uso común por malware
Coordinación de implantes entre procesos: un stager crea un evento nombrado y luego el módulo persistente lo abre para saber cuándo operar; o un watchdog abre el evento para detectar que el payload principal sigue vivo. En C2 por named-pipe (Brute Ratel, pivotes Sliver), el lado servidor abre el evento que el cliente señala cuando hay bytes listos, evitando busy-wait. Algunos loaders abren un nombre de evento conocido como kill-switch / sonda anti-sandbox — si el evento existe, se detecta entorno de análisis (guardarraíl estilo WannaCry, generalizado).
Oportunidades de detección
Abrir un evento es por sí mismo de alto volumen y benigno. La señal fuerte es abrir eventos con nombres sospechosos (GUIDs aleatorios, cadenas conocidas de familias como `Global\Ekko*`, `Global\BR4*`), o abrirlo desde un proceso cuya cadena padre no es la del creador. Los eventos `OpenHandle` de ETW `Microsoft-Windows-Kernel-Object` exponen esto. Los EDR que resuelven `OBJECT_ATTRIBUTES.ObjectName` en cada llamada Nt* de apertura (no solo en las capas Win32) capturan las variantes con syscalls directos que eluden los hooks `OpenEventW`.
Ejemplos de syscalls directos
asmx64 direct stub
; Direct syscall stub for NtOpenEvent (SSN 0x40, stable across Win10/11)
NtOpenEvent PROC
mov r10, rcx ; syscall convention
mov eax, 40h ; SSN
syscall
ret
NtOpenEvent ENDPcOpen a named event as IPC rendezvous
UNICODE_STRING name;
RtlInitUnicodeString(&name, L"\\BaseNamedObjects\\Global\\BeaconReady");
OBJECT_ATTRIBUTES oa;
InitializeObjectAttributes(&oa, &name, OBJ_CASE_INSENSITIVE, NULL, NULL);
HANDLE hEvent = NULL;
NTSTATUS st = NtOpenEvent(&hEvent, EVENT_MODIFY_STATE | SYNCHRONIZE, &oa);
if (st == STATUS_OBJECT_NAME_NOT_FOUND) {
// creator side hasn't started yet
}rustSandbox probe via OpenEvent
// Cargo: windows-sys = "0.59"
use windows_sys::Win32::System::Threading::{OpenEventW, EVENT_MODIFY_STATE};
use windows_sys::core::w;
unsafe fn looks_like_sandbox() -> bool {
// Many analyst VMs pre-create well-known names; presence reveals instrumentation.
!OpenEventW(EVENT_MODIFY_STATE, 0, w!("Global\\CuckooEventMutex")).is_null()
}Mapeos MITRE ATT&CK
Last verified: 2026-05-20