Bonjour !
on parle souvent de l'injection de DLL dans un process mais sous la forme d'un thread indépendant (qui en gros exécute le code qu'on a écrit dans notre langage préféré et qu'on a mis dans une DLL). Sauf que perso je ne vois pas bien l'intérêt, souvent le reverse engineering et notre gentil debugger nous a permis de trouver LA FONCTION dans le programme cible qui prend en argument THE STRUCTURE ou THE OBJET qui contient ... ben ce qu'on veut récupérer/modifier...
Ma méthode pour récupérer cette donnée d'intérêt est un peu "hardcore" et difficilement applicable à grande échelle :
- j'ouvre HexEdit.
- Je trouve un endroit où mettre 2 (int) variables globales dans le programme cible + 16 octets d'instructions langage machine
- au début de la fonction d'intéret (après push ebp; mov ebp,esp) je mets un jmp vers la zone libre que j'ai trouvée. Je mets le code (compilé) pour ouvrir ma dll :
- bien sûr j'ai recalculé tous les jmp et call et les références à mes deux variables gloables var1 et var2 pour que tout fonctionne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 // fonction cible push ebp mov ebp,esp // des instructions remplacées par : jmp adress1 // mon code adress1: if (!var1) { var1 = loadlibrary("ma_dll.dll"); if (var1) var2 = getprocaddress(var1,"ma_fonction"); } if(var2) push [ebp+8]; call var2; // [ebp+8] car ce qui m'intéresse c'est de récupérer l'argument 1 de la fonction cible ICI JE RECOPIE LES INSTRUCTIONS EFFACEES PAR MON jmp adress1 jmp retour_a_la_fonction_du_programme_cible_comme_si_de_rien_netait
- petit détail : la plupart des programmes sont liés avec user32.dll, et loadlibrary et getprocaddress ont déjà une adresse dans la mémoire de l'exécutable, il suffit de les utiliser
J'ai vu qu'il existait une fonction VirtualAllocEx. Je pourrais mettre mon code dans un espace réservé avec VirtualAllocEx ?
Donc Je fais un programme qui exécute le programme cible. Je fais un appel de VirtualAllocEx, y mets le code pour exécuter loadlibrary+getprocadresss+call et mes 2 variables globales, modifie le code de la cible en y mettant un jmp vers ma zone allouée avec VirtualAllorxEx, et attends que la cible passe par ce jmp (moins de 3ms a priori) ?
Je n'ai pas trouvé d'exemple clair à ce sujet
Pour ceux que ça intéresse : en général on n'attaque le .exe de la cible, mais une des dll qu'il utilise. L'avantage c'est que les dll contiennent des noms de fonctions qui nous renseignent beaucoup sur l'activité du programme, et ces noms permettent souvent de repérer une fonction qui prend en argument quelque chose d'intéressant
Partager