NtOpenEvent
Öffnet ein Handle auf ein bestehendes benanntes Event-Objekt.
Prototyp
NTSTATUS NtOpenEvent( PHANDLE EventHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes );
Argumente
| Name | Type | Dir | Description |
|---|---|---|---|
| EventHandle | PHANDLE | out | Erhält bei Erfolg das Handle auf das bestehende Event. |
| DesiredAccess | ACCESS_MASK | in | Angeforderte Zugriffsrechte, z. B. EVENT_MODIFY_STATE | SYNCHRONIZE. |
| ObjectAttributes | POBJECT_ATTRIBUTES | in | Muss den Namen des bestehenden Events unter \BaseNamedObjects (oder einem privaten Namespace) angeben. |
Syscall-IDs pro Windows-Version
| Windows-Version | Syscall-ID | 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 |
Kernel-Modul
Verwandte APIs
Syscall-Stub
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
Undokumentierte Hinweise
Öffnet ein bestehendes Event-Objekt anhand seines Namens und liefert STATUS_OBJECT_NAME_NOT_FOUND, wenn der Name nie erzeugt wurde. SSN `0x40` ist über jeden ausgelieferten Win10/11-Build stabil. Das Lookup geschieht in `ObOpenObjectByName` unter dem in `ObjectAttributes->RootDirectory` angegebenen Directory (üblicherweise `\BaseNamedObjects` oder ein sitzungslokales `\Sessions\<n>\BaseNamedObjects`). Das gelieferte Handle ist unabhängig vom Lebenszyklus des Erzeugers — sobald Erzeuger und Öffner ihr Handle schließen, wird das Kernelobjekt freigegeben.
Häufige Malware-Nutzung
Prozessübergreifende Implant-Koordination: ein Stager erzeugt ein benanntes Event, das persistente Modul öffnet es, um zu wissen, wann es loslegen soll; oder ein Watchdog öffnet das Event, um festzustellen, dass der Haupt-Payload noch lebt. In Named-Pipe-C2 (Brute Ratel, Sliver-Pivots) öffnet die Serverseite das Event, das der Client signalisiert, sobald Bytes bereitstehen, und vermeidet Busy-Wait. Manche Loader öffnen einen wohlbekannten Event-Namen als Kill-Switch / Sandbox-Sonde — existiert das Event, ist eine Analyseumgebung erkannt (verallgemeinertes WannaCry-Guardrail).
Erkennungsmöglichkeiten
Ein Event zu öffnen ist für sich genommen sehr häufig und harmlos. Das starke Signal sind Öffnungen mit verdächtigen Namen (Zufalls-GUIDs, familienbekannte Strings wie `Global\Ekko*`, `Global\BR4*`) oder aus einem Prozess, dessen Parent-Kette nicht die des Erzeugers ist. ETW-`Microsoft-Windows-Kernel-Object`-`OpenHandle`-Events legen das offen. EDRs, die `OBJECT_ATTRIBUTES.ObjectName` bei jedem Nt*-Open-Aufruf auflösen (nicht nur auf Win32-Ebene), erfassen Direct-Syscall-Varianten, die `OpenEventW`-Hooks umgehen.
Direkte Syscall-Beispiele
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()
}MITRE ATT&CK-Mappings
Last verified: 2026-05-20