NtExtendSection
Étend une section existante adossée au pagefile ou à un fichier vers une taille maximale supérieure.
Prototype
NTSTATUS NtExtendSection( HANDLE SectionHandle, PLARGE_INTEGER NewSectionSize );
Arguments
| Name | Type | Dir | Description |
|---|---|---|---|
| SectionHandle | HANDLE | in | Handle vers la section à étendre. Doit posséder l'accès SECTION_EXTEND_SIZE. |
| NewSectionSize | PLARGE_INTEGER | in/out | En entrée : nouvelle taille max souhaitée. En sortie : nouvelle taille réelle (arrondie à la page supérieure). |
IDs de syscalls par version de Windows
| Version de Windows | ID de syscall | Build |
|---|---|---|
| Win10 1507 | 0xD3 | win10-1507 |
| Win10 1607 | 0xD6 | win10-1607 |
| Win10 1703 | 0xD9 | win10-1703 |
| Win10 1709 | 0xDA | win10-1709 |
| Win10 1803 | 0xDB | win10-1803 |
| Win10 1809 | 0xDC | win10-1809 |
| Win10 1903 | 0xDD | win10-1903 |
| Win10 1909 | 0xDD | win10-1909 |
| Win10 2004 | 0xE2 | win10-2004 |
| Win10 20H2 | 0xE2 | win10-20h2 |
| Win10 21H1 | 0xE2 | win10-21h1 |
| Win10 21H2 | 0xE3 | win10-21h2 |
| Win10 22H2 | 0xE3 | win10-22h2 |
| Win11 21H2 | 0xE8 | win11-21h2 |
| Win11 22H2 | 0xE9 | win11-22h2 |
| Win11 23H2 | 0xE9 | win11-23h2 |
| Win11 24H2 | 0xEB | win11-24h2 |
| Server 2016 | 0xD6 | winserver-2016 |
| Server 2019 | 0xDC | winserver-2019 |
| Server 2022 | 0xE7 | winserver-2022 |
| Server 2025 | 0xEB | winserver-2025 |
Module noyau
APIs liées
Stub du syscall
4C 8B D1 mov r10, rcx B8 EB 00 00 00 mov eax, 0xEB ; Win11 24H2 SSN 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
Étend la taille maximale committable d'un objet section. Seules les sections créées avec `SEC_RESERVE` ou les sections adossées au pagefile (`SEC_COMMIT` sans handle de fichier) sont typiquement extensibles — les sections image (`SEC_IMAGE`) ne le sont pas. La nouvelle taille ne peut excéder la taille du fichier de backing si la section était adossée à un fichier sans `SEC_RESERVE`. Le noyau arrondit la taille demandée à la page supérieure et la réécrit via `NewSectionSize`.
Usage courant par les malwares
Utilisé par les loaders de shellcode qui construisent le payload en étapes sans committer la taille finale d'emblée. Le loader crée une petite section pagefile `SEC_RESERVE`, mappe une vue, écrit la première étape, puis appelle `NtExtendSection` une fois la taille de la seconde étape connue et remappe une vue plus grande — évitant une allocation RWX précoce de toute la taille finale. Apparaît aussi dans des canaux IPC à buffer partagé entre implants coopérants à croissance dynamique. Pas un IOC fréquent en soi, mais combiné aux sections pagefile `SEC_COMMIT` et au mapping en processus distant, il forme l'ossature des loaders mémoire-uniquement qui ne touchent jamais le disque.
Opportunités de détection
Pas d'event ETW dédié. La détection passe par la combinaison `NtCreateSection` d'une section pagefile `SEC_RESERVE` suivie de `NtExtendSection` puis `NtMapViewOfSection(Ex)` avec une protection `PAGE_EXECUTE_*` dans le même processus en peu de temps. Les EDR qui hookent `NtMapViewOfSection` peuvent signaler les mappings exécutables de sections pagefile — combinaison quasi inexistante en applications légitimes hors moteurs JIT et quelques serveurs de bases de données.
Exemples de syscalls directs
cGrow a SEC_RESERVE pagefile section
// Initial 4 KiB reserve.
LARGE_INTEGER initialSize; initialSize.QuadPart = 0x1000;
HANDLE hSection;
NtCreateSection(&hSection, SECTION_ALL_ACCESS, NULL, &initialSize,
PAGE_EXECUTE_READWRITE, SEC_RESERVE, NULL);
// ... map, write stage 1 ...
// Now grow to 1 MiB to fit stage 2 + relocations.
LARGE_INTEGER newSize; newSize.QuadPart = 0x100000;
NTSTATUS s = NtExtendSection(hSection, &newSize);
// newSize.QuadPart is updated to the actual rounded value.asmx64 direct stub (Win11 24H2)
; NtExtendSection direct stub — SSN 0xEB on Win11 24H2
NtExtendSection PROC
mov r10, rcx
mov eax, 0EBh
syscall
ret
NtExtendSection ENDPrustExtend via ntapi crate
use ntapi::ntmmapi::NtExtendSection;
use winapi::shared::ntdef::{HANDLE, LARGE_INTEGER};
use std::mem;
unsafe fn extend(section: HANDLE, new_bytes: i64) -> i64 {
let mut li: LARGE_INTEGER = mem::zeroed();
*li.QuadPart_mut() = new_bytes;
let s = NtExtendSection(section, &mut li);
assert!(s >= 0);
*li.QuadPart()
}Mappings MITRE ATT&CK
Last verified: 2026-05-20