Vectored Overloading PE Injection
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Tip
Soek jy Windows 11 LFH heap shaping en VMware Workstation PVSCSI (vmware-vmx) escape techniques?
{{#ref}} vmware-workstation-pvscsi-lfh-escape.md {{#endref}}
Oorsig van die tegniek
Vectored Overloading is a Windows PE injection primitive wat die klassieke Module Overloading met Vectored Exception Handlers (VEHs) en hardware breakpoints saamvoeg. In plaas daarvan om LoadLibrary te patch of sy eie loader te skryf, doen die aanvaller:
- Skep ’n
SEC_IMAGEsection wat gesteun word deur ’n egte DLL (bv.wmp.dll). - Oorskryf die gemapte view met ’n volledig gerelokeerde kwaadwillige PE, maar laat die section object steeds na die benigne image op skyf wys.
- Registreer ’n VEH en programmeer debug registers sodat elke oproep na
NtOpenSection,NtMapViewOfSection, en opsioneelNtClose’n user-mode breakpoint veroorsaak. - Roep
LoadLibrary("amsi.dll")(of enige ander benigne teiken). Wanneer die Windows loader daardie syscalls aanroep, sla die VEH die kernoorgang oor en keer die handvatsels en basisadresse van die voorbereide kwaadwillige image terug.
Omdat die loader steeds dink dit het die versoekte DLL gemap, sien gereedskap wat net na section backing files kyk wmp.dll al bevat geheue nou die aanvaller se payload. Intussen word imports/TLS callbacks steeds deur die werklike loader opgelos, wat die hoeveelheid pasgemaakte PE-parsing logika wat die aanvaller moet bestuur aansienlik verminder.
Fase 1 – Bou die vermomde section
- Create and map a section for the decoy DLL
NtCreateSection(&DecoySection, SECTION_ALL_ACCESS, NULL,
0, PAGE_READWRITE, SEC_IMAGE, L"\??\C:\\Windows\\System32\\wmp.dll");
NtMapViewOfSection(DecoySection, GetCurrentProcess(), &DecoyView, 0, 0,
NULL, &DecoySize, ViewShare, 0, PAGE_READWRITE);
- Kopieer die kwaadwillige PE na daardie view section vir section, hou rekening met
SizeOfRawData/VirtualSizeen werk beskermings daarna op (PAGE_EXECUTE_READ,PAGE_READWRITE, ens.). - Pas relocations toe en los imports op presies soos ’n reflective loader sou doen. Omdat die view reeds as
SEC_IMAGEgemap is, stem section alignments en guard pages oor met wat die Windows loader later verwag. - Normaliseer die PE-header:
- As die payload ’n EXE is, stel
IMAGE_FILE_HEADER.Characteristics |= IMAGE_FILE_DLLen nul die entry point om te voorkom datLdrpCallTlsInitializersin EXE-spesifieke stubs spring. - DLL payloads kan hul headers ongemoeid laat.
Op hierdie stadium het die proses ’n RWX-geskikte view wat se backing object steeds wmp.dll is, maar die bytes in geheue is onder die aanvaller se beheer.
Fase 2 – Kaap die loader met VEHs
- Registreer ’n VEH en aktiveer hardware breakpoints: programmeer
Dr0(of ’n ander debug register) met die adres vanntdll!NtOpenSectionen stelDR7sodat elke uitvoeringSTATUS_SINGLE_STEPveroorsaak. Herhaal later virNtMapViewOfSectionen opsioneelNtClose. - Trigger DLL loading met
LoadLibrary("amsi.dll").LdrLoadDllsal uiteindelikNtOpenSectionaanroep om die regte section handle te verkry. - VEH hook vir
NtOpenSection:
- Lokalisereer die stack slot vir die
[out] PHANDLE SectionHandleargument. - Skryf die vooraf geskepte
DecoySectionhandle in daardie slot. - Beweeg
RIP/EIPna dieretinstruksie sodat die kernel nooit aangeroep word nie. - Her-aktiveer die hardware breakpoint om na
NtMapViewOfSectionte kyk volgende.
- VEH hook vir
NtMapViewOfSection:
- Oorskryf die
[out] PVOID *BaseAddress(en grootte/beskerming outputs) met die adres van die reeds gemapte kwaadwillige view. - Sla die syscall-lichaam oor net soos voorheen.
- (Opsioneel) VEH hook vir
NtCloseverifieer dat die vals section handle skoongemaak word, wat resource leaks voorkom en ’n finale sanity check bied.
Omdat die syscalls nooit uitgevoer word nie, sien kern callbacks (ETWti, minifilter, ens.) nie die verdagte NtOpenSection/NtMapViewOfSection gebeure nie, wat telemetry drasties verlaag. Vanuit die loader se perspektief het alles geslaag en amsi.dll is in geheue, so dit gaan voort met import/TLS resolusie teen die aanvaller se bytes.
Fase 3 – Voer die payload uit
- EXE payload: Die injector spring eenvoudig na die oorspronklike entry point sodra relocations voltooi is. Wanneer die loader dink dit sou
DllMainaanroep, voer die pasgemaakte kode in plaas daarvan die EXE-styl entry uit. - DLL payload / Node.js addon: Los op en roep die bedoelde export (Kidkadi verskaf ’n benoemde funksie aan JavaScript). Omdat die module reeds by
LdrpModuleBaseAddressIndexgeregistreer is, sien opvolg-opslae dit as die benigne DLL.
Wanneer dit saam met ’n Node.js native addon (.node file) gebruik word, bly al die Windows-internals swaar werk buite die JavaScript-laag, wat die dreigenaakter toelaat om dieselfde loader met baie verskillende obfusceerde Node wrappers te gebruik.
References
- Check Point Research – GachiLoader: Defeating Node.js Malware with API Tracing
- VectoredOverloading – PoC implementation
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.


