HZV Mag #3 - HZV / Hackerzvoice / The Hackademy
HZV Mag #3 - HZV / Hackerzvoice / The Hackademy
HZV Mag #3 - HZV / Hackerzvoice / The Hackademy
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
aussitôt à l’emplacement mémoire pointé par<br />
EDI. Enfin nous incrémentons EDI, les allocations<br />
mémoire étant réalisées les unes après les<br />
autres (si l’on se réfère à notre code) en incrémentant<br />
EDI de 4, nous pointons maintenant<br />
sur l’espace alloué à aCreateFileA. Cependant<br />
pour trouver l’adresse de la chaîne de caractères<br />
qui pointe vers "CreateFileA", ce n’est pas aussi<br />
simple. En effet il va falloir trouver la fin de la<br />
chaine "CloseHandle", qui est terminée comme<br />
il se doit pas un octet nul, afin de pointer vers<br />
le début de la chaine "CreateFileA", d’où mon<br />
morceau de code incrémentant ESI et cherchant<br />
l’octet nul. Une fois l’octet nul trouvé, on recommence<br />
le processus afin de trouver l’adresse de<br />
la seconde fonction et ainsi de suite. En ce qui<br />
concerne la ligne comparant ESI à 0FFh, il s’agit<br />
en fait d’une sentinelle, elle est nécessaire car<br />
notre procédure de recherche doit s’arrêter<br />
une fois toutes les fonctions trouvées, 0FFh<br />
est donc la valeur qui indique à notre procédure<br />
de se stopper une fois son travail achevé.<br />
MessageBox<br />
<strong>HZV</strong> <strong>Mag</strong> <strong>#3</strong><br />
Infecteur Win32: - par Kernel Junky<br />
A partir de ce moment, nous avons récupéré<br />
quasiment toutes les fonctions nécessaires,<br />
sauf notre fonction MessageBox, qui permet<br />
l’affichage d’une boîte de dialogue. En fait c’est<br />
parce qu’elle ne se trouve pas dans la librairie<br />
kernel32.dll, mais dans user32.dll, une autre<br />
librairie du système Microsoft. C’est pour cela<br />
qu’il va falloir que nous fassions une autre<br />
procédure permettant un scan des fonctions<br />
de user32.dll, rassurez-vous cela sera plus facile<br />
que lors du scan de kernel32.dll, car nous<br />
avons dorénavant tous les outils nécessaires<br />
en main. Pour commencer il faut que nous<br />
trouvions l’adresse de user32.dll, nous allons<br />
donc utiliser pour cela la fonction LoadLibrary<br />
pour récupérer l’adresse de celle-ci.<br />
Le code est plutôt simple, nous faisons pointer<br />
EAX sur la chaîne de caractères correspondant<br />
à "user32.dll" puis nous la mettons sur la<br />
pile, nous appelons par la suite LoadLibraryExA<br />
afin de récupérer son adresse (plus facile que<br />
l’exploration du PEB, hein ?). Ensuite nous faisons<br />
pointer EDI sur la chaîne de caractères<br />
correspondant à "MessageBoxA" que nous plaçons<br />
sur la pile, ainsi que l’adresse de user32.<br />
dll. Puis nous appelons GetProcAddress, nous<br />
nous retrouvons donc avec l’adresse de MessageBoxdans<br />
EAX, que nous sauvegardons.<br />
:<br />
HMODULE WINAPI LoadLibraryEx(<br />
__in LPCTSTR lpFileName,<br />
__reserved HANDLE hFile,<br />
__in DWORD dwFlags<br />
);<br />
:<br />
GetMessageBox:<br />
lea eax, sUser32<br />
push 2h<br />
push 0<br />
push eax<br />
call aLoadLibrary<br />
mov aUser32, eax<br />
lea edi, sMessageBox<br />
push edi<br />
push aUser32<br />
call aGetProcAddress<br />
mov aMessageBox, eax<br />
Recherche d’exécutables<br />
Ç retour au sommaire<br />
Maintenant, nous allons doter notre virus d’une<br />
fonction lui permettant de trouver des cibles,<br />
mais attention, pas n’importe quels fichiers, des<br />
fichiers exécutables. Pour cela nous allons utiliser<br />
deux fonctions : FindFirstFile et FindNextFile.<br />
Comme nous pouvons le constater, la fonction<br />
FindFirstFile prend en paramètre une chaine de<br />
caractères. Cette chaine peut être un nom de<br />
fichier ou une wildcard, ici le plus intéressant<br />
serais de passer "*.exe" afin de récupérer les<br />
exécutables du répertoire courant. La fonction<br />
prend également en paramètre un pointeur<br />
vers une structure que la fonction va se<br />
charger de remplir (Je vous laisse faire des recherche<br />
pour plus de détails sur la structure).<br />
10