COURS N°2 : ASPACK 2.12

 

 

Salut à tous ! Après un tutorial sur UPX, je vais cette fois ci m’attaquer à Aspack 2.12. Surtout pas de panique, c’est quasiment aussi simple qu’UPX ! Mais vous verrez tout ça par la suite.

-         Et comment on fait pour savoir si un logiciel est packé avec Aspack 2.12 ?????

-         Pfffff, t’es chiant avec tes questions toi, à peine je commence à parler faut déjà que tu fasses parler de toi. Je vais quand même te répondre pour ne pas passer pour un nul. Donc déjà si tu n’as pas les SDR sous windasm tu peux commencer à te poser des questions sur un éventuel packer, mais attention ! Ce n’est pas toujours le cas (voir le tutorial de ReverseMe). De toutes façons le mieux c’est d’étudier ton programme avec un identifieur avant toutes choses, comme ça pas de surprise.

 

Ce qu’il faut savoir sur Aspack :

-         Aspack est seulement un compresseur, il ne protège pas vraiment le fichier d’éventuels méchants crackeurs !

-         Il ne touche pas aux sections du programme mais en rajoute deux à la fin : .aspack et .adata

-         L’entrypoint du programme packé est situé dans la section aspack

 

C’est tout ce que vous avez besoin de savoir pour l’unpacker.

Donc étant donné que la marche à suivre est la même que pour UPX (et pour beaucoup de packers !) on va reprendre le même schéma :

 

1) Recherche de l’OEP

 

On va donc rechercher l’OEP afin de le rediriger vers celui du programme original (non packé). Avec UPX c’était plus facile, on allait tout en bas et on trouvait le POPAD accompagné de son très cher Jmp OEP. Là c’est plus dur ! Mais pas trop non plus, de toutes façons on verra ça plus en détail tout à l’heure.

 

2) Dump du programme

 

Et oui, Aspack compresse le logiciel ! On retrouve donc le même système de LOADER qui décompresse le programme en mémoire (sur les anciennes versions je sais qu’il y a 3 LOADERS mais sur celle-ci j’en ai aucune idée, de toutes façons c’est pas très important pour dépacker cette version !). Donc on trouve un endroit dans le programme où on est sûr qu’il sera décompressé, puis on dump à ce moment là.

 

3) Modifications du PE

 

Ici, pas grand chose non plus, Aspack modifie juste l’OEP pour charger son LOADER, on devra donc remettre les choses dans l’ordre

 

4) Reconstruction de l’IAT


Aspack détruit une partie de l’IAT donc ça sera à nous de la reconstruire (même principe que pour UPX).

 

Outils utilisés : OllyDBG (1.09d) pour tracer, Ollydump pour dumper (téléchargeable à cette adresse : http://dd.x-eye.net/file/ollydump211.zip (valable le 19/04/2004), IMPrec (1.6) pour l’IAT, Windasm pour le fun et c’est tout (Ne pas oublier Monsieur unpackme n°2.exe !)

 

1) Recherche de l’OEP

 

Bon, et ben cette fois-ci comme on va partir de rien pour trouver l’OEP, pas de recette magique (pas tout de suite en tous cas !). Donc on charge notre unpackme et quelle est la première instruction ? PUSHAD ! Tiens, tiens, alors comme ça on veut sauvegarder les registres ? Bien, comme tu veux, mais n’oublie pas le POPAD qui va avec ! Avec UPX on a le Jmp OEP juste après le POPAD, on est donc en droit de penser qu’il en sera de même avec Aspack. Alors hop ! On cherche le POPAD, et en plus on le cherche à l’arrache. Donc on fait défiler le listing et on s’arrête sur le premier POPAD qu’on voit, c’est un peu chiant mais t’en verra d’autres !

On trouve ce POPAD en 004053AF. Posez un breakpoint dessus et lancez l’unpackme avec Olly, il break bien à l’adresse voulue. Je vous ai joint une capture d’écran pour qu’on s’y retrouve plus facilement :

 

 

Donc, comme cité ci-dessus, ce qui nous intéresse c’est la partie suivante :

 

004053AF       POPAD

004053B0       JNZ SHORT unpackme_.004053BA

004053B2       MOV eax,1

004053B7       RTN 0C

004053BA      Push unpackme_.00401188

004053BF       RTN

 

-         Euh, moi j’ai pas le même code. J’ai pas Push unpackme_.00401188, j’ai Push 0 !

-         Encore toi ! Bon ! C’est parce que tu n’as pas cliqué sur la flèche bleu à côté du sigle « pause », le programme n’a pas été lancé à partir d’Olly, il n’a donc pas pu analyser le code !

