Vectored Overloading PE Injection
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Pregled tehnike
Vectored Overloading je Windows PE injection primitive koja spaja klasični Module Overloading sa Vectored Exception Handlers (VEHs) i hardware breakpoints. Umesto da patchuje LoadLibrary ili napiše sopstveni loader, napadač:
- Kreira
SEC_IMAGEsekciju koja je vezana za legitimni DLL (npr.wmp.dll). - Prepisuje mapirani view sa potpuno relociranim malicioznim PE-om, ali ostavlja objekat sekcije da pokazuje na benigni fajl na disku.
- Registruje VEH i programira debug registre tako da svaki poziv
NtOpenSection,NtMapViewOfSection, i opcionoNtClosepodiže user-mode breakpoint. - Poziva
LoadLibrary("amsi.dll")(ili bilo koji drugi benigni target). Kada Windows loader pozove pomenute syscall-ove, VEH preskače kernel transition i vraća handle-ove i base adrese pripremljenog malicioznog imag-a.
Pošto loader i dalje veruje da je mapirao traženi DLL, alati koji gledaju samo backing fajlove sekcija vide wmp.dll iako memorija sada sadrži payload napadača. U međuvremenu, imports/TLS callbacks i dalje rešava pravi loader, značajno smanjujući količinu custom PE-parsing logike koju napadač mora da održava.
Stage 1 – Build the disguised 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);
- Copy the malicious PE into that view section by section, honouring
SizeOfRawData/VirtualSizeand updating protections afterwards (PAGE_EXECUTE_READ,PAGE_READWRITE, etc.). - Apply relocations and resolve imports exactly as a reflective loader would. Because the view is already mapped as
SEC_IMAGE, section alignments and guard pages match what the Windows loader expects later. - Normalize the PE header:
- If the payload is an EXE, set
IMAGE_FILE_HEADER.Characteristics |= IMAGE_FILE_DLLand zero the entry point to keepLdrpCallTlsInitializersfrom jumping into EXE-specific stubs. - DLL payloads can keep their headers unchanged.
U ovom trenutku proces poseduje RWX-sposoban view čiji je backing object i dalje wmp.dll, dok su bajtovi u memoriji pod kontrolom napadača.
Stage 2 – Hijack the loader with VEHs
- Register a VEH and arm hardware breakpoints: programirajte
Dr0(ili neki drugi debug register) sa adresomntdll!NtOpenSectioni podesiteDR7tako da svaka izvršavanja podižeSTATUS_SINGLE_STEP. Ponovite kasnije zaNtMapViewOfSectioni opcionoNtClose. - Trigger DLL loading with
LoadLibrary("amsi.dll").LdrLoadDllće na kraju pozvatiNtOpenSectionda dobije realan section handle. - VEH hook for
NtOpenSection:
- Pronađite stack slot za
[out] PHANDLE SectionHandleargument. - Upisujete prethodno kreirani
DecoySectionhandle u taj slot. - Pomaknite
RIP/EIPnaretinstrukciju tako da kernel nikada nije pozvan. - Ponovo naoružajte hardware breakpoint da prati
NtMapViewOfSectionsledeće.
- VEH hook for
NtMapViewOfSection:
- Prepišite
[out] PVOID *BaseAddress(i izlaze za size/protection) adresom već mapiranog malicioznog view-a. - Preskočite telo syscall-a kao i ranije.
- (Optional) VEH hook for
NtCloseproverava da je fake section handle oslobođen, sprečavajući resource leaks i pružajući završnu proveru ispravnosti.
Pošto se syscall-ovi nikada ne izvršavaju, kernel callback-i (ETWti, minifilter, itd.) ne primete sumnjive NtOpenSection/NtMapViewOfSection događaje, što drastično snižava telemetry. Iz perspektive loader-a, sve je uspelo i amsi.dll je u memoriji, pa nastavlja sa rešavanjem import-ova/TLS protiv bajtova napadača.
Stage 3 – Execute the payload
- EXE payload: Injector jednostavno skače na originalni entry point kada su relocations završene. Kada loader misli da bi pozvao
DllMain, umesto toga se izvršava custom kod koji ponaša kao EXE-style entry. - DLL payload / Node.js addon: Resolve-ujte i pozovite željeni export (Kidkadi izlaže imenovanu funkciju za JavaScript). Pošto je modul već registrovan u
LdrpModuleBaseAddressIndex, naredna pretraživanja ga vide kao benigni DLL.
Kada se kombinuje sa Node.js native addon-om (.node fajl), sva težina Windows-internals poslova ostaje van JavaScript sloja, pomažući threat actor-u da isporuči isti loader sa mnogim različitim obfuskovanim Node wrapper-ima.
References
- Check Point Research – GachiLoader: Defeating Node.js Malware with API Tracing
- VectoredOverloading – PoC implementation
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.


