Tutorial #12: le Manual Unpacking

Outils:

Le CrackMe de 16 kb

Un désassembleur / debugger: OllyDbg 1.10

Plugin OllyDump

LordPE ou PE Tools

ImpRec
Observation du CrackMe:

Nag Screen à l'éxécution du programme

Le CrackMe est packé ->Message d'alerte d'Olly lors du
désassemblage

Objectifs:

Unpacker manuellement le CrackMe

Partie 1: Unpacker le CrackMe

Nous allons commencer par quelques infos de base sur les packers et la structure d'un .exe.
Il faut qu'un programme, même une fois packé soit toujours exécutable sans modification de
son comportement. Ainsi, l'utilisateur non-averti ne se rend compte de rien lors de son
utilisation. Les avantages sont divers:

Gain d'espace dans le stockage de fichiers (ainsi on peut commercialiser un produit en
téléchargement sur internet car sa taille en est réduite).

Gain de temps lors du transfert du fichier système en mémoire.

Résiste souvent aux reversers débutants, puisqu'il faut que le fichier soit décompressé

le code et les ressources dont il a besoin pour son exécution. avant de reprendre son exécution "normale". C'est justement ce qui fait la faille de tout packer. plus de temps pour décompresser le fichier lors de son exécution (négligeable a l'œil nu. ainsi libéré du stub de compression. au moment de la décompression. Au moment où le programme jumpe vers l'OEP. le programme est décompressé. habituellement selon le même modèle pour chaque packer. Un module mappe en mémoire représente toutes les données.dll (Dynamic Library) • les exports API • les Import Tables • les données de ressource management • les données TLS Le bon point des fichiers PE est qu'ils utilisent la même structure de fichier en dur qu'en mémoire. qui décompresse ainsi le programme puis lui redonne la main tôt ou tard. Ainsi: lorsqu'on ouvre le programme packé dans Olly par exemple. On y trouve d'abord le PE (Portable Executable). le fichier peut être dumpé sur le disque dur. le point d'entrée n'est pas celui du programme mais celui du packer (dont la routine. La première chose a retenir. C'est la que l'on dumpe le programme sur le disque dur pour obtenir un programme "normal" avec sa taille [presque] originale. • En revanche. . En gros. c'est que l'EP (Entry Point == Point d'entrée pour les Anglophobes!) du programme compressé sera nécessairement différent de ce qu'on appelle l'OEP (Original Entry Point == Point d'entrée original du programme non-packé). Il inclut : • les . Le PE est un format de fichier 32 bits et par extension 64 bits qui enferme les informations nécessaires au Windows OS Loader pour s'occuper du code de l'exécutable. va se charger de décompresser le programme en mémoire). le packer compresse un programme en y ajoutant son propre stub de chargement et de décryptage. Pour une simplification grossière.avant d'être patché. il est vrai).

