NtExtendSection
Vergrößert eine vorhandene, durch Pagefile oder Datei gestützte Section auf eine höhere Maximalgröße.
Prototyp
NTSTATUS NtExtendSection( HANDLE SectionHandle, PLARGE_INTEGER NewSectionSize );
Argumente
| Name | Type | Dir | Description |
|---|---|---|---|
| SectionHandle | HANDLE | in | Handle auf die zu erweiternde Section. Erfordert SECTION_EXTEND_SIZE-Zugriff. |
| NewSectionSize | PLARGE_INTEGER | in/out | Eingabe: gewünschte neue Maximalgröße. Ausgabe: tatsächliche neue Größe (auf Seitengrenze aufgerundet). |
Syscall-IDs pro Windows-Version
| Windows-Version | Syscall-ID | 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 |
Kernel-Modul
Verwandte APIs
Syscall-Stub
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
Undokumentierte Hinweise
Erweitert die maximale committbare Größe eines Section-Objekts. Erweiterbar sind typischerweise nur Sections, die mit `SEC_RESERVE` erzeugt wurden, oder pagefile-gestützte Sections (`SEC_COMMIT` ohne Datei-Handle) — Image-Sections (`SEC_IMAGE`) sind es nicht. Bei einer dateigestützten Section ohne `SEC_RESERVE` darf die neue Größe die Größe der Backing-Datei nicht überschreiten. Der Kernel rundet die angeforderte Größe auf die nächste Seitengrenze auf und schreibt sie über `NewSectionSize` zurück.
Häufige Malware-Nutzung
Genutzt von Shellcode-Loadern, die das Payload schrittweise aufbauen, ohne die Endgröße vorab zu committen. Der Loader erzeugt eine kleine pagefile-gestützte `SEC_RESERVE`-Section, mappt eine View, schreibt die erste Stufe und ruft anschließend `NtExtendSection` auf, sobald die Größe der zweiten Stufe bekannt ist, um danach eine größere View neu zu mappen — so wird eine frühe RWX-Allokation in voller Endgröße vermieden. Erscheint auch in Shared-Buffer-IPC-Kanälen zwischen kooperierenden Implants, die dynamisch wachsen. Für sich genommen kein häufiger IOC, kombiniert mit `SEC_COMMIT`-Pagefile-Sections und Remote-Process-Mapping bildet es aber das Rückgrat speicherbasierter Loader, die niemals die Platte berühren.
Erkennungsmöglichkeiten
Kein dediziertes ETW-Event. Erkennung über die Kombination `NtCreateSection` einer `SEC_RESERVE`-Pagefile-Section, gefolgt von `NtExtendSection`, gefolgt von `NtMapViewOfSection(Ex)` mit `PAGE_EXECUTE_*`-Schutz im selben Prozess innerhalb kurzer Zeit. EDRs, die `NtMapViewOfSection` hooken, können ausführbare Mappings pagefile-gestützter Sections markieren — eine Kombination, die außerhalb von JIT-Engines und einigen Datenbankservern praktisch nicht in legitimen Anwendungen vorkommt.
Direkte Syscall-Beispiele
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()
}MITRE ATT&CK-Mappings
Last verified: 2026-05-20