Professional Documents
Culture Documents
Bartosz Wjcik
Il faut bien rflchir avant de lancer un fichier tlcharg sur Internet. Bien que tous ne soient pas dangereux, il est facile de tomber sur un programme malicieux. Notre crdulit peut nous coter trs cher. Alors, avant de lancer un programme inconnu, essayons d'analyser son fonctionnement.
la fin du mois de septembre 2004, sur la liste de discussion pl.comp.programming quelqu'un a post l'article intitul CRACK UNIVERSEL POUR MKS-VIR !!!! (MKS-VIR est un programme antivirus polonais trs connu note du trad.). Ce message contenait le lien vers l'archive crack.zip avec un fichier excutable. D'aprs les opinions des utilisateurs, ce programme n'tait pas un crack. De plus, il contenait probablement du code suspect. Le lien vers ce programme apparaissait aussi dans les articles sur d'autres listes de discussion (mais il passait pour password cracker de la messagerie instantane Gadu-Gadu). C'tait si intressant que nous avons dcid d'analyser le fichier suspect. Cette analyse se compose de deux tapes. D'abord, il faut analyser la structure gnrale du fi chier excutable et sa liste des ressources (cf. l'Encadr Ressources dans les logiciels pour Windows) et dterminer le langage de programmation dans lequel le programme a t crit. Il faut aussi vrifi er si le fi chier excutable est compress (par exemple l'aide des compresseurs FSG, UPX, Aspack). Grce ces informaUPX tions, nous saurons si nous pouvons passer
directement l'analyse du code, ou bien au cas o le fi chier est compress nous devons d'abord dcompresser le fi chier. L'analyse du code des fi chiers compresss n'a aucun sens. La seconde tape, plus importante, consiste analyser le programme suspect et, ventuellement, dcouvrir dans les ressources en apparence innocentes de l'application, du code cach. Cela permettra de savoir comment le programme fonctionne et quels sont les rsultats de son excution. Nous allons justifier l'utilit de cette analyse. Ce soi-disant crack n'appartient sans doute pas aux programmes inoffensifs. Si vous tombez un jour sur un fichier suspect, nous vous conseillons d'effectuer ce type d'analyse.
Dfense
44
www.hakin9.org
Hakin9 N o 1/2005
Les ressources dans les applications pour Windows sont des donnes dfinissant les lments du programme accessible l'utilisateur. Grce elles, l'interface utilisateur est homogne, et il est facile de remplacer l'un des lments de l'application par un autre. Les ressources sont spares du code du programme. moins que l'dition du fichier excutable soit impossible, la modification d'une ressource (par exemple le changement de la couleur du fond d'une bote de dialogue) n'est pas difficile il suffit d'utiliser l'un des outils disponibles sur Internet, par exemple eXeScope. Ces ressources peuvent tre constitues de donnes au format quelconque. D'habitude, ce sont des fichiers multimdias (comme GIF, JPEG, AVI, WAVE), mais aussi des programmes excutables, fichiers texte ou documents HTML et RTF.
Identification rapide
L'archive crack.zip tlcharge ne contenait qu'un fichier : patch.exe qui faisait peu prs 200 Ko. Attention ! Nous vous conseillons vivement de changer l'extension de ce fichier avant de commencer l'analyse, par exemple en patch.bin. Cela nous protgera contre un lancement involontaire d'un programme inconnu les consquences d'une telle erreur pouvant tre trs graves. Dans la premire tape de l'analyse, nous devons comprendre la structure du fichier suspect. L'identificateur de fichiers excutables PEiD se prte parfaitement nos besoins. La base qu'il intgre permet de dfi nir le langage utilis pour la cration de l'application et d'identifier les types de compresseurs de fichiers excutables les plus connus. Nous pouvons aussi utiliser un identificateur un peu plus ancien FileInfo, mais celui-ci n'est pas si bien dvelopp, c'est pourquoi le rsultat obtenu peut tre moins prcis. Quelles informations avons-nous obtenues l'aide de PEiD ? Par sa structure, le fichier patch.exe est un
Hakin9 N o 1/2005
www.hakin9.org
45
eax, [esp+hInstance] 0 ; dwInitParam offset DialogFunc ; lpDialogFunc 0 ; hWndParent 65h ; lpTemplateName eax ; hInstance dword_405554, eax ds:DialogBoxParamA ; Create a model dialog box from a ; dialog box template resource eax, hHandle INFINITE ; dwMilliseconds eax ; hHandle ds:WaitForSingleObject 10h
il est ncessaire de connatre les ressources de l'application. Pour cela, nous nous servirons du programme eXeScope qui permet de consulter et d'diter les ressources des fichiers excutables (cf. la Figure 2). Pendant la consultation du fi chier dans l'diteur de ressources, nous ne trouvons que les types de donnes standard un bitmap, une bote de dialogue, une icne et un manifest (les botes de dialogue avec cette ressource utilisent dans les systmes Windows XP de nouveaux styles graphiques, sans lui, une ancienne interface connue des systmes Windows 9x est affiche). premire vue, on a l'impression que le fichier patch.exe est une application tout fait innocente. Mais les apparences sont trompeuses. Pour tre srs, nous devons effectuer une analyse fastidieuse du programme dsassembl et si tel est le cas retrouver du code supplmentaire cach l'intrieur du fichier.
Analyse du code
Pour effectuer l'analyse du code de l'application suspecte, nous allons utiliser un excellent dsassembleur (commercial) IDA de la socit DataRescue. IDA est considr comme le meilleur outil de ce type sur le march il permet une analyse dtaille de tous les types de fichiers excutables. La version de dmonstration, disponible sur le site de l'diteur, ne permet que l'analyse des fichiers Portable Executable et dans notre cas, cela suffit parce que patch.exe est crit ce format.
Procdure WinMain()
fichier excutable de 32 bits caractristique pour la plate-forme Windows au format Portable Executable (PE). Il est vident (cf. la Figure 1) que le programme a t crit l'aide de MS Visual C++ 6.0. Grce PEiD nous savons aussi qu'il n'a t ni compress,
ni protg. D'autres informations, comme le type de sous-systme, l'offset du fichier ou ce qu'on appelle point d'entre (en anglais entrypoint) entrypoint ne sont pas importantes. La connaissance de la structure du fichier suspect ne suffit pas
Aprs le chargement du fichier patch.exe dans le dcompilateur IDA (cf. la Figure 3), nous nous retrouvons dans la procdure WinMain() qui est le point de dpart pour les applications crites en C++. En effet, le point d'entre de chaque application est ce qu'on appelle entrypoint (de l'anglais point d'entre) dont l'adresse est stocke dans l'entte du fichier PE et partir duquel commence l'excution du code de
Dfense
46
www.hakin9.org
Hakin9 N o 1/2005
l'application. Pourtant, dans le cas des programmes en C++, le code du vrai point d'entre n'est responsable que de l'initialisation des variables internes le programmeur ne peut pas le manipuler. Ce qui nous intresse, ce sont les squences crites par le programmeur. La procdure WinMain() est prsente dans le Listing 1. Le code sous cette forme peut tre difficile analyser pour pouvoir le comprendre mieux, nous le traduisons en C++. partir de presque chaque deadlisting (code dsassembl) il est possible, plus ou moins facilement, de reconstruire le code dans le langage de programmation original. Les outils comme IDA fournissent uniquement des informations de base les noms des variables et des constantes, les conventions d'appel des fonctions (comme stdcall ou cdecl). Bien qu'il existe des plug-ins spciaux pour IDA permettant une simple dcompilation du code x86, les rsultats laissent beaucoup dsirer. Pour effectuer cette translation, il faut analyser la structure de la fonction, distinguer les variables locales, et enfin, trouver dans le code des rfrences aux variables globales. Les informations fournies par IDA suffisent pour dterminer quels paramtres (et combien) prend la fonction analyse. De plus, grce au dsassembleur, nous pourront savoir quelles valeurs sont retournes par une fonction, quelles procdures WinApi elle utilise et quelles donnes elle se rfre. Au dbut, nous devons dfinir le type de fonction, la convention de l'appel et les types des paramtres. Ensuite, l'aide des donnes d'IDA, nous dfinissons les variables locales de la fonction. Si nous avons une esquisse de la fonction, nous pouvons commencer rcuprer du code. En premier, il faut rgnrer les appels des autres fonctions (WinApi, mais pas seulement, aussi les rfrences aux fonctions internes du programme) par exemple, pour la fonction WinApi, nous analysons les paramtres successifs stocks sur la pile au moyen de
Figure 4. Fentre des rfrences dans le programme IDA l'instruction push en ordre inverse (du dernier vers le premier) que son enregistrement dans l'appel de la fonction dans le code original. Une fois toutes les informations correctement recueillies, nous pouvons restaurer la rfrence originale de la fonction. Le plus difficile dans la reconstruction du code du programme (en langage de haut niveau) est la restauration de la logique du fonctionnement l'identification correcte des oprateurs logiques (or, xor, not) et arithmtiques (addition, soustraction, multiplication, division) et des instructions conditionnelles, (if, else, switch), ou bien des boucles (for, while, do). Ces sont toutes ces informations qui, assembles, permettent de traduire le code de l'assembleur en langage utilis pour crire l'application. Il en rsulte que la translation du code en langage de haut niveau ncessite beaucoup d'exprience en analyse de code et en programmation. Heureusement, la translation dans notre cas n'est pas ncessaire, mais peut faciliter notre analyse. La procdure WinMain() traduite en C++ est disponible dans le Listing 2. Comme vous voyez, c'est la procdure DialogBoxParam() affichant la bote de dialogue qui est appele en premier. L'identificateur de la bote de dialogue est stock dans les ressources
Hakin9 N o 1/2005
www.hakin9.org
47
ce que l'tat hHandle de l'objet ne soit signal. Autrement dit : le programme ne se termine pas jusqu'au moment o l'excution d'un autre code initialis prcdemment par WinMain() ne soit pas termine. Le plus souvent, de cette faon le programme attend la fin du code lanc dans un autre thread (en anglais thread). Que peut faire un programme si simple juste aprs avoir ferm la fentre principale ? Le plus probablement, des choses pas belles. Il faut alors trouver dans le code le lieu o se trouve la poigne hHandle tant donn qu'elle est lue, elle doit tre enregistre quelque part. Pour ce faire, dans le dsassembleur IDA, il faut cliquer sur le nom de la variable hHandle. Cette opration nous renvoie au lieu o elle se trouve dans la section de donnes (la poigne hHandle est tout simplement une valeur de 32 bits de type DWORD) :
.data:004056E4 ; HANDLE hHandle .data:004056E4 hHandle dd 0 ; DATA XREF: .text:00401108w .data:004056E4 ; WinMain(x,x,x,x)+1Br
gauche du nom de la variable, nous trouvons ce qu'on appelle rfrences (cf. la Figure 4) ce sont les informations sur les lieux dans le code partir desquels une variable est lue ou modifie.
Rfrences mystrieuses
du fichier excutable. Ensuite, la procdure WaitForSingleObject() est appele et le programme se termine. partir de ce code, nous pouvons
constater que le programme affiche la bote de dialogue, et ensuite, aprs la fermeture de celle-ci (elle n'est plus visible), il attend jusqu'
Analysons les rfrences de la poigne hHandle. L'une d'elles, c'est la procdure WinMain() dans laquelle la variable est lue (c'est la lettre r qui l'indique, de l'anglais read). Mais la deuxime rfrence est encore plus intressante (sur la liste, elle est en premire position). Sa description indique que la variable hHandle est ici modifie (la lettre w, de l'anglais w write). Maintenant, il suffit de cliquer pour se rfrencer au fragment du code responsable de l'enregistrement dans la variable. Ce fragment est prsent dans le Listing 3. Une brve explication concernant ce code : tout d'abord, dans le
Dfense
48
www.hakin9.org
Hakin9 N o 1/2005
registre eax le pointeur vers l'emplacement contenant le code (mov eax, lpPointeurAuCode) est charg. Ensuite, le programme effectue un saut l'instruction qui appelle la procdure (jmp short loc _ 401104). Si cette procdure est dj appele, le registre eax contient la valeur de la poigne (d'habitude, toutes les procdures retournent les valeurs et les codes d'erreur justement dans ce registre du processeur) qui sera ensuite stocke dans la variable hHandle. Les utilisateurs qui connaissent bien l'assembleur remarquerons sans doute que ce fragment du code est suspect (il diffre du code standard C++ compil). Mais le dsassembleur IDA ne permet pas de cacher ou d'obfusquer les instructions. Utilisons alors l'diteur de 16 bits Hiew pour analyser encore une fois le mme code (Listing 4). L'instruction call eax n'est pas visible parce que ses opcodes (octets de l'instruction) ont t insrs l'intrieur de l'instruction mov eax, 0xD0FF. C'est aprs l'obfuscation du premier octet de l'instruction mov que nous pouvons voir quel code sera vraiment excut :
.00401101: EB01 jmps .000401104 ; saut l'intrieur ; de l'instruction .00401103: 90 nop ; octet de l'instruction ; obfusqu "mov" .00401104: FFD0 call eax ; instruction cache
Listing 8. Code qui charge les donnes partir du bitmap traduit en C++
unsigned int i = 0, j = 0, k; unsigned int dwTailleDeBitmap; // calculer combien d'octets occupent tous les pixels // dans le fichier du bitmap dwTailleDeBitmap = largeur du bitmap * hauteur du bitmap * 3; while (i < dwTailleDeBitmap) { // composer 8 bits constituant les couleurs RVB en 1 octet du code for (k = 0; k < 8; k++) { lpPointeurDuCode[j] |= (lpPointeurDuBitmap[i++] & 1) << k; } // octet successif du code j++; }
WIN32_FIND_DATA
Revenons au code appel par l'instruction call eax. Il faudrait savoir o renvoie l'adresse stocke dans le registre eax. Au-dessus de l'instruction call eax se trouve l'instruction qui dans le registre eax saisit la valeur de la variable lpPointeurDuCode (dans IDA, le nom de la variable peut tre chang pour que le code soit plus comprhensible il suffit de placer le pointeur sur le nom, appuyer sur la touche N et entrer un nouveau nom). Pour savoir ce qui a t stock dans
Hakin9 N o 1/2005
www.hakin9.org
49
voyez, la variable lpPointeurDuCode est positionne sur l'adresse de la mmoire alloue par la fonction VirtualAlloc(). Nous n'avons qu' vrifier ce qui se cache derrire ce fragment mystrieux du code.
Bitmap suspect
Dfense
cette variable, nous allons utiliser encore une fois les rfrences :
.data:004056E8 lpPointeurAuCode .data:004056E8 ; .text:004010A1r .data:004056E8 ; .text:004010BEr .data:004056E8 dd 0 ; DATA XREF: .text:00401092w
La variable lpPointeurDuCode est positionne par dfaut 0 et prend une autre valeur dans une seule position du code. Un clic sur la rfrence l'enregistrement dans la variable et nous sommes dans le code prsent dans le Listing 5. Comme vous
Pendant la consultation des fragments prcdents du deadlisting, nous pouvons remarquer qu' partir des ressources du fichier patch.exe, seulement un bitmap est charg. Ensuite, les composants des couleurs RVB construisent les octets successifs du code cach, qui ensuite, sont stocks dans la mmoire alloue au pralable (dont l'adresse est enregistre dans la variable lpPointeurDuCode). Le fragment principal responsable de la rcupration des donnes partir du bitmap est prsent dans le Listing 6. Dans le code prsent dans le Listing 6, nous pouvons distinguer deux boucles. L'une d'elles (intrieure) est responsable du chargement des octets successifs dterminant les composantes des couleurs RVB (Rouge, Vert, Bleu) des pixels du bitmap. Dans notre cas, le bitmap est enregistre au format 24bpp (24 bits sur pixel), alors chaque pixel est dfini par trois octets de couleur successifs au format RVB. Parmi les huit octets successifs, les bits les moins importants sont masqus ( l'aide de l'instruction and dl, 1), qui tous ensemble donne un octet du code. Si cet octet est compos, il est stock dans le tampon lpPointeurDuCode. Ensuite, dans la boucle extrieure, l'indice pour le pointeur lpPointeurDuCode est incrment de faon ce qu'il renvoie la position o il est possible de placer l'octet successif du code ensuite, il revient au chargement des huit octets successifs composant les couleurs. La boucle extrieure est excute jusqu' ce que tous les octets ncessaires du code cach soient rcuprs des pixels du bitmap. Le nombre de rptitions de la boucle gale au nombre de pixels de l'image, charg
50
www.hakin9.org
Hakin9 N o 1/2005
directement de son en-tte, et plus prcisment, ce sont des donnes comme largeur et hauteur (en pixels) cette situation est prsente dans le Listing 7. Aprs le chargement du bitmap partir des ressources du fichier excutable, le registre eax contiendra l'adresse du dbut du bitmap qui est dfini par son en-tte. Les dimensions de l'image sont charges partir de son en-tte, ensuite la largeur est multiplie par la hauteur du bitmap (en pixels), ce qui, en rsultat, donne le nombre total de pixels du bitmap. tant donn que chaque pixel est dfini par trois octets, le rsultat est multipli 3 fois. Ainsi, nous obtenons la taille finale des donnes dterminant tous les pixels. Pour mieux comprendre, le code qui charge les donnes partir du bitmap traduit en C++ est prsent dans le Listing 8. Nos recherches se sont termines avec succs nous savons o se trouve le code suspect. Les donnes secrtes ont t stockes dans les positions des bits les moins importants des composants RVB des pixels. Pour un il humain, il est impossible de distinguer l'image modifie de celle originale les diffrences sont subtiles, de plus, il faudrait disposer de l'image originale. Quelqu'un qui s'est donn beaucoup de peine pour cacher un petit fragment du code n'agissait sans doute pas dans une bonne intention. Notre tche est trs difficile il faut rcuprer le code cach de l'image, et ensuite, analyser son contenu.
L'extraction du code n'est pas trop complique nous pouvons tout simplement lancer le fichier patch.exe et, au moyen du dbogueur (par exemple SoftIce ou OllyDbg), rcuprer le code transform de la mmoire. Mais il vaut mieux rester prudent nous ne savons pas ce qui peut arriver aprs un lancement involontaire du programme. Lors de cette analyse, nous avons utilis notre propre programme,
Hakin9 N o 1/2005
www.hakin9.org
51
code cach. Cette structure est stocke dans la section de donnes du programme principal. Avant le lancement du code cach, les bibliothques systme kernel32.dll et user32.dll sont charges. Leurs poignes sont stockes dans la structure interface. Ensuite, les adresses des fonctions GetProcAddress() et CreateThread() sont enregistres dans la structure et le spcificateur dfinit si le programme a t dmarr sous Windows NT/XP. Les poignes aux bibliothques systme et l'accs la fonction GetProcAddress() permettent de rcuprer l'adresse d'une procdure quelconque et de chaque bibliothque, pas seulement de la bibliothque systme.
Thread principal
Dfense
trs simple, qui rcupre le code du bitmap sans lancer l'application (le fichier decoder.exe crit par Bartosz Wjcik, avec le code source et le code cach dj rcupr est disponible sur Hakin9 Live). Le fonctionnement du programme consiste charger le bitmap partir des ressources du fichier patch.exe et en extraire le code cach. Le programme decoder.exe utilise le mme algorithme que celui appliqu dans patch.exe.
et ses fragments les plus intressants. Pour que le code analys puisse fonctionner, il doit avoir accs aux fonctions du systme Windows (WinApi). Dans ce cas, l'accs aux fonctions WinApi est ralis travers une structure spciale interface (cf. le Listing 9) dont l'adresse est transfre dans le registre edx au
Le fonctionnement du code cach commence par le lancement par le programme principal d'un thread supplmentaire l'aide de l'adresse de la procdure CreateThread(), enregistre au pralable dans la structure interface. Aprs l'appel de CreateThread(), le registre eax retourne la poigne au nouveau thread (ou 0 en cas d'erreur) qui aprs le retour du code principale du programme est stocke dans la variable hHandle (cf. le Listing 10). Consultons le Listing 11 qui prsente le thread responsable de l'excution du code cach. Dans la procdure lance dans le thread, un paramtre est transmis dans ce cas, c'est l'adresse de la structure interface. Cette procdure vrifie si le programme a t lanc dans le systme Windows NT. Cela est d au fait que la procdure essaie de dtecter la prsence ventuelle de la
Code cach
Sur le rseau
http://www.datarescue.com dsassembleur IDA Demo for PE, http://webhost.kemtel.ru/~sen/ diteur hexadcimal Hiew, Hiew http://peid.has.it/ identificateur de fichiers PEiD, http://lakoma.tu-cottbus.de/~herinmi/REDRAGON.HTM identificateur FileInfo, http://tinyurl.com/44ej3 diteur de ressources eXeScope, http://home.t-online.de/home/Ollydbg dbogueur gratuit pour OllyDbg, http://protools.cjb.net kit d'outils ncessaires l'analyse des fichiers binaires.
Il est temps d'analyser le code cach extrait. Le tout (sans commentaires) n'occupe qu'un kilooctet et vous le trouverez sur le CD joint au magazine Hakin9 Live. Dans cet article, nous prsentons le principe gnral du fonctionnement du code
52
www.hakin9.org
Hakin9 N o 1/2005
machine virtuelle Vmware (si elle la dtecte, le programme se termine), l'aide de l'instruction de l'assembleur in. Cette instruction peut servir lire les donnes des ports E/S dans notre cas, elle est responsable de la communication interne avec les programmes de Vmware. Si elle est excute dans un systme de la famille Windows NT, le programme plante (cela ne concerne pas Windows 9x). L'tape suivante consiste charger les fonctions WinApi supplmentaires utilises par le code cach et les enregistrer dans la structure interface. Par contre, si toutes les adresses des procdures sont dj charges, la procdure scanner _ disques, vrifiant les lecteurs successifs, est lance (la fin du Listing 11).
la procdure scanest le premier indice qui suggre que l'objectif du code cach est la destruction pourquoi alors un prtendu crack aurait scann tous les lecteurs de l'ordinateur ? Le scannage commence par le disque dsign par la lettre Y:\ et se dirige vers le dbut, le plus important pour la plupart des utilisateurs le disque C : \ . Pour dfinir le type du lecteur, la fonction GetDriveTypeA() est utilise. Cette fonction, aprs la saisie de la lettre de la partition retourne son type. Le code de la procdure se trouve dans le Listing 12. Prtez votre attention au fait que la procdure P U
Figure 5. Schma de la procdure de scannage des disques recherche seulement les partitions standard des disques durs et nglige les lecteurs de CD-ROM ou les disques rseau. Si une partition correcte est dtecte, le scannage rcursif de tous ses rpertoires est lanc (la procdure supprimer _ fichiers cf. le Listing 13). En voil encore une preuve que nos soupons taient justes : le scanner, l'aide des fonctions FindFirtsFile(), B L I C I et SetCurrentDirecscanne tout le contenu de la partition la recherche de tous les types de fi chiers. Nous pouvons le constater d'aprs le masque * appliqu la procdure FindFirstFile().
FindNextFile() tory(),
Hakin9 N o 1/2005
www.hakin9.org
53
le bitmap tait dangereux. Par contre, le Listing 14 prouve que l'auteur du programme patch.exe n'avait pas de bonnes intentions. La procdure
mettre _ a _ blanc _
est appele chaque fois que la procdure supprimer _ fichiers trouve un fichier quelconque (portant un nom et une extension quelconques). Le fonctionnement de cette procdure est trs simple. Pour chaque fi chier trouv l'aide de la fonction SetFileAttributesA(), est affect l'attribut archive. Cette opration supprime tous les autres attributs, y compris lecture seule (s'ils ont t dfinis), qui protge le fi chier contre l'criture. Ensuite, le fi chier est ouvert l'aide de la fonction CreateFileA() et, si l'ouverture
taille _ fichier
a russi, le pointeur du fi chier est dplac son dbut. Pour ce faire, la procdure utilise la fonction SetFilePointer() dont le paramtre FILE_BEGIN dfinit le dplacement du pointeur (dans notre cas au dbut du fi chier). Aprs la confi guration du pointeur, la fonction SetEndOfFile() est appele. Cette fonction dtermine une nouvelle taille du fi chier en utilisant la position courante du pointeur dans le fi chier. tant donn que le pointeur a t dplac au dbut du fi chier, aprs cette opration ce dernier a donc zro octets. Aprs la mise zro, le code recommence le scannage rcursif des rpertoires la recherche des autres fi chiers, et l'utilisateur qui a lanc patch.exe
perd tour tour les donnes de son disque dur. L'analyse de ce prtendu crack nous a permis, heureusement sans devoir lancer le fichier excutable, de comprendre les principes de son fonctionnement, de rechercher le code cach et dterminer son comportement. Les rsultats obtenus ne laissent pas de doutes le petit programme patch.exe est malicieux. la suite de son fonctionnement, les fichiers trouvs sur toutes les partitions changent leur taille en zro octets et, en effet, ils cessent d'exister. Dans le cas o nous avons des donnes prcieuses, la perte peut tre irrversible. n
WinMain()
GetProcAddress()
DialogBoxParamA()
WaitForSingleObject()
Dfense
54
www.hakin9.org
Hakin9 N o 1/2005