Les fichiers compactés

 

Introduction :

Avant tout, les fichier compactés dis PE n'ont rien à voir avec un compactage sous WinRAR ou autre. Se sont des fichiers independants, compréssés et parfois même chiffrés. Au debut ces programmes etaient conssus dans le but de tenir toujours le moins de place possible pour le transport de fichiers. Avec le temps leurs auteurs se sont rendus compte que de tels fichiers embêtaient bien les crackers de tout poils car on ne pouvais pas désassembler un fichier de façon lisible. Avec l'arrivée de protections comme Anti-SoftIce, Vbox et autres, les professionels sont tous devenu unanime, les fichiers PE chiffré sont une des pires choses qu'il puisse arrivé à un cracker. Au premier coup d'oeil, il parait difficile de deplomber de tels fichiers, mais certains crackers avaient reussi à craquer un fichier PE en exploitant une faille systeme ; en effet, ces fichiers compactés se decompressant en mémoire utilisent une zone propriétaire dite buffer. De cette façon on pouvait cibler un octet en mémoire pour le patcher sans probleme. C'est depuis ce moment là que la guerre à l'empaqueteur (Packer) le plus performant et le plus sécurisant à étée lancée...

Dans cette introduction, dans un premier temps, nous allons faire beaucoup de théorie, car dans ce type de protection, point de salut, il faut faire en faire beaucoup car la pratique se revele limitée compte tenu des possibilités des Packers.

 

Premiers reflexes à avoir :

Avant toute chose, il faut être sûr que le fichier cible est compacté. Pour cela il existe une méthode quasi-infaillible et toute simple qui conssiste à ouvrir le fichier sous un editeur héxadecimal et de regarder la signature avant le point d'entrée du fichier. Par exemple, pour l'excellent UPX, la signature est (surement la plus longue de toutes!) : UPX 0.82 Copyright (C) 1996-1999 Laszlo Molnar & Markus Oberhumer $..$Id: NRV 0.61 Copyright (C) 1996-1999 Markus F.X.J. Oberhumer $..$License: NRV for UPX is distributed under special license $..UPX! Ouf!

Cela va nous servir à bien cibler le type de compacteur (Packer), ici UPX v0.82.

 

Type de compacteur :

Des compacteurs, il en existe de toutes sorte, des simples et des complexes.

Vous l'aurez compris, un programme compacté par un compacteur ou par un autre devra être cracker différemment. Nous verrons les méthodes les plus courantes ;)

 

Les outils :

" Dans le monde du cracking il existe une catégorie qui se demarque des autres, les Légendes. Ce sont de vrais pros, ils connaissent tout sur tout, déplombent en une nuit ce qu'une equipe de crackers n'aurrai pu faire en deux jours. Ce sont surtout eux qui codent des programmes et autres utilitaires pour le cracking, histoire de se facilité la vie pour plus tard, et la notre aussi! C'est vraiment faignant un cracker :)

Tout ca pour vous dire qu'il existe des tones d'outils mais ils ne sont pas tous au point. Pour bien s' initier, je vous conseil les outils suivant :

Votre cerveau :
ce coup-ci il va vraiment vous servir.

WinDasm 8.9 :
Le désassembleur le plus pratique, inutile de le presenté ;)

Hiew 6.x :
In-dis-pens-sable !! Pour faire des modifications directement en assembleur dans le fichier compacté. Et oui, c'est le seul moyen pour casser des protections... Bref, ca évite de passer par lé héxadecimale pour implementer son code. Son interface rebutante au début se revele géniale pour peu que l'on s'y interresse. De toute façon vous serez obliger de vous en servir :)C'est sans aucun doute le prog le plus abouti pour faire ces modifs. Toute l'aide est accessible en appuyant sur F1.

Soft-Ice 3 ou 4 : Si vous ne l'avez toujours pas, procurez-le vous! Sinon vous ne pourrez pas tracer le programme compacter en mémoire. On ne presente plus le debugger par exellence. Son usage pourra aussi paraitre compliqué et orienté "super-pro" mais avec un peut de pratique tout se passera bien. Un fois charger en mémoire (une fois installer et machine rebootée) vous pouvez rendre la console visile grace à Ctrl+D et acceder à l'aide en tappant help puis entrée. Attention, une documentation en français serait tout de même preferable...

NB: Soft-Ice ne demarre pas ou mal sur certaines machines, dans ce cas verifiez que tout est bien installer. Si c'est le cas et qu'il ne demarre toujours pas... et bien vous êtes mal pour deplomber des progs compactés...