Reconstruction des Imports METHODE 1: Au lancement. Passons maintenant a l'unpacking en se conformant aux étapes suivantes: 1.. Je crois que c'est tout pour mon topo rapide. Le reste n'est la plus ou moins que pour aider le Win32 Loader à les retrouver. pas de surprise: un nag qui nous embête effectivement! Comme d'habitude.src • Data Directories • Sections Le contenu des Sections est ce dont le prog a besoin pour son exécution. divisée en: • .rsrc • .text • . Commençons par une analyse avec PEiD 0.idata • .94: . Je ne vois pas l'intérêt de tout répéter a mon tour. Recherche de l'OEP 2.La structure de fichiers PE comprend: DOS Header • DOS Stub • PE File Header (contient les infos sur l'EP) Image Optional Header • • Section Table. d'autant plus qu'ils ont fait un travail exceptionnel.data • . en revanche je vous invite fortement a lire les tutos suivants de Goppit (Anglais) et de yarocco (Français) qui vous apporteront toutes les connaissances nécessaires sur le PE File Format. Opération de Dumping 3. il est primordial d'étudier scrupuleusement la cible avant de se lancer..

nous avons bien ceci: début de la routine puis fin de la routine plus bas. Bon ouvrons tout ca dans Olly et voyons ce que ca donne. Le principe est simple: il sauvegarde tous les registres dans la pile puis POP les registres a nouveau avant de sauter vers l'OEP. La routine d'UPX commence toujours par un PUSHAD qui sauvegarde tous les registres dans la pile.Il nous dit que le programme est packé avec UPX. Rassurez-vous. c'est le plus simple des packers. . Voila a quoi ressemble cette routine en général: PUSHAD Blablah Blablah …… POPAD JMP vers OEP Ici. sa routine de décompression étant toujours la même il sera facile de le repérer.

on va en faire une "copie" sur le disque dur. il va falloir "attendre" que le programme ait atteint le JMP en 40F008 vers l'OEP. qu'on appelle un dump (opération de dumping). Un step F8 suffit alors pour arriver vers l'OEP en 401640. On sélectionne notre programme et on note au passage l'IMAGEBASE.Pour obtenir le programme sous sa forme décompressée [en mémoire je rappelle]. Voyons avec LordPE.. qui est ici de 400000. Pour ça on peut utiliser LordPE ou bien le plugin Ollydump (ce qui revient au meme!). On pose alors un breakpoint sur la ligne du JMP en double-cliquant sur les opcodes et on run (F9). Comme le fichier est décompressé en mémoire. On clique droit et on sélectionne Dump Full comme ci-dessous: On va bien sur enregistrer cette copie dump sur le dur et renommer "dump" ou "dumped": ..

En effet le programme utilise des fonctions qui ne sont pas propre a lui-même. OEP=0000EEB0. . Pour nous aider dans cette tache nous allons utiliser ImpRec [d'ou Import Reconstructor].Un dump contient toutes les instructions nécessaires au bon fonctionnement du logiciel. Nous avons vu plus haut que l’OEP était 00401640 donc pour ImportRec nous faisons OEP=imagebase-OEP de Olly : 400000-401640=1640 On modifie cette donne manuellement si besoin dans la case "OEP". comme la gestion de l’affichage etc. Il va donc falloir reconstruire cette table.exe.exe ne fonctionne pas.. puis on clique sur IAT Auto Search. c’est pour cette raison que notre dumped. pourtant si on essaye de l’exécuter il ne marchera pas. Toutes ces informations sont contenues dans l’IAT du programme (Import Address Table). Nous sélectionnons casciisimple. Dans la fenêtre de log on peut noter encore l’ImageBase 400000. Dumper un programme ne reconstruit pas un IAT exploitable.

et ceux-ci doivent être valides comme cidessous: Valid: YES ! . puisque ImpRec trouve quelque chose et nous et nous le dit.Tout marche jusqu'à maintenant. Ne nous reste plus qu'a cliquer sur Get Imports.

le nouveau fichier dumpé marche comme une horloge suisse. puis en sélectionnant notre fichier dumped. Si tout se passe bien. donc pas de problème. Si vous l'essayez.exe". On commence à step F8 tout en observant le registre ESP.Maintenant. On fait Follow in Dump. En effet. c'est a dit la première ligne]. On peut noter au passage que le fichier CAsciisimple est passe de 16 Kb à 72 kb. on va réparer le dump endommagé en cliquant sur Fix Dump. . Après ouverture du CrackMe dans Olly. Des que sa valeur change [juste après le pushAD en 40EEB1 dans notre cas. On sélectionne ESP et on clique droit dessus. Vous pouvez maintenant vous amuser a le cracker si le cœur vous en dit! METHODE 2: La deuxième méthode est moins basée sur l'observation de la routine. d'ou l'intérêt du packer. ImpRec sauvegarde une copie de notre dump appelée "dumped_. celui du packer et non du programme-même).exe (qui a l'heure actuelle ne marche pas). on arrête de faire F8 immédiatement et on se concentre uniquement sur ESP. il va suffire de regarder dans la fenêtre des registres. on arrive sur l'EP (je rappelle.

Cette méthode peut s'appliquer a beaucoup de packers simples. cliquer droit dessus puis y mettre un breakpoint.org/ http://deezdynasty. Conclusion: On a vu comment unpacker manuellement selon une routine simple et basique. On peut ensuite reproduire l'opération de dumping et de reconstruction des imports que l'on vient de voir.On voit que la fenêtre de Dump en bas a gauche "change d'apparence". tout comme au dessus. puis on arrive directement sur le JMP précédent l'OEP! un F8 suffit pour y arriver. On va alors sélectionner les premiers word de la première ligne comme ci-dessous. Tutorial by Dynasty & Ezequi3l – http://deezdynasty.com/forum/ . On fait ensuite F9 pour exécuter le prog.xdir. Il y a bien sur des packers très difficiles. Nous voila a l'OEP. On Access > Word ou Dword [ca n'a pas d'importance]. Aussi rébarbatif qu'il puisse paraitre. avec un programme décompressé en mémoire. l'unpacking présente souvent un bon défi pour le reverser et reste un domaine très intéressant. celle d'UPX. BreakPoints > Hardware.totalh.