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

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:

  1. Kreira SEC_IMAGE section koji je povezan sa legitimnim DLL-om (npr. wmp.dll).
  2. Prepiše mapped view kompletno relociranim malicioznim PE-om, ali ostavi section objekat da pokazuje na benignu sliku na disku.
  3. Registruje VEH i programira debug registre tako da svaki poziv NtOpenSection, NtMapViewOfSection, i opciono NtClose podiže user-mode breakpoint.
  4. 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

  1. 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);
  1. Kopirajte maliciozni PE u taj view sekcija po sekcija, poštujući SizeOfRawData/VirtualSize i naknadno ažurirajte zaštite (PAGE_EXECUTE_READ, PAGE_READWRITE, itd.).
  2. 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.
  3. Normalizujte PE header:
  • Ako je payload EXE, postavite IMAGE_FILE_HEADER.Characteristics |= IMAGE_FILE_DLL i nultirajte entry point da biste sprečili LdrpCallTlsInitializers da 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

  1. Registrujte VEH i naoružajte hardware breakpointe: programirajte Dr0 (ili neki drugi debug registar) sa adresom ntdll!NtOpenSection i postavite DR7 tako da svako izvršenje podiže STATUS_SINGLE_STEP. Ponovite kasnije za NtMapViewOfSection i opciono NtClose.
  2. Trigger-ujte učitavanje DLL-a sa LoadLibrary("amsi.dll"). LdrLoadDll će na kraju pozvati NtOpenSection da dobije stvarni section handle.
  3. VEH hook za NtOpenSection:
  • Pronađite slot na stacku za [out] PHANDLE SectionHandle argument.
  • Upisite prethodno kreirani DecoySection handle u taj slot.
  • Pomaknite RIP/EIP na ret instrukciju tako da kernel nikada nije pozvan.
  • Ponovo naoružajte hardware breakpoint da prati NtMapViewOfSection sledeće.
  1. 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.
  1. (Opcionalno) VEH hook za NtClose proverava 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_REGISTERS na trenutnoj niti pre poziva LoadLibrary, tako da VEH mora da se izvrši na istoj niti koja pokreće loader.
  • Emulacija syscall-a: VEH postavlja RAX = 0 i pomera RIP do ret unutar ntdll stuba (skenira za 0xC3) tako da kernel tranzicija nikada ne nastupi, zatim nastavlja sa NtContinue.
  • Output parametri: za NtMapViewOfSection, VEH prepisuje vraćene BaseAddress, ViewSize i Win32Protect outpute 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

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