NtOpenSection
Öffnet ein Handle auf ein vorhandenes, benanntes Section-Objekt (Shared Memory oder Image-Mapping).
Prototyp
NTSTATUS NtOpenSection( PHANDLE SectionHandle, ACCESS_MASK DesiredAccess, POBJECT_ATTRIBUTES ObjectAttributes );
Argumente
| Name | Type | Dir | Description |
|---|---|---|---|
| SectionHandle | PHANDLE | out | Nimmt das Handle auf die geöffnete Section entgegen. |
| DesiredAccess | ACCESS_MASK | in | Zugriffsrechte (SECTION_MAP_READ, SECTION_MAP_WRITE, SECTION_MAP_EXECUTE, SECTION_QUERY, …). |
| ObjectAttributes | POBJECT_ATTRIBUTES | in | Objektattribute mit dem Section-Namen (z. B. \BaseNamedObjects\MeineSection). |
Syscall-IDs pro Windows-Version
| Windows-Version | Syscall-ID | Build |
|---|---|---|
| Win10 1507 | 0x37 | win10-1507 |
| Win10 1607 | 0x37 | win10-1607 |
| Win10 1703 | 0x37 | win10-1703 |
| Win10 1709 | 0x37 | win10-1709 |
| Win10 1803 | 0x37 | win10-1803 |
| Win10 1809 | 0x37 | win10-1809 |
| Win10 1903 | 0x37 | win10-1903 |
| Win10 1909 | 0x37 | win10-1909 |
| Win10 2004 | 0x37 | win10-2004 |
| Win10 20H2 | 0x37 | win10-20h2 |
| Win10 21H1 | 0x37 | win10-21h1 |
| Win10 21H2 | 0x37 | win10-21h2 |
| Win10 22H2 | 0x37 | win10-22h2 |
| Win11 21H2 | 0x37 | win11-21h2 |
| Win11 22H2 | 0x37 | win11-22h2 |
| Win11 23H2 | 0x37 | win11-23h2 |
| Win11 24H2 | 0x37 | win11-24h2 |
| Server 2016 | 0x37 | winserver-2016 |
| Server 2019 | 0x37 | winserver-2019 |
| Server 2022 | 0x37 | winserver-2022 |
| Server 2025 | 0x37 | winserver-2025 |
Kernel-Modul
Verwandte APIs
Syscall-Stub
4C 8B D1 mov r10, rcx B8 37 00 00 00 mov eax, 0x37 ; stable across all builds 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
Liefert ein Handle auf ein vorhandenes Section-Objekt, das über den NT-Object-Manager-Namespace aufgelöst wird — typischerweise `\BaseNamedObjects\<Name>` für Win32-Aufrufer oder `\KnownDlls\<dll>` für vom OS geladene Image-Sections. Die SSN ist von Windows 10 1507 bis Windows 11 24H2 konstant bei `0x37` geblieben und damit ein verlässlicher Kandidat für hartkodierte direkte Syscalls. `OpenFileMapping` ist der dünne Win32-Wrapper, der den Namen `\Sessions\<id>\BaseNamedObjects\<Name>` baut und diesen Syscall aufruft.
Häufige Malware-Nutzung
Zwei verschiedene Missbrauchsmuster. (1) **Voraussetzung für KnownDlls-Poisoning**: Implants öffnen `\KnownDlls\<Ziel>.dll` mit `SECTION_MAP_WRITE` (in der Regel nur mit hoher Integrität oder nach vorherigem Austausch der Section möglich) und überschreiben die ausführbaren Bytes einer System-DLL, die in jedem Prozess noch image-cow gemappt ist — eine klassische Write-Once/Infect-All-Primitive aus der ursprünglichen KnownDlls-Hijack-Forschung. (2) **Missbrauch privilegierter Service-IPC**: einige Windows-Dienste stellen benannte Sections in `\BaseNamedObjects\` für legitime IPC bereit; offensive Tools öffnen diese Sections, um das Protokoll zu belauschen oder Daten über Integritätsgrenzen hinweg zu schmuggeln. Die perfekte Stabilität der SSN macht `NtOpenSection` zu einem beliebten hartkodierten Direct-Syscall in Red-Team-Loadern.
Erkennungsmöglichkeiten
Sysmon Event 7 (ImageLoad) und Event 10 (ProcessAccess) decken Section-Öffnungen nicht direkt ab. Das ETW-Event `Microsoft-Windows-Kernel-General` ID 6 (ImageLoad) feuert beim anschließenden Map. Für hohe Trefferqualität können Kernel-Callbacks via `ObRegisterCallbacks` auf `*PsSectionType` Handle-Öffnungen auditieren; EDR-Anbieter hooken `NtOpenSection` zunehmend, um Öffnungen von `\KnownDlls\*` mit Schreibzugriff zu markieren. Aus dem Userland enumeriert `NtQuerySystemInformation(SystemHandleInformation)` alle aktuell gehaltenen Section-Handles — ein periodischer Snapshot deckt ungewöhnliche prozessübergreifende Section-Handles auf.
Direkte Syscall-Beispiele
cOpen a named shared section
// Open \BaseNamedObjects\MySharedSection for read access.
UNICODE_STRING name;
RtlInitUnicodeString(&name, L"\\BaseNamedObjects\\MySharedSection");
OBJECT_ATTRIBUTES oa;
InitializeObjectAttributes(&oa, &name, OBJ_CASE_INSENSITIVE, NULL, NULL);
HANDLE hSection = NULL;
NTSTATUS s = NtOpenSection(&hSection, SECTION_MAP_READ | SECTION_QUERY, &oa);
if (!NT_SUCCESS(s)) return s;
PVOID view = NULL;
SIZE_T viewSize = 0;
NtMapViewOfSection(hSection, NtCurrentProcess(),
&view, 0, 0, NULL, &viewSize,
ViewShare, 0, PAGE_READONLY);asmx64 direct stub (stable SSN 0x37)
; NtOpenSection direct stub — SSN 0x37 on every Win10/Win11 build
NtOpenSection PROC
mov r10, rcx
mov eax, 37h
syscall
ret
NtOpenSection ENDPrustOpen KnownDlls entry for inspection
// Read-only open of \KnownDlls\kernel32.dll — useful for unhooking ntdll
// by comparing a fresh image against the loaded one.
use ntapi::ntmmapi::NtOpenSection;
use ntapi::ntobapi::OBJ_CASE_INSENSITIVE;
use winapi::shared::ntdef::{HANDLE, OBJECT_ATTRIBUTES, UNICODE_STRING};
use std::{mem, ptr::null_mut};
unsafe fn open_known_dll(name: &str) -> HANDLE {
let wide: Vec<u16> = format!("\\KnownDlls\\{}", name).encode_utf16().collect();
let mut us = UNICODE_STRING {
Length: (wide.len() * 2) as u16,
MaximumLength: (wide.len() * 2) as u16,
Buffer: wide.as_ptr() as *mut u16,
};
let mut oa: OBJECT_ATTRIBUTES = mem::zeroed();
oa.Length = mem::size_of::<OBJECT_ATTRIBUTES>() as u32;
oa.ObjectName = &mut us;
oa.Attributes = OBJ_CASE_INSENSITIVE;
let mut h: HANDLE = null_mut();
let s = NtOpenSection(&mut h, 0x0004 /* SECTION_MAP_READ */, &mut oa);
assert!(s >= 0);
h
}MITRE ATT&CK-Mappings
Last verified: 2026-05-20