-         Ah, ok ! Et pourquoi  le code qui est juste en dessous ne nous intéresse plus ?

-         Pose un breakpoint sur le POPAD, et trace jusqu’au RETN, trace encore une fois et regarde ce qu’il se passe ?

-         Euh, ben on est parti du truc

-         Exactement, ce RETN nous a fait faire un saut dans le programme, et de très loin si tu regardes les adresses qui séparent du RETN de l’endroit où tu as atterris. Tu remarques qu’on a sauté carrément dans une autre section, et ça c’est très caractéristique d’un saut vers l’OEP du programme original. Tiens, je vais t’apprendre un truc utile

 

On va jeter un rapide coup d’œil aux sections du programme. Donc tu lances LordPE, tu cliques sur PE Editor et là tu cliques sur « SECTIONS » qui se trouve sur la gauche. Là on a le listing des sections du programme. Remarques au passage les deux sections caractéristiques d’aspack : .aspack et .adata

On voit aussi une colonne « VOFFSET ». Tu te souviens de l’Image Base ? C’est 00400000, et ben tu additionnes ces deux valeurs et tu as la correspondance de ces sections avec le listing ! Tu me suis ? Prenons par exemple la section .aspack, on voit que son VOFFSET est égal à 00005000, on l’additionne à l’Image Base ce qui nous donne 00405000. C’est donc à la ligne 00405000 que commence cette section ! Et si on revient un peu en arrière, on voit que la première instruction du programme, le PUSHAD commence en 00405001 ! Ce qui signifie que la première instruction est située dans la section .aspack, ce qui signifie à son tour que l’OEP du programma packé se trouve bien dans la section .aspack.

 

-         Bien ! Mais vu qu’il y a un RETN, c’est qu’on est dans un call nan ?

-         Et bien pas tout a fait en fait. L’instruction RETN est le plus souvent utilisée dans les CALL, mais elle peut servir partout, je remercie d’ailleurs au passage ReverseMe (et oui encore lui) de m’avoir appris ça, t’as qu’a lire son tut tiens, tu t’instruiras. Donc pour reprendre un peu son tut et ses explications, lorsque ton programme est sur un RETN, il prend la valeur posée sur la pile et la stocke dans EIP, ce qui a pour effet de te faire sauter à l’adresse qui a été pushée., c’est pas mal hein ? tâche de t’en souvenir lors de tes prochains raids de cracking !

-         D’accord, mais il est nul ton cours ! Moi je veux pouvoir cracker n’importe quel programme packé par Aspack et là tu me dis comment cracker le tiens, il est moche en plus ton programme

-         Sors d’ici petit insolent !!!!!!

 

Le petit bonhomme insolent sort….

 

-         Bon, ben si il avait été moins impatient il aurait su où je voulais en venir. Tous les packers ont certaines portions de codes qui leurs sont caractéristiques, par exemple pour trouver l’OEP avec UPX, on a toujours :

POPAD

Jmp OEP

 

Et bien avec aspack, le code caractéristique c’est ce qu’on a trouvé à partir du POPAD, donc un prog packé par Aspack 2.12 sautera toujours vers l’OEP comme ceci :

 

POPAD

JNZ un peu plus loin

Mov eax,1

RETN

Push OEP

RETN

 

C’est pas plus bête que ça ! L’OEP est ce qui vient après le Push ! Vous êtes donc maintenant tous capables de trouver l’OEP de n’importe quel programme packé avec aspack 2.12, c’est bien !

 

 

2) DUMP du programme

 

Donc petit rappel : le LOADER est le programme chargé de décompresser le programme en mémoire (j’espère que ça commence à rentrer !). Le code compressé est illisible (sauf pour le LOADER, ça coule de source) donc le LOADER doit le décompresser afin que ton OS puisse l’exécuter (et toi pour l’étudier mais ça tu le gardes pour toi :P). On doit donc réaliser une copie du programme au moment où on sait qu’il est entièrement décompressé ! On sait que le programme est décompressé au moins au niveau du POPAD, donc on pose notre breakpoint dessus, et on lance notre programme à partir de Olly.

Une fois que Olly a breaké, on clique sur « Plugins », puis sur  « OllyDump », et enfin sur « Dump Debug Process ».

Alors surtout pas de panique, je vais vous expliquer tout ce qu’il y a sur cette fenêtre, on commence par une capture :

 

 

 

Start Adresse : L’adresse où commencera le dump, donc nous on laisse ce qu’il y a par défaut, ça nous convient très bien ! Si on avait commencé à dumper un peu plus tard on aurait eu un PE un peu foireux.

