Iniezione via Memoria Extra Finestra: Extra Window Memory Injection (T1055.011)
La tecnica T1055.011 - Extra Window Memory Injection sfrutta una caratteristica poco nota dell'architettura grafica di Windows per eseguire codice arbitrario all'interno dello spazio di indirizzamento di un processo legittimo. Quando un'applicazione GUI registra una classe di finestra, può richiedere fino a 40 byte di memoria extra (EWM) associati a ogni istanza. Questi byte, sufficienti a contenere un puntatore a 32 bit, sono tipicamente usati per riferire una windows procedure, ma diventano un vettore ideale per dirottare il flusso di esecuzione.
L'attacco si colloca nelle tattiche TA0004 (Privilege Escalation) e TA0005 (Defense Evasion), coprendo le fasi di Exploitation e Installation della kill chain. L'attaccante scrive il payload in una sezione di memoria condivisa, sovrascrive il puntatore nell'EWM con l'indirizzo del codice malevolo e innesca l'esecuzione inviando un messaggio alla finestra bersaglio.
Il vantaggio operativo è duplice: si evitano API pesantemente monitorate come WriteProcessMemory e CreateRemoteThread, e il codice viene eseguito nel contesto di un processo trusted (tipicamente explorer.exe), ottenendo così sia mimetizzazione sia potenziali privilegi elevati. Le varianti più sofisticate concatenano chiamate a funzioni di sistema per costruire catene ROP e aggirare DEP. Due famiglie di malware documentate — Epic e Power Loader — dimostrano che la tecnica, benché di nicchia, è pienamente operativa in scenari reali.
Per riprodurre la tecnica in laboratorio serve un target GUI stabile: explorer.exe è la scelta canonica perché espone la classe Shell_TrayWnd, esattamente quella abusata da Epic e Power Loader. L'esercizio va condotto su una VM Windows 10/11 isolata con Defender in modalità audit e Sysmon configurato con la config di SwiftOnSecurity (open source).
La catena operativa si articola in quattro fasi. Prima si localizza la finestra target con FindWindowA("Shell_TrayWnd", NULL), ottenendo l'handle HWND. Poi si alloca una sezione di memoria condivisa tramite NtCreateSection e la si mappa nel processo remoto con NtMapViewOfSection — questo è il passaggio chiave che evita WriteProcessMemory. Nella sezione mappata si scrive lo shellcode. Infine si sovrascrive il puntatore alla windows procedure con SetWindowLongPtr(hwnd, GWLP_WNDPROC, shellcode_addr) e si trigghera l'esecuzione inviando un messaggio con SendNotifyMessage o PostMessage.
Per la costruzione del PoC gli strumenti di riferimento sono:
- Visual Studio Community (gratuito) con Windows SDK per compilare in C/C++ nativo
- x64dbg (open source) per debuggare il processo target e verificare il redirect del puntatore
- API Monitor v2 di rohitab (gratuito) per tracciare le chiamate a SetWindowLong e SendNotifyMessage
- Process Hacker (open source) per ispezionare handle, sezioni e thread del processo iniettato
Un framework didattico utile è PInjector e più in generale i sample nel repository memn0ps/injectors-x64 (open source) che raccolgono varianti di process injection commentate. Per la generazione dello shellcode va bene msfvenom dal pacchetto Metasploit Framework (open source, edizione Community) con payload windows/x64/exec per un semplice calc.exe di test.
Un dettaglio spesso trascurato: se il target gira a 64 bit, il puntatore da sovrascrivere è a 64 bit e va usato SetWindowLongPtrW con offset GWLP_WNDPROC. Su architetture miste bisogna produrre un iniettore che matchi la bitness del processo target, altrimenti OpenProcess fallirà o le API restituiranno handle non validi.
Per il red team maturo, il valore dell'esercizio non è tanto il bypass di Defender — che oggi rileva molte varianti — quanto la comprensione di come DEP possa essere aggirata concatenando gadget in explorer.exe, replicando l'approccio ROP documentato per Power Loader.
Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?
Accedi alle lezioni gratuite e segui il percorso corretto fin dal primo passo