Anda di halaman 1dari 9

Tutorial #12: le Manual Unpacking

Outils:

Le CrackMe de 16 kb

Un dsassembleur / debugger: OllyDbg 1.10

Plugin OllyDump

LordPE ou PE Tools

ImpRec
Observation du CrackMe:

Nag Screen l'xcution du programme

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


dsassemblage

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, mme une fois pack soit toujours excutable 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


tlchargement sur internet car sa taille en est rduite).

Gain de temps lors du transfert du fichier systme en mmoire.

Rsiste souvent aux reversers dbutants, puisqu'il faut que le fichier soit dcompress

avant d'tre patch.

En revanche, plus de temps pour dcompresser le fichier lors de son excution


(ngligeable a l'il nu, il est vrai).

En gros, le packer compresse un programme en y ajoutant son propre stub de chargement


et de dcryptage, qui dcompresse ainsi le programme puis lui redonne la main tt ou tard,
avant de reprendre son excution "normale".
C'est justement ce qui fait la faille de tout packer. Pour une simplification grossire, au
moment de la dcompression, le fichier peut tre dump sur le disque dur, ainsi libr du stub
de compression.
La premire chose a retenir, c'est que l'EP (Entry Point == Point d'entre pour les
Anglophobes!) du programme compress sera ncessairement diffrent de ce qu'on appelle
l'OEP (Original Entry Point == Point d'entre original du programme non-pack).
Ainsi: lorsqu'on ouvre le programme pack dans Olly par exemple, le point d'entre n'est pas
celui du programme mais celui du packer (dont la routine, habituellement selon le mme
modle pour chaque packer, va se charger de dcompresser le programme en mmoire). Au
moment o le programme jumpe vers l'OEP, le programme est dcompress. C'est la que l'on
dumpe le programme sur le disque dur pour obtenir un programme "normal" avec sa taille
[presque] originale.

On y trouve d'abord le PE (Portable Executable). Le PE est un format de fichier 32 bits et par


extension 64 bits qui enferme les informations ncessaires au Windows OS Loader pour
s'occuper du code de l'excutable. Il inclut :

les .dll (Dynamic Library)

les exports API

les Import Tables

les donnes de ressource management

les donnes TLS

Le bon point des fichiers PE est qu'ils utilisent la mme structure de fichier en dur qu'en
mmoire. Un module mappe en mmoire reprsente toutes les donnes, le code et les
ressources dont il a besoin pour son excution.

La structure de fichiers PE comprend:


DOS Header

DOS Stub

