Disponible sur : http://order.kagi.com/cgi-bin/store.cgi?storeID=3BJ&&lang=fr
Leçon: Décompression UPX Automatique , manuelle, modification saut et sérial Fishing pour le final. |
Outils: (Language 2000), Pe-Scan, WinHex, Wark, Pe-Explorer, DeDe, OllyDbg, Winhex, Import REConstructor V 1.6 |
Protections: Compressé UPX, Time Limit, Nagscreen mais possibilité de s'enregistrer |
Voici encore un tutorial sur un soft dont l'auteur (un petit marrant, vous comprendrez plus loin ..) a cru encore à une protection infaillible !
Plusieurs protections sont présentes mais, prises dans l'ordre chronologique, c'est du gâteau et on s'amuse ...!
Après avoir installé le soft qui est limité à 15
jours, on s'amuse un peu avec et quand on est décidé...on avance
la date du Pc d'un mois, par exemple.
Et ça marche plus faut s'enregistrer ! J'ai toujours pour habitude de
remettre la date exacte et quand j'ai ré-essayé de relancer le
soft un joli nag !
On clique sur Ok et on n'a notre boîte d'enregistrement...
On essaie en remplissant les champs et on se rend compte qu'il
n'y a pas de réactions du soft ....bizarre !
On va attaquer le problème de suite.
Si vous êtes observateur (qualité essentielle du
bon crackeur !) vous aurez sûrement remarqué le faible poids en
octets de l'exécutable ! 392 ko.
C'est déjà pas "normal" par rapport aux autres softs
rencontrés habituellement.
Comme toujours, je vous recommande d'utiliser les outils appropriés et, avant de se lancer tête baissée dans un désassemblage avec l'un ou l'autre outils, recherchons d'abord à qui nous avons à faire avec Pe-Scan car Language 2000 ne nous donne rien de clair.
Pe-Scan nous confirme ce que l'on pouvait craindre en regardant
le poids du fichier. Il est compressé par UPX version 0.8 à 1.23
!
Attention, cela peut-être un piège pour le crackeur et il faut
vraiment s'assurer que c'est bien UPX qui est le coupable de la compression
et/ou du cryptage !
Ceci n'a évidemment rien à voir avec un compactage
sous Winrar ou Winzip, etc ...Et chaque packer du simple au complexe aura sa
propre technique de compression/cryptage et inversément !
Le packer simple, comme ici UPX, ne fait que compresser le code sans ajouter
une protection supplémentaire et à un niveau de compression plus
efficace.
Le packer complexe comportes en plus d'une routine de compression une routine
de cryptage propre, soit par défaut ou par clef, plug-in etc...
Mais cela est une autre histoire ...avant de se mesurer aux complexes tentont
de comprendre un packer simple.
Utilisons un éditeur hexa, WinHex par exemple, et nous voyons en ouvrant le fichier:
et plus
loin ...
Nous avons bien à faire à UPX 1.23 (mais attention, il est toujours loisible aux programmeurs d'éditer ces données et vous aiguiller sur une fausse piste) ici ce n'est pas le cas, notre packeur/compresseur est bien défini.
Si on arrive parfois à désassembler dans Windasm ce type d'exécutable compressé et/ou crypté, disons packé pour être plus juste, le listing sera épuré de toutes les stringdata's, les imports et exports et/ou incompréhensible. De la, découle une constatation, cela limite le nombres de crackers aptes à s'attaquer à ce genre de "protection". Ce qui est remarquable, par contre, c'est la possibilité de diminuer le poids du programme. Gros avantage pour le transfert de fichier sur le net !
Comment ça fonctionne:
Dans le cas d'UPX qui n'est qu'un compresseur, le programme UPX compresse le
soft du créateur . Il crée une nouvelle section contenant le décompresseur
qui sera exécutée en priorité lors du lancement du soft
compressé car l'Entry Point EP ou OEP du soft original a été
modifiée pour que le décompresseur s'éxécute en
premier quand on veux utiliser le soft. Lors du lancement, lorsque le dépackeur
à terminé son oeuvre le programme résidant dans la mémoire
prend la main et s'exécute.
Qu'est ce qu'une section:
C'est une zone qui contient des données, du code, des resources, ...La
section possède des caractéristiques ou flags mais, regardons
plutôt concrètement la chose:
Comme un nouvel outil vient de sortir,WARK, on va utiliser une de ses composantes.
Après avoir ouvert WARK, dans le menu PE Editor/open file ...
Choisissez notre soft, et ouvrez-le.
Vous avez d'abord un fenêtre Main Info qui s'ouvre
qui nous renseigne sur l' Entry Point (EP ou OEP) 00138860, Image
Base 400000, base Of Code D8000 et tient, le nombres de sections, ici, 3.
C'est bien tout ca, mais qu'est ce que cela signifie? En regardant ces infos,
on peut dire que la première instruction du code sera:
400 000 + D8 000= 4D8000 c'est à dire Image base + Base Of Code.
Mais aussi que l'entry point du soft dans un débuggeur/désassembleur
sera à l'adresse 400 000 + 138 860 (Image base + Entry point) soit 538
860.
Olly nous confirme cela ...
Ces informations seront importantes plus tard, pour le décompressage en manuel ou Manual Unpacking !
On clique à gauche sur Section et
Voilà nos 3 sections avec 6 colonnes,
Dans la première le nom de la section.
Ensuite Vaddr ou aussi virtual offset , c'est l'adresse en mémoire du
début de la section.
Vsize la taille utile de cette section.Cela veux dire qu'il y a dans la premiere
section (UPX0) 0D7000 bytes de données
Phys Addr l'adresse physique (réelle)
Phys Size la taille physique (réelle)
On peut aussi regarder la taille de la section UPX1 qui est de D8000 + 60A00
= 138A00 et que la prochaine section démarre en 139000
Characteristiques ou flags qui donne le droit ou non à réaliser certaine choses ...mais lesquelle ?
Dans Wark, cliquer gauche sur UPX0 pour sélectionner la section, ensuite clic droit/ Edit section Header pour obtenir ceci :
on clique
sur Edit et ...
Nous voyons en clair ce que signifie la caractèristique
d'une section ici E0000080 signifie que cette section est :
Executable, readable, writeable et contient des uninitialized data.
A l'occasion pour info, sachez que Windasm n'accepte pas de désassembler
des sections dont les flags ne commençent pas par E0 ou 60 !
Jouez un peu avec les cases d'options et regardez la caractéristique évoluer suivant vos actions !
Si vous essayez de débugger le soft tel quel avec SoftIce
ca ne fonctionnera pas ! Il faut changer la caratéristiques en E0000020
ou certains utilisent aussi E00000E0 soit pour E0000020 Exécutable, readable,
writeable et ...Contains code ! (Décochez Contains unitialized data)
ou pour
E00000E0 Exécutable, readable, writeable et ..Contains code, Contain
initialized data et Contain uninitialized data.
Toutes ces informations seront utiles pour le manual Unpackink
En conclusion, nous aimerions bien avoir un listing "habituel" pour étudier notre soft ! Donc, il faudrait trouver l'endroit ou le dépacker passe la main au soft car à ce momment le programme est totalement décompressé en mémoire et va se lancer. Copier (dumper) la zone mémoire utilisée sur le disque dur afin d'avoir un exécutable qui est désassemblable et qui possède des stringdata's, mais pas forcément les imports et les exports !
2 Solutions, utiliser un outil prévu pour décompresser CE type de packer ou le faire manuellement.
Pour rappel nous notons quelques informations qui nous serviront
plus loin mais déjà trouvée ci-dessus.
L'Entry Point OEP = 138860 L'image
base 00400000 Base
of Code 000D8000
1) Il faut trouver l'entry point du programme décompressé, nous pouvons utiliser ici PEiDentifier V 0.8, on ouvre notre fichier original et on n'a ceci:
Dans menu on clicke sur OEP module pour avoir comme résultat:
si vous
voulez vérifier c'est exactement ce que nous avons plus bas dans le Dump
Automatique !
Avec UPX on peut retrouver cette adresse dans le listing désassemblé à la fin de la routine de décompression ...
ici la fin
de la routine avec le POPAD et le jump vers l'EP réel du prog décompressé.
2) Création du Dump:
Il faut que notre programme une fois décompressé
ne se lance pas et tourne en mémoire pour pouvoir dumper la mémoire
dans un fichier sur le disque dur.
Le programme chargé dans Olly, nous allons poser un break
sur le jump à l'adresse 5389CB, on va lancer le soft qui va s'arrêter
sur notre break.
On enlève le break (avec F2), on avance d'un pas avec F8, nous sommes
à l'EOP du programme, si on continue le traçage, nous sommes dans
le soft décompressé.
Nous allons modifier cette ligne de code pour que le programme
tourne sur lui-même en remplaçant le push EBP (55) en JMP SHORT
busitran.004EE984 (EBFE)
Ctrl-E dans OllyDbg et on modifie comme ci dessous.
devient
Ceci fait, on va lancer le programme avec F9. C'est parti, il tourne en mémoire, Olly vous indique Running. A ce stade il ne faut pas trop tarder car on risquerait une saturation de la mémoire. On ouvre WARC, on cherche notre programme qui tourne en mémoire...
On clique droit, Dump Full, le nom du fichier avec l'extention .exe et si tout s'est bien passé vous avez :
On refait un click droit sur le soft et Kill Process pour arrêter le soft qui tourne en mémoire. A ce stade nous avons un fichier qui n'est pas exécutable et de plus notre EOP n'est plus correcte, c'est toujours l'ancienne EOP donc on ouvre WARC, PE Editor, notre fichier dumpé et on remplace 138860 notre ancienne EOP par la nouvelle pour avoir:
Save pour sauver la modification, et examinons les sections en clickant à gauche sur section:
Tant que nous y sommes nous allons modifier le Flag de la première section E0000020 ou E00000E0. Ceci fait nous allons remettre les instructions que nous avons changé pour faire tourner le soft en mémoire sur lui-même à la ligne de l'EOP soit ici EE984. Ouvrons le soft dans Winhex et rendons nous à l'offset EE984
qui devient
on sauve et ferme winhex.
Le fichier n'est toujours pas exécutable car il manque la table des imports
ou IAT.
3) Re-construction de l'IAT
Nous allons utiliser ici Import REConstructor V 1.6 Final pour
reconstruire la table des imports.
On lance le soft original (compressé) et ensuite ImpRec ou l'on va "attacher"
le programme compressé, dans la fenêtre inférieure (LOG)
vous allez voir défiler la liste des dll utilisées par le soft.
Nous changeons a présent l'OEP afin que le programme construise une table
imports correctes pour notre fichier dumpé précédemment.
On modifie l'OEP et ensuite on clique sur IAT AutoSearch
et le soft nous indique que l'on peut continuer la procédure
en cliquant sur Get Import
on s'exécute et nous avons ceci ...
Nous voyons que toutes les fonctions utilisées par notre
soft on été trouvées et il ne reste plus qu'à fixer
notre table sur notre fichier dumpé en faisant Fix Dump.
Faisons le choisisson notre fichier dumpé et nous avons:
Vous avez un exécutable qui tourne, avec stringdata's et surtout décompressé ! Félicitations.
Il vous reste à passer à l'étude de la suite des protections à savoir la modification du saut.
Utilisations d'un outil pour décompresser Businness Translator. PE-Explorer 1.93.
Ce shareware(30 jours d'utilisations) non seulement permet de
désassembler un soft, editer les resources (icônes, boîte
de dialogue, etc) mais, il possède un petit plug-in très utile
qui décompresse les exécutable compressés UPX et sauvegarde
(à votre demande) un fichier bien propre avec stringdata's, import et
export des fonctions
Il est facilement "transformable" pour une utilisation à long
terme pour ceux qui désire approfondir ses possibilités.
On ouvre Pe-Explorer, ensuite Ctrl-O ou Open File, on cherche
notre cible et hop...le soft travaille quelques secondes et s'arrête.
A ce stade, le programme est décompressé en mémoire, il
ne reste plus qu'à le sauvegarder en faisant Ctrl-S ou Save File, choisir
comme nom BusyTran2.exe, p.ex!
On possède à présent un fichier de 1,18 Mo ! Ouvrons-le
rapidement avec WARC comme tout à l'heure et nous voyons ceci ...
Vous voyez les différences ! L'entry point à changé et bien d'autres chose ....plus de sections UPX0 et UPX1 ! Pas mal , Pe-Explorer!
Bon, on recommence en scannant avec Language 2000 ce nouveau exécutable et ...
C'est
du Delphi !!
Donc en ouvrant dans Windasm on aura sûrement pas grand
chose dans les stringdata's ! (Essayez vous verrez) On utilise alors l'outil
adhoc DeDecompiler !
On ouvre le soft dans DeDe et c'est du Delphi 6 relativement récent.
Notre point de départ est notre Nag du début ...
On fouine dans les Procédures et plus particulièrement TRegistration attire notre attention et FormCreate
On ouvre cette procédure pour découvrir le code assembleur correspondant ...et :
fort de
ces infos nous allon utiliser OllyDbg et nous rendre en 4E017E.
On ouvre le soft dans Olly, Ctrl-G notre adresse et hop ...
On aurais pu chercher "Alert" dans les stringdata's de Olly mais vaut mieux utiliser de temps en temps DeDe pour pas perdre la main !
Nous remarquons notre phrase de Nag et en remontant dans le code
en 4E0128 un Jump, un test, un Call ! C'est ce Call qui vérifie la date
!
On vire cette protection en modifiant le 0F84 en 0F85 ! Donc dans Olly Ctrl-E
et on edite ! Clic droit, Copy to exécutable/all modifications.
Dans la nouvelle fenêtre D qui s'ouvre, save file busiTran3.exe. On exécute
le nouveau fichier et la première protection vient de tomber !
Nous avons maintenant, notre fenêtre pour l'enregistrement qui est pleinement fonctionnelle et quand on tente le coup avec un Nom et un sérial bidon :
Dans nos stringdata's de OllyDbg on recherche "Please" et on trouve effectivement:
On double clic dessus pour retrouver cette adresse dans la fenêtre du CPU ou du code désassemblé. Et on remonte dans le code pour trouver l'entrée de cette méchante routine qui, est appellée par 11 Calls !
On se rend en 004DFA20, et on voit ceci ....
Le petit marrant ! Il teste des noms de Teams ou crackers bien connus! Et nous alors ? On compte pas ?
En descendant dans le code, on trouve:
On remarque notre phrase de félicitation précédée
par un Jump si egal, un test sur un des registres et notre call qui génère
sûrement le VRAI sérial.
On pose un break en 4DFBB1 et on exécute le soft, notre boîte d'enregistrement
apparaît et on remplit le champ Registration Nom avec ici eXXe ... break
et
Sérial dans EAX comme prévu:
REGISTRATION SUCCESS FULL !!
REMERCIEMENTS à Eloo, Mimas, Lise Grim, Anthrax, The_Analyst et ceux que j'oublie de FFF ainsi que ceux que je n'ai pas eu l'honneur de connaître pour leur aide fort précieuse.
eXXe