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.
Tip
Tražite tehnike za Windows 11 LFH heap shaping i VMware Workstation PVSCSI (vmware-vmx) escape?
{{#ref}} vmware-workstation-pvscsi-lfh-escape.md {{#endref}}
Pregled tehnike
Vectored Overloading je Windows PE injection primitive koji spaja klasični Module Overloading sa Vectored Exception Handlers (VEHs) i hardware breakpoints. Umesto da patch-uje LoadLibrary ili piše sopstveni loader, protivnik:
- Kreira
SEC_IMAGEsection koji je povezan sa legitimnim DLL-om (npr.wmp.dll). - Prepiše mapped view kompletno relociranim malicioznim PE-om, ali ostavi section objekat da pokazuje na benignu sliku 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 te syscale, VEH preskače kernel tranziciju i vraća handle-ove i base adrese pripremljene maliciozne slike.
Pošto loader i dalje veruje da je mapirao traženi DLL, alati koji gledaju samo backing file sekcija vide wmp.dll iako memorija sada sadrži payload napadača. U međuvremenu, imports/TLS callbacks se i dalje rešavaju od strane genuine loader-a, što značajno smanjuje količinu sopstvene PE-parsing logike koju napadač mora održavati.
Faza 1 – Kreiranje maskiranog section-a
- Kreirajte i mapirajte section za 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);
- Kopirajte maliciozni PE u taj view sekcija po sekcija, poštujući
SizeOfRawData/VirtualSizei naknadno ažurirajte zaštite (PAGE_EXECUTE_READ,PAGE_READWRITE, itd.). - Primijenite relocacije i rešite imports tačno kao što bi to uradio reflective loader. Pošto je view već mapiran kao
SEC_IMAGE, poravnanja sekcija i guard stranice se poklapaju sa očekivanjima Windows loader-a. - Normalizujte PE header:
- Ako je payload EXE, postavite
IMAGE_FILE_HEADER.Characteristics |= IMAGE_FILE_DLLi nultirajte entry point da biste sprečiliLdrpCallTlsInitializersda skoči u EXE-specifične stubove. - DLL payload-ovi mogu zadržati headers nepromenjene.
U ovom trenutku proces poseduje view sposoban za RWX čiju backing object i dalje pokazuje na wmp.dll, ali bajtovi u memoriji su pod kontrolom napadača.
Faza 2 – Preuzimanje loader-a pomoću VEH-ova
- Registrujte VEH i naoružajte hardware breakpointe: programirajte
Dr0(ili neki drugi debug registar) sa adresomntdll!NtOpenSectioni postaviteDR7tako da svako izvršenje podižeSTATUS_SINGLE_STEP. Ponovite kasnije zaNtMapViewOfSectioni opcionoNtClose. - Trigger-ujte učitavanje DLL-a sa
LoadLibrary("amsi.dll").LdrLoadDllće na kraju pozvatiNtOpenSectionda dobije stvarni section handle. - VEH hook za
NtOpenSection:
- Pronađite slot na stacku za
[out] PHANDLE SectionHandleargument. - Upisite 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 za
NtMapViewOfSection:
- Prepišite
[out] PVOID *BaseAddress(i outpute veličine/zaštite) adresom već mapiranog malicioznog view-a. - Preskočite telo syscala isto kao i ranije.
- (Opcionalno) VEH hook za
NtCloseproverava da je lažni section handle očišćen, sprečavajući curenje resursa i pružajući završnu proveru ispravnosti.
Pošto se syscali nikada ne izvršavaju, kernel callbacks (ETWti, minifilter, itd.) ne beleže sumnjive NtOpenSection/NtMapViewOfSection događaje, što drastično smanjuje telemetriju. Iz loader-ove perspektive, sve je uspelo i amsi.dll je u memoriji, pa loader nastavlja sa rešavanjem imports/TLS koristeći view napadača.
Napomene o PoC implementaciji (2025)
Javni PoC pokazuje nekoliko praktičnih detalja koje je lako propustiti prilikom re-implementacije tehnike:
- HWBPs su po niti. PoC postavlja
CONTEXT_DEBUG_REGISTERSna trenutnoj niti pre pozivaLoadLibrary, tako da VEH mora da se izvrši na istoj niti koja pokreće loader. - Emulacija syscall-a: VEH postavlja
RAX = 0i pomeraRIPdoretunutarntdllstuba (skenira za0xC3) tako da kernel tranzicija nikada ne nastupi, zatim nastavlja saNtContinue. - Output parametri: za
NtMapViewOfSection, VEH prepisuje vraćeneBaseAddress,ViewSizeiWin32Protectoutpute tako da loader veruje da je mapiranje uspelo i nastavlja sa imports/TLS koristeći attacker-ov view.
Minimalni HWBP setup koji PoC koristi (x64):
CONTEXT ctx = {0};
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
GetThreadContext(GetCurrentThread(), &ctx);
ctx.Dr0 = (DWORD64)NtOpenSection;
ctx.Dr7 = 1;
SetThreadContext(GetCurrentThread(), &ctx);
AddVectoredExceptionHandler(1, VehHandler);
Stealth varijacija
Nedavna VEH istraživanja ističu da se handleri mogu registrovati ručnom manipulacijom VEH liste umesto poziva AddVectoredExceptionHandler, što smanjuje oslanjanje na user-mode APIs koji mogu biti nadgledani ili hookovani. Ovo nije neophodno za Vectored Overloading, ali se može kombinovati sa njim da bi se smanjila uočljiva API aktivnost.
Faza 3 – Izvrši payload
- EXE payload: Injector jednostavno skače na originalni entry point kada relocations budu završene. Kada loader smatra da bi pozvao
DllMain, custom code umesto toga izvršava EXE-style entry. - DLL payload / Node.js addon: Razreši i pozovi namenjeni export (Kidkadi exposes a named function to JavaScript). Pošto je module već registrovan u
LdrpModuleBaseAddressIndex, naknadne pretrage ga vide kao benign DLL.
Kada se kombinuje sa Node.js native addon (.node file), sve Windows-internals teške operacije ostaju van JavaScript sloja, što pomaže threat actor-u da isporuči isti loader uz mnoge različite obfuscated Node wrapper-e.
References
- Check Point Research – GachiLoader: Defeating Node.js Malware with API Tracing
- VectoredOverloading – PoC implementation
- IBM X-Force – You just got vectored: Using VEH for defense evasion and process 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.


