Vectored Overloading PE Injection
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.
Teknik genel bakışı
Vectored Overloading, klasik Module Overloading ile Vectored Exception Handlers (VEHs) ve hardware breakpointsi birleştiren bir Windows PE injection primitive’ıdır. LoadLibrary’yi patchlemek veya kendi loader’ını yazmak yerine, saldırgan:
- Meşru bir DLL (ör.
wmp.dll) tarafından desteklenen birSEC_IMAGEsection oluşturur. - Maplenmiş view’u tamamen relocate edilmiş kötü amaçlı PE ile üzerine yazar, fakat section objesini diskteki iyi niyetli görüntüye işaret etmeye devam ettirir.
- Bir VEH kaydeder ve debug register’ları programlayarak her
NtOpenSection,NtMapViewOfSectionve isteğe bağlı olarakNtCloseçağrısında bir user-mode breakpoint tetiklenmesini sağlar. LoadLibrary("amsi.dll")(veya başka herhangi bir hedef) çağrısı yapılır. Windows loader ilgili syscall’ları çağırdığında, VEH kernel transition’ını atlar ve hazırlanan kötü amaçlı imajın handle’larını ve base adreslerini döndürür.
Loader hâlâ istenen DLL’i maplediğini düşündüğü için, sadece section backing dosyasına bakan araçlar wmp.dll görürken bellek artık saldırganın payload’unu barındırır. Bu arada imports/TLS callback’leri gerçek loader tarafından hâlâ çözülür; böylece saldırganın sürdürmesi gereken özel PE-parsing mantığı önemli ölçüde azalır.
Aşama 1 – Kılık değiştirilmiş section oluşturma
- Decoy DLL için bir section oluşturun ve map edin
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);
- Kötü amaçlı PE’yi o view’a kopyalayın section by section,
SizeOfRawData/VirtualSize’a uyarak ve sonrasında korumaları (PAGE_EXECUTE_READ,PAGE_READWRITE, vb.) güncelleyerek. - Relokasyonları uygulayın ve import’ları çözün tam olarak bir reflective loader’ın yapacağı gibi. View zaten
SEC_IMAGEolarak maplendiği için section hizalamaları ve guard page’ler Windows loader’ın daha sonra beklediği ile eşleşir. - PE header’ını normalize edin:
- Eğer payload bir EXE ise,
IMAGE_FILE_HEADER.Characteristics |= IMAGE_FILE_DLLyapın veEntryPointi sıfırlayın kiLdrpCallTlsInitializersEXE-özgü stub’lara atlamasın. - DLL payload’ları header’larını olduğu gibi bırakabilir.
Bu noktada process, backing objesi hâlâ wmp.dll olan ancak bellekteki byte’ları saldırganın kontrolünde olan RWX-capable bir view’a sahiptir.
Aşama 2 – Loader’ı VEH ile ele geçirme
- Bir VEH kaydedin ve hardware breakpoint’leri kurun:
Dr0(veya başka bir debug register) içinentdll!NtOpenSectionadresini yazın ve her yürütmedeSTATUS_SINGLE_STEPtetiklenecek şekildeDR7’yi ayarlayın. Daha sonraNtMapViewOfSectionve isteğe bağlı olarakNtCloseiçin de tekrarlayın. LoadLibrary("amsi.dll")ile DLL yüklemeyi tetikleyin.LdrLoadDlleninde sonunda gerçek section handle’ını almak içinNtOpenSection’ı çağıracaktır.- NtOpenSection için VEH hook’u:
[out] PHANDLE SectionHandleargümanı için stack slot’unu bulun.- O slota önceden oluşturulmuş
DecoySectionhandle’ını yazın. - Kernel’in asla çağrılmaması için
RIP/EIP’yiretinstruction’ına ilerletin. - Donanım breakpoint’ini bir sonraki hedef olan
NtMapViewOfSection’u izleyecek şekilde yeniden ayarlayın.
- NtMapViewOfSection için VEH hook’u:
[out] PVOID *BaseAddress(ve size/protection çıktıları) üzerine zaten maplenmiş kötü amaçlı view’ın adresini yazın.- Syscall body’ini öncekinde olduğu gibi atlayın.
- (İsteğe bağlı) NtClose için VEH hook’u fake section handle’ının temizlendiğini doğrular, resource leak’leri önler ve son bir sanity check sağlar.
Syscall’lar hiç çalıştırılmadığı için kernel callback’leri (ETWti, minifilter, vb.) şüpheli NtOpenSection/NtMapViewOfSection olaylarını gözlemlemez, böylece telemetry ciddi şekilde düşer. Loader açısından her şey başarılı olmuş gibi görünür ve amsi.dll bellektedir; bu yüzden loader, import/TLS çözümlemeyi saldırganın byte’ları üzerinde sürdürür.
Aşama 3 – Payload’u çalıştırma
- EXE payload: Injector, relocasyonlar tamamlandığında basitçe orijinal entry point’e atlar. Loader
DllMainçağıracağını sandığında, özel kod EXE tarzı entry’yi yürütür. - DLL payload / Node.js addon: İstenilen export’ı çözümleyip çağırın (Kidkadi JavaScript’e isimlendirilmiş bir fonksiyon sunar). Modül zaten
LdrpModuleBaseAddressIndexile kayıtlı olduğundan, sonraki aramalar onu iyi niyetli DLL olarak görür.
Bir Node.js native addon (.node dosyası) ile birleştirildiğinde, Windows-internal’larının ağır işleri JavaScript katmanının dışında kalır; bu da tehdit aktörünün aynı loader’ı pek çok farklı obfusk edilmiş Node wrapper ile göndermesine yardımcı olur.
Kaynaklar
- Check Point Research – GachiLoader: Defeating Node.js Malware with API Tracing
- VectoredOverloading – PoC implementation
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Azure Hacking’i öğrenin ve pratik yapın:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- abonelik planlarını kontrol edin!
- 💬 Discord grubuna veya telegram grubuna katılın ya da Twitter’da bizi takip edin 🐦 @hacktricks_live.**
- Hacking ipuçlarını paylaşmak için HackTricks ve HackTricks Cloud github reposuna PR gönderin.


