NtMapViewOfSection
Mapea una vista de un objeto sección en el espacio de direcciones virtuales de un proceso objetivo.
Prototipo
NTSTATUS NtMapViewOfSection( HANDLE SectionHandle, HANDLE ProcessHandle, PVOID *BaseAddress, ULONG_PTR ZeroBits, SIZE_T CommitSize, PLARGE_INTEGER SectionOffset, PSIZE_T ViewSize, SECTION_INHERIT InheritDisposition, ULONG AllocationType, ULONG Win32Protect );
Argumentos
| Name | Type | Dir | Description |
|---|---|---|---|
| SectionHandle | HANDLE | in | Handle al objeto sección obtenido vía NtCreateSection o NtOpenSection. |
| ProcessHandle | HANDLE | in | Handle al proceso objetivo; la vista de la sección se mapeará en su espacio VA. |
| BaseAddress | PVOID* | in/out | Dirección base deseada (NULL deja que el kernel elija). Actualizada con la dirección mapeada al retornar. |
| ZeroBits | ULONG_PTR | in | Número de bits altos en cero en BaseAddress. Típicamente 0. |
| CommitSize | SIZE_T | in | Tamaño inicialmente confirmado para sección respaldada por pagefile. Ignorado en secciones imagen. |
| SectionOffset | PLARGE_INTEGER | in/out | Desplazamiento en la sección donde inicia la vista. Debe alinearse a 64 KB. NULL equivale a 0. |
| ViewSize | PSIZE_T | in/out | Puntero al tamaño de vista solicitado. 0 mapea desde el offset hasta el final de la sección. |
| InheritDisposition | SECTION_INHERIT | in | ViewShare (1) se comparte con los hijos, ViewUnmap (2) no. ViewUnmap es la elección común. |
| AllocationType | ULONG | in | Banderas de asignación como MEM_RESERVE, MEM_TOP_DOWN, MEM_LARGE_PAGES. A menudo 0. |
| Win32Protect | ULONG | in | Protección de página a aplicar a la vista, p. ej. PAGE_READWRITE, PAGE_EXECUTE_READ. |
IDs de syscalls por versión de Windows
| Versión de Windows | ID de syscall | Build |
|---|---|---|
| Win10 1507 | 0x28 | win10-1507 |
| Win10 1607 | 0x28 | win10-1607 |
| Win10 1703 | 0x28 | win10-1703 |
| Win10 1709 | 0x28 | win10-1709 |
| Win10 1803 | 0x28 | win10-1803 |
| Win10 1809 | 0x28 | win10-1809 |
| Win10 1903 | 0x28 | win10-1903 |
| Win10 1909 | 0x28 | win10-1909 |
| Win10 2004 | 0x28 | win10-2004 |
| Win10 20H2 | 0x28 | win10-20h2 |
| Win10 21H1 | 0x28 | win10-21h1 |
| Win10 21H2 | 0x28 | win10-21h2 |
| Win10 22H2 | 0x28 | win10-22h2 |
| Win11 21H2 | 0x28 | win11-21h2 |
| Win11 22H2 | 0x28 | win11-22h2 |
| Win11 23H2 | 0x28 | win11-23h2 |
| Win11 24H2 | 0x28 | win11-24h2 |
| Server 2016 | 0x28 | winserver-2016 |
| Server 2019 | 0x28 | winserver-2019 |
| Server 2022 | 0x28 | winserver-2022 |
| Server 2025 | 0x28 | winserver-2025 |
Módulo del kernel
APIs relacionadas
Stub del syscall
4C 8B D1 mov r10, rcx B8 28 00 00 00 mov eax, 0x28 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
`NtMapViewOfSection` es el punto de entrada userland de la familia `MiMapViewOfSection` del kernel. La SSN `0x28` ha sido estable en todos los builds Win10/11 lanzados. La memoria respaldada por sección es fundamentalmente distinta de `NtAllocateVirtualMemory`: las vistas se respaldan en un objeto `_SECTION` (archivo o pagefile), comparten páginas físicas entre procesos y aparecen en las VAD con los flags `SubsectionBased`/`MappedFile` en vez de `Private`. Esta naturaleza dual — mismos bytes visibles en dos espacios — es lo que la hace irresistible para inyección.
Uso común por malware
Fundamento de la inyección basada en secciones (inyección estilo `MapViewOfSection`, Process Doppelgänging, Process Ghosting, Transacted Hollowing, variantes Atom Bombing). Se crea una sección respaldada por pagefile vía `NtCreateSection`, se mapea localmente en RW, se copia el shellcode, y se vuelve a mapear la misma sección en el proceso remoto en RX. Los bytes aparecen ejecutables en el objetivo sin ningún `WriteProcessMemory` explícito. Usado por loaders de FIN7/Carbanak, BumbleBee, el Process Doppelgänging original de enSilo y varios loaders RAT. También es la columna vertebral del side-loading vía envenenamiento de `KnownDlls`.
Oportunidades de detección
La inyección por sección elude deliberadamente la telemetría de `NtWriteVirtualMemory` y `NtAllocateVirtualMemory` que vigilan los EDR. Sin embargo, Sysmon Event ID 7 (`Image Load`) y Event ID 8 (`CreateRemoteThread`) siguen disparándose sobre las consecuencias. ETW Threat Intelligence emite `EtwTiLogMapExecVm` siempre que se mapea una vista ejecutable en un proceso remoto — esa es la señal dedicada. El análisis VAD vía PE-Sieve marca regiones `MappedImage` cuyo archivo de respaldo ha sido eliminado (Process Ghosting) o cuyo nombre de sección no coincide con una KnownDll legítima. `ObRegisterCallbacks` sobre `*PsProcessType` permite a los drivers quitar derechos del handle de sección antes de poder mapearlo entre procesos.
Ejemplos de syscalls directos
asmx64 direct stub
; Direct syscall stub for NtMapViewOfSection (SSN 0x28, stable across all Win10/11)
NtMapViewOfSection PROC
mov r10, rcx ; syscall convention
mov eax, 28h ; SSN
syscall
ret
NtMapViewOfSection ENDPcPagefile-backed cross-process map
// Section injection: same physical pages mapped RW locally, RX in target.
HANDLE hSection = NULL;
LARGE_INTEGER max_size = { .QuadPart = 0x10000 };
NtCreateSection(&hSection, SECTION_ALL_ACCESS, NULL, &max_size,
PAGE_EXECUTE_READWRITE, SEC_COMMIT, NULL);
PVOID local_view = NULL;
SIZE_T view_size = 0;
NtMapViewOfSection(hSection, NtCurrentProcess(), &local_view, 0, 0, NULL,
&view_size, ViewUnmap, 0, PAGE_READWRITE);
memcpy(local_view, payload, payload_len);
PVOID remote_view = NULL;
view_size = 0;
NtMapViewOfSection(hSection, hRemote, &remote_view, 0, 0, NULL,
&view_size, ViewUnmap, 0, PAGE_EXECUTE_READ);cHell's Gate dynamic lookup
// SSN 0x28 across every supported build, but still better to resolve dynamically.
DWORD ssn = GetSyscallNumber(GetProcAddress(GetModuleHandleA("ntdll.dll"),
"NtMapViewOfSection"));
set_ssn(ssn);
indirect_syscall_invoke(/* hSection, hRemote, &remote_view, ... */);Mapeos MITRE ATT&CK
Last verified: 2026-05-20