SUJET

Crack de MapDesigner 2.0 pro

TYPE DE PROTECTION

Crypted ASPack, nag-screen, save désactivé

OUTILS UTILISES

UnAspack, procdump,W32dasm85, SoftIce, Hiew


 

Intro :

 

Ce crack requiert quelques bases en cracking mais le niveau reste assez faible et est idéal pour s’initier aux programmes cryptés.

Car oui ce  programme est crypté et c’est vraiment la seul difficulté pour le cracker et c’est ce qui donne l’intérêt de ce cours car sinon le schema de protection du programme est tout ce qu’il ya de plus classique (une variable detemine si l’on est enregistré et cette varaible est testé à differents endroits).

 

Je vous conseille de lires les cours de Christal et Teeji sur les exe crypte et packed, pour ma part je me suis largement inspire de celui de Teeji que je salut bien bas

 

Tout d’abord il est hors de question de décrypté ce prog de le cracker et puis basta….

Le but ici est de créer un patch qui permettra de cracker la version originale (crypté).

 

 

Voici comment s’exécute un programme crypté :

 

-         L’entry-point pointe vers les instructions qui vont servir à décrypter le prog

-         Le programme  se décrypte et se charge en mémoire

-         Une fois totalement décrypté, il saute vers les routines normales d’exécution du prog

   Rem : Un entry-point, point d'entrée en français, est une adresse virtuel relative correspondant à l'adresse de la première instruction que le programme doit exécuter. Cette adresse est inscrite dans le PE-Header de l'exécutable.

 

Phase 1 / Decryptage

D’abord comment sait-on que le programme est crypté ?

Il y’a plusieurs symptômes :

-         quand on désassemble le prog avec W32Dasm celui ci ne contient aucune ressources, ni import, ni strings datas references
-         du coté des sections sous ProcDump une se nomme .aspack
-         et si vous testez ce prog avec un sniffeur de pack celui ci vous rapportera : crypted by ASPack

On pourrait chercher les bytes a patcher uniquement sous softice qui lui lit le prog en memoire donc décrypté, mais on va se servir de W32Dasm et de ses précieuses datas string références mais pour cela va falloir les decryptés et les rendre lisibles….

On a le nom du crypteur, suffit de prendre son decrypteur et voilà le boulot…. La plupart des crypteurs possèdent leur descripteur que vous pourrez trouvez aisément sur des sites de cracks outillés.
On décrypte le prog à  l’aide de UnAspack et on obtient un zoli exécutable de 1140 ko décrypté contre 421 (crypté).
Sous proc-dump on va éditer les
caractéristiques des sections afin de rendre les ressources lisibles.( c’est ce qui empêche W32Dasm d’obtenir le code, les strings datas références, les imports ,etc.. )

-         on lance ProcDump
-         on clike sur PE editor
-         on select notre prog
-         et on clike sur sections
-         on peux voir que toutes les sections ont comme caractéristique C0000040
-         On clike droit sur les sections .CODE et .DATA on fait édit section
-         Dans section caractéristiques on met  E0000020 à la place de C0000040
-         On clike sur ok , et on quitte Proc-Dump

 

Phase 2 / Le Crack

Voilà, Maintenant on prend W32Dasm85 je dis bien 85 car c’est la seul version qui ne soit réellement efficace en ce qui qui concerne les Strings Datas References.
Si vous essayé avec une version plus recentes vous n’en  trouverez que tres peu et aucune interressante tandis que sous la version 85 ou 6 vous aurez droit à une belle liste ou vous pourrez trouver pas mal de strings dont une particulierement interressante : [unregistered version] : Le pitit mot dans la barre de titre…

On click sur cette string et on obtient 2 references : Voici la premiere

 On voit que celle ci est appelé par un jump à l’adresse 4D533F, on va voir a cette adresse et on obtient ceci :

Ici on voit clairement qu’une adresse mémoire : 4E1128 (qui représente une variable de type boolean) est comparé avec 00 et si la variable = 00 on saute vers la routine du code qui nous déclare unregistered.
On va effectuer une recherche sur cette variable : 4E1128 , on obtient plusieurs références, Ce qui nous intéresse c’est les endroit ou cette variable sera initialisé donc avec les instructions MOV. On obtient 4 references dont une ou elle initialisé avec 01 et  trois  ou elle est initialisé avec 00

Sachant que 00 nous envois vers unregistered , il va falloir modifié ces trois adresses afin que la variable soit initialisé avec 01.
On réalise cette opreation sous Hiew :

-         on fais F4 puis Decode
-         F5 pour goto et on tape les adresses que l’on à trouvé (si vous tapez l’adresse que vous avez lu dans w32dasm n’oubliez pas le point devant celle-ci, exemple pour la premiere :  on tape .4D2D54, si vous utilisé l’offset le point ne doit pas figurer exemple pour la meme : on tape D2154 )
-         F3 pour edit et F2 pour passer en mode assembleur
-         On remplace dans cette instruction le 00 par 01
-         Ensuite F9 pour valider
-         On fait pareil pour les 2 autres adresses

On lance le programme, et la on est registered, Le nag-screen à sauté et l’on peut sauvegarder alors que cette option n’etait pas active.
Et voilà le programme est cracké.