PE File Header (contient les infos sur l'EP)


Image Optional Header

Section Table, divise en:


.idata
.rsrc
.data
.text
.src

Data Directories

Sections

Le contenu des Sections est ce dont le prog a besoin pour son excution. Le reste n'est la
plus ou moins que pour aider le Win32 Loader les retrouver.
Je crois que c'est tout pour mon topo rapide... en revanche je vous invite fortement a lire les
tutos suivants de Goppit (Anglais) et de yarocco (Franais) qui vous apporteront toutes les
connaissances ncessaires sur le PE File Format. Je ne vois pas l'intrt de tout rpter a
mon tour, d'autant plus qu'ils ont fait un travail exceptionnel.
Passons maintenant a l'unpacking en se conformant aux tapes suivantes:
1. Recherche de l'OEP
2. Opration de Dumping
3. Reconstruction des Imports

METHODE 1:
Au lancement, pas de surprise: un nag qui nous embte effectivement!
Comme d'habitude, il est primordial d'tudier scrupuleusement la cible avant de se lancer.

Commenons par une analyse avec PEiD 0.94:

Il nous dit que le programme est pack avec UPX. Rassurez-vous, c'est le plus simple des
packers, sa routine de dcompression tant toujours la mme il sera facile de le reprer.
Bon ouvrons tout ca dans Olly et voyons ce que ca donne.
La routine d'UPX commence toujours par un PUSHAD qui sauvegarde tous les registres dans
la pile. Le principe est simple: il sauvegarde tous les registres dans la pile puis POP les
registres a nouveau avant de sauter vers l'OEP.
Voila a quoi ressemble cette routine en gnral:
PUSHAD
Blablah
Blablah

POPAD
JMP vers OEP

Ici, nous avons bien ceci:

dbut de la routine

puis fin de la routine plus bas.

Pour obtenir le programme sous sa forme dcompresse [en mmoire je rappelle], il va falloir
"attendre" que le programme ait atteint le JMP en 40F008 vers l'OEP. On pose alors un
breakpoint sur la ligne du JMP en double-cliquant sur les opcodes et on run (F9). Un step F8
suffit alors pour arriver vers l'OEP en 401640.
Comme le fichier est dcompress en mmoire, on va en faire une "copie" sur le disque dur,
qu'on appelle un dump (opration de dumping). Pour a on peut utiliser LordPE ou bien le
plugin Ollydump (ce qui revient au meme!). Voyons avec LordPE...

On slectionne notre programme et on note au passage l'IMAGEBASE, qui est ici de 400000.
On clique droit et on slectionne Dump Full comme ci-dessous:

On va bien sur enregistrer cette copie dump sur le dur et renommer "dump" ou "dumped":

Un dump contient toutes les instructions ncessaires au bon fonctionnement du logiciel,


pourtant si on essaye de lexcuter il ne marchera pas. En effet le programme utilise des
fonctions qui ne sont pas propre a lui-mme, comme la gestion de laffichage etc.. Toutes ces
informations sont contenues dans lIAT du programme (Import Address Table). Dumper un
programme ne reconstruit pas un IAT exploitable, cest pour cette raison que notre
dumped.exe ne fonctionne pas. Il va donc falloir reconstruire cette table. Pour nous aider
dans cette tache nous allons utiliser ImpRec [d'ou Import Reconstructor].

Nous slectionnons casciisimple.exe. Dans la fentre de log on peut noter encore


lImageBase 400000. OEP=0000EEB0. Nous avons vu plus haut que lOEP 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", puis on clique sur IAT
Auto Search.

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

Valid: YES !

Maintenant, on va rparer le dump endommag en cliquant sur Fix Dump, puis en


slectionnant notre fichier dumped.exe (qui a l'heure actuelle ne marche pas).

Si tout se passe bien, ImpRec sauvegarde une copie de notre dump appele "dumped_.exe".
Si vous l'essayez, le nouveau fichier dump marche comme une horloge suisse, donc pas de
problme. On peut noter au passage que le fichier CAsciisimple est passe de 16 Kb 72 kb,
d'ou l'intrt du packer.
Vous pouvez maintenant vous amuser a le cracker si le cur vous en dit!

METHODE 2:
La deuxime mthode est moins base sur l'observation de la routine. En effet, il va suffire de
regarder dans la fentre des registres.
Aprs ouverture du CrackMe dans Olly, on arrive sur l'EP (je rappelle, celui du packer et non
du programme-mme). On commence step F8 tout en observant le registre ESP. Des que
sa valeur change [juste aprs le pushAD en 40EEB1 dans notre cas, c'est a dit la premire
ligne], on arrte de faire F8 immdiatement et on se concentre uniquement sur ESP.
On slectionne ESP et on clique droit dessus. On fait Follow in Dump.

On voit que la fentre de Dump en bas a gauche "change d'apparence". On va alors


slectionner les premiers word de la premire ligne comme ci-dessous, cliquer droit dessus
puis y mettre un breakpoint.
BreakPoints > Hardware, On Access > Word ou Dword [ca n'a pas d'importance].

On fait ensuite F9 pour excuter le prog, puis on arrive directement sur le JMP prcdent
l'OEP! un F8 suffit pour y arriver. Nous voila a l'OEP, avec un programme dcompress en
mmoire, tout comme au dessus.
On peut ensuite reproduire l'opration de dumping et de reconstruction des imports que l'on
vient de voir.

Conclusion:
On a vu comment unpacker manuellement selon une routine simple et basique, celle d'UPX.
Cette mthode peut s'appliquer a beaucoup de packers simples. Il y a bien sur des packers
trs difficiles.
Aussi rbarbatif qu'il puisse paraitre, l'unpacking prsente souvent un bon dfi pour le
reverser et reste un domaine trs intressant.

Tutorial by Dynasty & Ezequi3l http://deezdynasty.xdir.org/


http://deezdynasty.totalh.com/forum/