PE-Sniffer 1.x :
Petit programe qui ne pais pas de mine mais bien sympat et qui va nous indiquer quel compacteur à été utiliser pour compacté le fichier cible. Ca nous évite donc de chercher la signature dans le fichier. Son utilisation est extremement simple, il suffit d'indiquer le fichier cible et PE-Sniffer nous dis par quel outils il à été compacté en grisant le nom du compacteur reconnu. Utile pour ProcDump.

ProcDump :
Comment ne pas siter ce programme. en fait il existe mieux pour detailler les blocs mémoire occupé, etc, mais ProcDump possede un systeme de script qui le rend évolutif assez simplement. Outil indispenssable aussi. Là c'est un peux plus delicat. ProcDump comporte des tas d'options pour analyser et/ou faire des traitement dans le buffer du fichier decompacté. Ici un petit mode d'emploi s'impose, il s'étofferras dans les prochains n° de MemenTo.


Quand vous démarrez ProcDump, allez dans les options.
Voici celles qui peseront le moins de problemes :

Une fois la case de sauvegarde d'options cochées, retournez dans ProcDump. Pour vous montrer son fonctionnement on va purger des strings datas.

On va donc demarrer un programme compacté ( ici on va prend PE Compact sur www.collakesoftware.com comme exemple). Donc demarrez le, puis revenez a ProcDump. Dans la liste où sont affichées les applications qui sont en mémoire, cliquez sur un nom de programme avec le bouton de droite puis sur Refresh avec celui de gauche. Vous verrez que tout en bas apparait le nom de fichier pecompact.exe. Cliquez dessus avec le bouton de gauche puis de droite, cliquez ensuite sur Dump (Full) avec le bouton de gauche. Là entrez le nom que vous voulez attribuer au fichier. Pour mieux quivre on va quand même l'appeller 123.exe puis on fait OK. c'est un fichier exe? Ok, alors on peut le lancer ! faites donc !

Paf! ca plante, c'est tout à fait normal. Vous verrez mieux en regardent ca taille, ca ne pese que quelques kilo-octets. Ce ne sont en fait que les strings-data avec une entrée/sortie d'executable pour être desassembler, avec WinDasm par exemple. On le desassemble, c'est très rapide. Maintenant on peut voir tous les strings data avec leurs adresses mémoire ce qui est très important pour localiser le(s) octets(s) à patcher en mémoire.

Pour patcher des octets en mémoire c'est compliquer et il existe plusieurs méthodes :

  1. Le loader : Comme sont nom l'indique, il va démarrer le programme cible en placant les octets à modifier dans le buffer mémoire de façon à patcher les octets. Cette méthode est très efficace mais sensible au variation et peut rendre la machine instable si elle est mal utilisée. On la réservera surtout pour debuter et pour faire des essais.

  2. Le patchage : Plus compliqué que l'utilisation d'un loader mais infiniment plus efficace. En implementant directement le loader dans le fichiers cible en patchant notre propre code via Hiew. Cette méthode est sans doute la plus classe mais elle requiert une certaine rigeur sinon, ca plante :)

Tout ca c'est bien beau, mais voilà... Dans certains cas les octects à modifier ne se trouvent pas à proximité des strings datas. Il faut donc purger tout le code qui est en mémoire et pour cela il faut retourner dans les options de ProcDump, aller dans les options, cocher Merge code into a unique section, faire Ok puis la même operation que pour voir les strings :) Maintenant on peut voir tout le code source, WinDasm ne bloque plus dès les premieres lignes!! :)

Voilà, le mini mode d'emploi de ProcDump touche à sa fin. Je pense que sa devrais aller pour un debut :) Je vais maintenant vous expliquer le fonctionnement de base de chacain de ces outils.

 

Le loader :

r!SC's Process Patcher, s'il ne devait en avoir plus qu'un ca serait lui. Simple et efficace, il prend en compte pas mal de protections PE, est asser stable et se parametre grace à un script, redoutable :)

Pour commencer on va se faire les dents sur un tout petit probleme dans le programme PE Compact v1.x. En effet, quand on va dans About, il est affiché dans la fenêtre Registererd To: Unregistered!, pas très acceuillant... C'est pourquoi on va le virer.

Pour se faire, recupérez le fichier 123.exe que l'on à fait avec ProcDump et désasemblez-le avec WinDasm. On va dans les strings data et on cherche en bas de la liste "Unregistered!". Une fois trouvé on verifie s'il n'y en a pas plusieur en double-cliquant une seconde fois sur "Unregistered!". Ok c'est bon, il est le seul, ca va nous facilité la tâche. Je vous previens tout de suite, j'ai pris la version 1.40 beta 1 de PE Compact,les adresses peuvent ne pas correspondre mais le principe et la securité restes les mêmes :)