Phase 3 / Realiser le pacth

Maintenant comment faire pour realisé un patch qui pourrait modifié l’exe crypté et non pas celui décrypté ( ce qui serait trop simple )
La on à plusieurs choix , si vous parvenez a trouver le même crypteur utilisé que pour l’original de ce programme, il vous suffira de re-crypté votre version  cracké et ainsi de comparé la version non-cracké avec la version cracké (les deux cryptés sous le même cryptage : ASPack 2.00) afin de determiner les offset à modifié  anisi ke leur valeur.
N’ayant pas trouvé cette version d’ASPack et comme ca serait aussi trop simple on va procéder autrement :

-         on va rechercher un endroit inutilisé dans l‘executable (crypté) afin de pouvoir y ajouter des instructions

-         on va rechercher sous SoftIce le moment (l’adresse) ou au demmarrage le programme s’est totalement decrypté en mémoire

-         on va placer un jump à cette adresse qui sautera vers des instructions que nous allons ajouté dans l’espace libre

-         on va ecrire nos instructions qui modifieront le programme qui sera alors sous la forme decrypté

-         à la fin de celles-ci on replacera un jump qui retournera au code normal afin de suivre le deroulement du prog

Rechercher un endroit inutilisé :

Pour cela on se sert d’un éditeur hexadecimal classique, comme HexWorkShop.
On ouvre le programme (crypté je rappelle) et on cherche un espace inutilisé assez grands pour contenir quelques lignes de code ; Les endroits libres sont les séries de 00 dans le fichier.
On note l’adresse ou commence cette suite de 00, c’est la que l’on va ajouter nos instructions.

Pour ce tutorial j’ai pris choisi l’offset 69070 .

Rechercher sous SoftIce le moment (l’adresse) ou le prog a fini de se décrypter

C’est la partie la plus longue et la plus subtile.
En effet, le programme va se décrypté en mémoire et une fois cela accomplie il va sauter vers son déroulement normal.
C’est ce moment matérialisé par une adresse que l’on doit trouvé, pour cela l’expérience et une bonne analyse sont les seules armes dont vous disposez.

Le programme se decypte par une suite d’instructions qui ont été ajoutés lors de son cryptage. Ce sont en fait une ou plusieurs boucles qui vont parcourir le listing en y remplaçant les valeurs Hexa crypté par elle qui represente le listing original decrypté . Une fois le listing totalement décrypté on sort de la boucle et on saute vers le debut du programme qui va s’executer normalement.

Par l’intermédiaire du Loader de soft-ice on lance la programme, On atterrit à l’endroit ou le decryptage va commencé on à plus qu’a tracer avec F10  jusqu'à trouvé le saut qui détermine la fin du décryptage.

Il y’a pas mal de signes, différents selon le type de cryptage, qui nous aident  à repéré le début et la fin de cette séquence de décryptage :

Bien sur il y’a beaucoup de variantes mais ce n’est pas le but de ce tutorial de faire un listing de toutes les  techniques employé.
Pour Résumer en gros et faire une généralité la plupart commence par sauvegarder tous les registres sur la pile par l’instruction
PUSHAD , ensuite on parcours des boucles facilement identifiables puisque les instructions se répètent plusieurs fois, et on fini par restaurer les registres par l’instruction POPAD et tout de suite après on saute vers le déroulement classique du prog.

 C’est exactement ce que fais ce Programme :

Le loader break sur la premiere instruction qui est  PUSHAD.
Il parcours ensuites quelques boucles (j’ai pas compté mais 2 ou 3)
Apres il  restaure les registres avec POPAD
Et saute vers le debut des instructions de d’execution du prog

On note cette adresse ainsi que l’adresse ou sautera le jump :

005314F4 jnz 005314FE

Placer un jump à cette adresse afin de sauter vers nos instructions

Sous Hiew  cette instruction est sous cette forme la (les adresses ont été convertis) : .005314F4 jne  .00067EFE (c’est cette adresse converti k’il faudra indiké)

On remplace donc celle-ci par :

005314FA jmp 69070    // 69070 étant l’offset ou commencera nos instructions

 

Ecrire nos instructions qui modifieront le programme qui sera alors sous la forme decrypté

Toujours sous Hiew on se rend à l’offset 69070

Et on tape nos instructions qui vont modifier les 3 adresses que nous avons relevé pour réaliser le crack :

MOV al,01                   // place dans al la valeur 01 (la bonne valeur qui nous met registred héhé)
MOV [4D2D5A],al      // remplace l’adresse 4D2D5A le 00 par le contenu de al => 01
MOV [4D2D63],al
MOV [4D2D6C],al
JMP   67EFE                  //
Saute vers le deroulement normal du prog

 

Y oila, on test et c Registered,

Ne reste plus avec l’aide d’un patcheur de créer un Patch en comparant le fichier original et celui que nous venons de faire Et nous aurons realiser un Vrai patch qui modifiera bien l’exécutable crypté.

Sur ce, la pratique pour ce genre de crack est primordiale et c’est par l’exeprience que vous aurez de plus en plus de faciliter à contourner ce genre de protection qui à tendance a se généralisé.