Je m’explique : On remarque que la première section de notre programme, à savoir .text commence en 00401000 (relis un peu au dessus si tu n’a pas compris) alors que le programme lui-même commence en 00400000 (à l’image base en fait). Je sens une question germer dans votre esprit ! Si la première section commence en 00401000 et le programme en 00400000, ben keskia alors entre ces deux adresses ? Et ben c’est le PE ! Donc si on avait commencé à dumper en 00400010 par exemple, il nous aurait manqué du code et notre dump ne serait pas fonctionnel !

 

Size : La place que ça va prendre ! On remarque qu’a côté du VOFFSET on a VSIZE, et ben c’est tout simplement la place qu’occupe chacune des sections, donc on laisse par défaut afin de pouvoir dumper toutes les sections

 

Base of Code : Ca ne nous intéresse pas pour l’instant, on laisse par défaut. On voit que la valeur de Base of Code est égale à la valeur du Virtual OFFSET de la section .text contenant le code, on peut donc dire que Base of Code c’est comme l’image base du code, c’est tout bête !

 

Base of Data : C’est comme Base of Code sauf que cette fois ci c’est pour les datas !

 

Entrypoint : C’est l’entrypoint du programme packé

 

Modify puis Get EIP as OEP : EIP est un registre qui contient l’adresse à laquelle nous sommes actuellement. Donc là si on veut prendre l’adresse contenue dans EIP comme OEP (GET EIP AS OEP) on clique ! Pour nous, EIP sera l’adresse à laquelle on a breaké. Vous pouvez laisser la valeur par défaut ici, ça ne gène pas. En effet, on sait qu’à cet endroit le programme est décompressé, donc on peut très bien commencer notre programme à partir de cette adresse, on commencera dans le LOADER mais c’est pas grave vu qu’il saute juste après à l’OEP. Mais pour faire plus propre je vous conseille de mettre l’OEP trouvé à la place de celui proposé par défaut. Ce qui du coup nous feras sauter l’étape n°3 car Olly va lui-même modifier le PE en remplaçant l’OEP du loader par l’OEP qu’on lui aura donné (donc l’OEP du programme original).

 

 

Pour les fainéants du fond vous pouvez laisser la case « Rebuild Import » qui permet de reconstruire l’IAT.

Cliquez sur DUMP et choisissez le nom de votre dump, et voilà, votre dump est fonctionnel ! Maintenant cassez vous, moi je reste avec les bosseurs !

Donc nous on va décocher cette case et reconstruire l’IAT avec IMPrec, c’est plus long, mais c’est mieux pour apprendre !

Donc on ferme notre Olly chéri et on lance l’unpackme.exe qui est packé. Maintenant on lance Imprec et on respecte le schéma d’UPX :

 

1) On sélectionne le processus

2) On modifie l’OEP en le remplaçant par l’original

3) On clique sur IAT Autosearch

4) On clique sur Get Imports, vous avez le nom de tt les imports ainsi que quelques informations dont je vous expliquerez l’utilité un peu plus tard.

5) On clique sur Fix dump et on va chercher notre dump, on clique sur OK

 

Je vous remet la capture (c’est la même que pour UPX) :

 

 

Vous avez maintenant un dump fonctionnel !

On va maintenant s’attaquer à la super protection du programme, à savoir le code secret. On lance le programme, on met un vieux code pourri et on fait semblant de noter la phrase qui s’affiche (je dis qu’on fait semblant parce qu’on retrouvera ça très facilement :P).

On lance windasm et on ouvre le log, puis on cherche les SDR ! On commence à chercher la phrase qui nous intéresse lorsqu’on tombe sur une autre phrase qui attire plus l’attention qu’elle ne le voudrait : « Non je ne suis pas le code secret ! ». On double clique.

En avançant un tout petit peu plus loin dans le programme on remarque deux phrases, la première qui a plutôt l’air de nous annoncer une bonne nouvelle, et l’autre non.

Le programmeur aurait-il été assez con pour que le code secret apparaisse dans les SDR ??

On va quand même essayer, au cas où.

On relance l’unpackme, on tape « Non je ne suis pas un code secret ! » et là on a le bon message. C’est vraiment du foutage de gueule, on devrait les enfermes ces programmeurs !!

Donc en tous cas pour nous c’est mission accomplie, on a dépacké Aspack 2.12 et au final c’est tout ce qui importait ! Merci d’avoir lu ce tut !

 

Kef, le mardi 20 avril 2004