Ok, on est dans WinDasm et il nous donne ca :

* Possible StringData Ref from Code Obj ->"About PECompact"
                                  |
:00404DA1 	6844A24000              push 0040A244
:00404DA6 	FF7508                  	push [ebp+08]
:00404DA9 	E8352D0000             	call 00407AE3
:00404DAE 	6833B24000              push 0040B233
:00404DB3 	680C040000              push 0000040C
:00404DB8 	FF7508                  	push [ebp+08]
:00404DBB 	E8F92C0000             call 00407AB9

* Possible StringData Ref from Code Obj ->"PECompact v1.40b1, "
                                  |
:00404DC0 	6808B24000              push 0040B208	
:00404DC5 	6853040000              	push 00000453 
:00404DCA 	FF7508                  	push [ebp+08]
:00404DCD 	E8E72C0000             call 00407AB9

* Possible StringData Ref from Code Obj ->"Unregistered!"
                                  |
:00404DD2 	6854A24000              push 0040A254	<< l'adresse d'affichage
:00404DD7 	6834040000              	push 00000434	<< on pousse le texte dans la pile
:00404DDC 	FF7508                  	push [ebp+08]
:00404DDF 	E8D52C0000             call 00407AB9	<< on affiche le texte
:00404DE4 	33C0                    	xor eax, eax
:00404DE6 	5E                      	pop esi
:00404DE7 	5F                      	pop edi
:00404DE8 	5B                      	pop ebx
:00404DE9 	C9                      	leave
:00404DEA 	C21000                  	ret 0010

Vu la tête du "listing" il est clair que l'on doit supprimer le push 00000434. Je vais maintenant vous montrer le script qu'il faut utiliser pour activer cette modification dans le loader :

O=Pe140bcrk.exe:
F=PECompact.exe:
p=404dd7       /68,34,04,00,00	/68,34,00,00,00:
$

Voilà, vous avez compris? En fait O= le_nom_du_loader, F= le_nom_du_fichier_cible, p=l'adresse /la_ligne_d'origine /la_même_ligne_mais modifiées.

On pourrai aussi optimiser le script en faisant :

O=Pe140bcrk.exe:
F=PECompact.exe:
p=404dd9		/04	/00:
$

Voila, dans le script, ne laisser pas plus d'un espace entre les differentes parties, sinon erreur.. Vous pouvez maintenant enregistrer ce fichier au format *.rpp dans le repertoire où se trouve rpp.exe, on va l'appeller Pe140bcrk.rpp. Maintenant executez le fichier rpp.exe et choisissez le fichier Pe140bcrk.rpp. Si tout à bien été fait un message de réussite apparaitra, et si un d'erreur se produit et bien c'est que vous avez fait une faute de frappe ;)

On peut maintenant placer le fichier Pe140bcrk.exe dans le repertoire où se trouve PE Compact 1.40b1 et le demarrer. On va dans About et là, c'est magique! le "Unregistered!" n'est plus là! ;)

Et oui, en remplacent le 68,34,04,00,00 par 68,34,00,00,00. On a remi le push à 0, c'est comme si rien ne s'y trouvais, le texte s'en trouve effacé.

C'est tout! Pour le reste je vous laisse chercher et la solution pour déplomber completement PE Compact 1.40b1 en attendant le prochain n° de MemenTo ;) En tout cas le principe reste le même pour pas mal de programmes.

 

Conclusion :

Comme vous avez pu le voir que les fichiers compactés sont un sujet très interressant et il on va le traiter sur plusieurs numéros...Donc rendez vous pour la suite dans le M4

En tout cas soyez fort, vous verrez que comme tout, c'est pas sorcier ;)

 

Conseils de derniere minutie :

  • Lisez bien ce tut ;)
  • Soyez patient si vous tracez un programme
  • Evitez les fichiers compactés et chiffrés avec des Packers comme ASPack ou PE-Shield dans un premier temps. Si possible exercez vous avec des programmes packés sous UPX ou PE Compact.
  • Apprennez l'assembleur ! Mes bouquins préférés sur le sujet sont enuméré a la fin du cours de Patch en ASM
  • Evitez de trafiquez en mémoire (avec un loader) un prog compacté, ca rend la machine instable est des résultats correct une fois peuvent être mauvais une autre. Par exemple, dans un prog on arrive à virer un nag en ayant fais pleins d'essai avant. On redemarre la machine puis le loader et là ça plante car le buffer n'a pas été modifier de la même façon qu'au moment des essais precedents....

 

Vala c'est tout! :)