
DLL C++ che esegue l'hooking della Import Address Table analizzando le intestazioni PE e reindirizzando gli indirizzi delle funzioni importate verso un hook personalizzato all'interno di un processo target.
L'hooking è una tecnica che consente a un utente di reindirizzare il flusso di esecuzione di un programma. Il più delle volte si utilizza il function hooking. Sostituiamo o reindirizziamo una funzione con una nostra; questo è molto utile e ha molteplici casi d'uso. Esistono diversi modi di fare hooking, qui esaminiamo l'IAT Hooking, che sta per Import Address Table. Consiste nel sostituire l'indirizzo di una funzione con il nostro in una grande tabella che viene riempita a runtime. Come ho già affermato in un altro repo, ti consiglio di leggere di più sul PE Format per comprendere la parte di parsing dell'IAT di questo codice.
Ecco un diagramma di base di come funziona l'IAT Hooking. In questo esempio, la funzione originale viene chiamata dopo che il codice malevolo è stato eseguito. In questo esempio chiameremo semplicemente un'altra funzione invece di quella originale. Il vantaggio di questa tecnica è che non richiede la modifica del corpo di una funzione, al contrario di un normale hook con patch .text tramite detours che deve cambiare le istruzioni all'inizio di una funzione per inserire un jmp, ad esempio.
In realtà è molto più semplice di quanto sembri; procederemo internamente per rendere le cose più facili, il che significa che questo repo compilerà in una DLL che può essere iniettata nel processo target usando i miei injector LoadLibraryA o Manual Mapping per iniettare nel processo target.
Per prima cosa analizziamo gli PE Headers del processo target per individuare l'Import Descriptor in questo modo:
process_base + nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
Possiamo poi iterare su ciascun modulo importato, iterare su ciascuna funzione in questo modulo (motivo dei cicli annidati) e trovare l'indirizzo di quella funzione che è stato riempito a runtime. In questo esempio faremo l'hook di TranslateMessage, che viene usato da Windows per elaborare gli eventi sulle GUI. Quindi, una volta trovato l'indirizzo di quella funzione, lo sostituiamo con l'indirizzo della nostra funzione definita in precedenza e che esiste nel contesto del processo remoto, dato che siamo interni. Non dimenticare di usare VirtualProtect per assicurarti di avere il permesso di scrivere in quella posizione.
VirtualProtect(&firstThunk->u1.Function, sizeof(uint64_t), PAGE_READWRITE, &old_protection);
firstThunk->u1.Function = (uint64_t)hookfunction;
Come puoi vedere, quando notepad chiama TranslateMessage (praticamente sempre) eseguirà la nostra funzione hook che finisce per mostrare un message box!
image