
DLL C++ qui effectue un hooking de la Import Address Table en analysant les en-têtes PE et en redirigeant les adresses des fonctions importées vers un hook personnalisé à l'intérieur d'un processus cible.
Le hooking est une technique qui permet à un utilisateur de rediriger le flux d'exécution d'un programme. La plupart du temps, nous utilisons le hooking de fonctions. Nous allons soit remplacer, soit rediriger une fonction vers la nôtre ; c'est très utile et cela a de multiples cas d'usage. Il existe plusieurs façons de faire du hooking ; ici, nous nous intéressons au IAT Hooking, qui signifie Import Address Table. Cela consiste à remplacer l'adresse d'une fonction par la nôtre dans une grande table qui est remplie à l'exécution. Comme je l'ai déjà indiqué dans un autre dépôt, je vous recommande de vous renseigner davantage sur le PE Format pour comprendre la partie d'analyse de l'IAT de ce code.
Voici un schéma basique du fonctionnement du IAT Hooking. Dans cet exemple, la fonction originale est appelée après que le code malveillant a été exécuté. Dans cet exemple, nous appellerons simplement une autre fonction à la place de l'originale. L'avantage de cette technique est qu'elle ne nécessite pas de modifier le corps d'une fonction, contrairement à un hook classique par patch de la section .text avec des detours, qui doit modifier les instructions au début d'une fonction pour y placer un jmp par exemple.
C'est en réalité bien plus simple que cela n'en a l'air ; nous allons procéder en interne pour faciliter les choses, ce qui signifie que ce dépôt compilera en une DLL qui peut être injectée dans le processus cible à l'aide de mes injecteurs LoadLibraryA ou Manual Mapping pour l'injecter dans le processus cible.
D'abord, nous analysons les PE Headers du processus cible pour localiser l'Import Descriptor comme ceci :
process_base + nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
Nous pouvons ensuite parcourir chaque module importé, parcourir chaque fonction de ce module (c'est la raison des boucles imbriquées) et trouver l'adresse de cette fonction qui a été remplie à l'exécution. Dans cet exemple, nous allons hooker TranslateMessage, qui est utilisée par Windows pour traiter les événements des interfaces graphiques. Donc, une fois que nous avons trouvé l'adresse de cette fonction, nous la remplaçons par l'adresse de notre propre fonction que nous avons définie précédemment et qui existe dans le contexte du processus distant puisque nous sommes en interne. N'oubliez pas d'utiliser VirtualProtect pour vous assurer que vous avez la permission d'écrire à cet emplacement.
VirtualProtect(&firstThunk->u1.Function, sizeof(uint64_t), PAGE_READWRITE, &old_protection);
firstThunk->u1.Function = (uint64_t)hookfunction;
Comme vous pouvez le voir, lorsque notepad appelle TranslateMessage (presque tout le temps), cela exécutera notre fonction de hook, qui finit par afficher une boîte de message !
image