> Windows Syscalls
ntoskrnl.exeT1574.001T1106

NtOpenSection

Ouvre un handle vers un objet section nommé existant (mémoire partagée ou mapping d'image).

Prototype

NTSTATUS NtOpenSection(
  PHANDLE            SectionHandle,
  ACCESS_MASK        DesiredAccess,
  POBJECT_ATTRIBUTES ObjectAttributes
);

Arguments

NameTypeDirDescription
SectionHandlePHANDLEoutReçoit le handle vers la section ouverte.
DesiredAccessACCESS_MASKinDroits d'accès (SECTION_MAP_READ, SECTION_MAP_WRITE, SECTION_MAP_EXECUTE, SECTION_QUERY, …).
ObjectAttributesPOBJECT_ATTRIBUTESinAttributs d'objet nommant la section (ex. \BaseNamedObjects\MaSection).

IDs de syscalls par version de Windows

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

Module noyau

ntoskrnl.exeNtOpenSection

APIs liées

OpenFileMappingWNtCreateSectionNtMapViewOfSectionNtMapViewOfSectionExNtUnmapViewOfSectionNtQuerySection

Stub du syscall

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

Notes non documentées

Retourne un handle vers un objet section pré-existant résolu via le namespace de l'object manager NT — typiquement `\BaseNamedObjects\<nom>` pour les appelants Win32 ou `\KnownDlls\<dll>` pour les sections d'image chargées par l'OS. Le SSN est resté constant à `0x37` de Windows 10 1507 jusqu'à Windows 11 24H2, en faisant un candidat fiable pour les syscalls directs codés en dur. `OpenFileMapping` est le wrapper Win32 mince qui construit le nom `\Sessions\<id>\BaseNamedObjects\<nom>` et invoque ce syscall.

Usage courant par les malwares

Deux patterns d'abus distincts. (1) **Prérequis du poisoning de KnownDlls** : les implants ouvrent `\KnownDlls\<cible>.dll` avec `SECTION_MAP_WRITE` (généralement faisable seulement en haute intégrité ou si la section a été remplacée auparavant) et écrasent les octets exécutables d'une DLL système toujours mappée image-cow dans chaque processus — une primitive write-once / infect-all classique des recherches initiales sur le hijack KnownDlls. (2) **Abus d'IPC de service privilégié** : certains services Windows exposent des sections nommées dans `\BaseNamedObjects\` pour l'IPC légitime ; les outils offensifs ouvrent ces sections pour espionner le protocole ou faire passer des données à travers les frontières d'intégrité. La stabilité parfaite du SSN fait de `NtOpenSection` un syscall direct codé en dur populaire dans les loaders red-team.

Opportunités de détection

Sysmon Event 7 (ImageLoad) et Event 10 (ProcessAccess) ne couvrent pas directement les ouvertures de section. L'event ETW `Microsoft-Windows-Kernel-General` ID 6 (ImageLoad) se déclenche au mapping subséquent. Pour une détection fiable, les callbacks kernel sur `ObRegisterCallbacks` pour `*PsSectionType` peuvent auditer les ouvertures de handle, et les éditeurs EDR hookent de plus en plus `NtOpenSection` pour signaler les ouvertures de `\KnownDlls\*` en accès écriture. Côté userland, `NtQuerySystemInformation(SystemHandleInformation)` énumère tous les handles de section actuellement détenus — un snapshot périodique révèle les handles de section inter-processus inhabituels.

Exemples de syscalls directs

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 ENDP

rustOpen 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
}

Mappings MITRE ATT&CK

Last verified: 2026-05-20