Businness Translator 4.0 tutorial by eXXe 7/08/03.

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.

Decompression Manuelle ou Manual UnPacking

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.

 

Décompression Automatique

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!

Modification du saut de contrôle de date:

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 ?

Allez hop! Sérial Fishing:

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