Crack in France
par pifoman

 
 

Ce cours est un reflet fidèle du cours intégré au crack de ma création de Gif Movie Gear 4.0.2 fr

 

INFOS SUR LE CRACK

 

Nom du progGif Movie Gear 4.0.2
Editeur

http://www.visicommedia.com/fr/

Téléchargeable

http://www.visicommedia.com/fr/

Date du progJeudi 15 juillet 2004
Date du crackJeudi 30 septembre 2004
Réalisé parPifoman
Url site

http://tresordeguerre.free.fr

Url redirectionhttp://www.geocities.com/mitonnes

 

COMMENTAIRES SUR LE PROGRAMME

 

    Gif Movie Gear est un logiciel de création d'animations GIF extrêmement intuitif, simple et facile d'utilisation. Gif Movie Gear vous procure tous les outils pour créer des animations GIF rapidement et facilement.

    Ses puissantes fonctions d'optimisation permettent de réduire la taille de vos fichiers de façon optimale. De nombreux formats de fichiers d'importation et d'exportation sont supportés dont Photoshop et Flash.

    La simplicité, la performance et la polyvalence font de Gif Movie Gear le logiciel par excellence pour créer toutes vos animations GIF.

 

LIMITATIONS

 

    Gif Movie Gear 4.0.2 :

    1 - Nag-screen à la fermeture du programme(+1 fois au 1ier démarrage).
    2 - Passé 30 jours d'évaluation blocage du programme.
    3 - Passé 30 jours d'évaluation une fenêtre nous invite à commander.
    4 - Menu aide->A propos de GMG affiche la version expire dans ... jours.

 

LES OUTILS

 

w32dasm 8.9

Pour désassembler le progamme (transformation en langage d'assemblage) et pour trouver les string data references nécessaires pour élaborer le crack.

WinHex 10.2

Pour éditer l'exécutable et modifier certains octets dans le but de le cracker. On cherche l'offset dans w32dasm 8.9 qui est impliqué dans la protection (en sélectionnant la ligne et en regardant la barre de statut où c'est marqué @offset) et on utilise ce même offset dans WinHex (avec le raccourci ALT G) pour effectuer physiquement la modification à l'endroit repéré par l'offset trouvé dans w32dasm.

 

ASSEMBLEUR

 

Offset
 Déplacement depuis le début de la zone de code d'un programme.

EB
      Code hexadécimal correspondant en assembleur à un saut inconditionnel (jmp).
             On saute tout le temps vers un endroit du code.

90
      Code hexadécimal correspondant en assembleur à une instruction à rien (= nop = No OPeration). 

 

LE CRACK

 

          Détail des modifications de Gif Movie Gear 4.0.2

OctetAdresse OffsetOriginalCrackéEffet
1

0045907B

5907B

0C00On force la routine d'enregistrement pour tout utilisateur.

 

ANALYSE  DU  PROGRAMME

 

        MOVGEAR.EXE

 

         Aujourd'hui on s'attaque à gif movie gear 4.0.2 qui crée des animations gif. Dans le logiciel il existe une boîte d'enregistrement dans le menu aide->s'enregistrer maintenant.


         Notre objectif : on va chercher à atteindre la fonction qui vérifie si on est correctement enregistré et craquer la protection pour pouvoir entrer n'importe quoi et s'enregistrer.

       Pour cela entrons un nom et un code bidon dans la boîte d'enregistrement. Par exemple pour nom pifoman et comme code 123456.On valide par OK et là un message nous affiche :
"Les renseignements que vous venez d'entrer sont erronés. Vérifiez l'orthographe."

         On va donc désassembler le programme dans w32dasm et regarder où se trouve cette chaîne dans le programme.Pour cela on inspecte les string data references dans w32dasm.On trouve 1 seule occurence de la chaîne "Les renseignements que vous venez d'entrer sont erronés. Vér". La recherche nous mène ici :

 
* Referenced by a (U)nconditional or (C)onditional Jump at Address 00459549(C)
 
:004596186A30 push 00000030
 
* Possible Reference to String Resource ID=40213: "Renseignements d'enregistrement invalides"
 
:0045961A68159D0000 push 00009D15
 
* Possible Reference to String Resource ID=40212: "Les renseignements que vous venez d'entrer sont erronés. Vér"
 
:0045961F68149D0000 push 00009D14

         C'est le saut condtionnel en 00459549 (C pour conditional) qui nous a emmené ici. Allons à l'adresse 00459549 et nous voyons ce qu'il y a

:0045953FE8CCFCFFFF call 00459210
:0045954483C408 add esp, 00000008
:0045954785C0 test eax, eax
:004595490F84C9000000 je 00459618
 

         Intéressant ce code asm.On voit un call dans lequel se fait certainement la vérification d'enregistrement suivi d'un test sur le contenu du regsitre eax à la suite duquel on saute (je 00459618) vers le message nous disant que les renseignements entrés sont erronés.

         On lance le debugger de w32dasm par CTRL L et on met un bp (breakpoint) sur l'adresse 0045953F en sélectionnant cette adresse et en appuyant sur F2.On démarre le débugger par F9 et direction la boîte d'enregistrement dans gif movie gear qui vient juste de s'ouvrir.On entre le nom pifoman et le code 123456.Là w32dasm break (il s'est arrêté sur l'adresse 0045953F car l'exécution du programme a nécessité l'exécution de la ligne de code située à l'adresse 0045953F.On fait F7 pour descendre dans le call suivi de plusieurs F8 et voir comment est mis à jour le registre eax.

         Arrivé sur la ligne

:00458EF08B442404 mov eax, dword ptr [esp+04]


        Si on fait F8 on voit que dans la fenêtre des registre on voit que pifoman est mis dans le registre eax (cochez le bouton eax dans la grande fenêtre du debugger qui s'était affichée quand vous aviez fait CTRL L). En effet à partir de l'adresse eax+00000000 vous voyez écrit en ascii à droite pifo (bouton du mode dword pressé).En fait le contenu de l'adresse eax+00000000 (qui se note [eax+00000000]) est le code hexadécimal 70 qui correspond à la lettre p de pifoman et ainsi de suite pour eax+00000001,eax+00000002...

         Voyons ce qui se passe ensuite: 

:00458F038A08 mov cl, byte ptr [eax]
:00458F05880C02 mov byte ptr [edx+eax], cl
:00458F0840 inc eax
:00458F0984C9 test cl, cl
:00458F0B75F6 jne 00458F03
:00458F0D53 push ebx
 

         Dans cette portion de programme gif movie gear lit toutes les lettre de pifoman en bouclant sur l'adresse 00458F03.La lecture se fait en incrémentant la valeur de l'adresse de eax (inc eax). Incrémenter ça veut dire ajouter 1 à une valeur. La boucle s'arrête dès que le test sur le registre cl rend 0.En effet le test en asm correspond à un "et logique" sur 2 opérandes ici cl et cl.Si cl qui est un registre sur 8 bits vaut 00 alors on a donc comme résultat 0 (00 et 00 ça donne toujours 0).

         Dans ce cas l'indicateur ZF (Zero Flag) est mis à 1 et le jne (saut si ZF=0) ne s'exécute plus et on continue à l'adresse 00458F0D.

         Rappel d'asm : il y a dans le micro processeur un registre nommé le registre flag qui est composé de 16 bits (valeurs : 0 ou 1).Chacun de ses bits est appelé un indicateur.Le bit n°6 correspond à l'indicateur ZF.Celui -ci est mis à jour par le programme et prend la valeur 1 si le résultat d'une instruction arithmétique a donné 0.

         Note : si vous regardez dans la grande fenêtre du debugger vous avez après pifoman le code hexadécimal 00.C'est cet octet qui va terminer la lecture du nom entré. En effet 00 va être mis cl comme chacune des lettres auparavant mais cette fois-ci le test va rendre 0 et ZF va passer à 1 ce qui va annuler le saut en 00458F0B.

         Voila maintenant vous savez comment le programme lit le nom entré dans la boîte d'enregistrement.Voyons la suite du code. On arrive ici
 

:00458F118D442420 lea eax, dword ptr [esp+20]
:00458F1550 push eax
 
* Reference To: USER32.CharUpperA, Ord:0034h
 
:00458F16FF1524B34700 Call dword ptr [0047B324]
:00458F1C8A442420 mov al, byte ptr [esp+20]
 

         Une fois que l'on est passé sur l'adresse 00458F11 on voir que pifoman est remis dans le registre eax (cliquez sur le bouton eax dans la grande fenêtre du debugger et regardez à droite de [eax+00000000]).Ensuite qu'est ce qui se passe ? Il n'y a qu'à lire les instructions.On met sur la pile eax (push eax).Cette valeur est ensuite récupérée comme paramètre de la fonction charUpperA du fichier user32.dll.Si vous faites GET API result dans la fenêtre qui s'est ouverte quand vous faites F8 sur la ligne de code d'adresse 00458F16 vous voyez que l'on a PIFOMAN en majuscule dans [eax+00000000] (on s'en aurait douté vu le nom de la fonction).

         Bon on a toujours pas vu dans les registres le serial que l'on a entré qui valait je le rappelle 123456.On continue avec des F8. On arrive ici

:00458F300FBE0E movsx ecx, byte ptr [esi]
:00458F3351 push ecx
 
* Possible StringData Ref from Data Obj ->"SBSHD244675433URAWRBMNXUDSAK"
 
:00458F3468A8AB4800 push 0048ABA8
:00458F39E832400100 call 0046CF70
:00458F3E83C408 add esp, 00000008
:00458F4185C0 test eax, eax
:00458F437405 je 00458F4A
:00458F458A16 mov dl, byte ptr [esi]
:00458F478817 mov byte ptr [edi], dl
:00458F4947 inc edi
 
* Referenced by a (U)nconditional or (C)onditional Jump at Address 00458F43(C)
 
:00458F4A8A4601 mov al, byte ptr [esi+01]
:00458F4D46 inc esi
:00458F4E84C0 test al, al
:00458F5075DE jne 00458F30
 

         Dans cette routine on voit si vous enfoncez le bouton esi dans la grande fenêtre du debugger que le programme recommence comme avant. Il lit toutes les lettres de PIFOMAN.C'est le jne 00458F30 en 00458F50 qui fait le bouclage vers 00458F30 avec un inc edi qui décale l'adresse de lecture de chacune des lettres du nom PIFOMAN. Comment je sais tout ça eh bien en faisant une série de F8 (debuggage ligne par ligne sans entrer dans les call mais en les exécutant quand même).

         En 00458F8C le programme lit une chaîne SBSHD244675433URAWRBMNXUDSAK caractère par caractère comme avant. Ca doit être sûrement une clé pour créer le serial.

 
* Possible StringData Ref from Data Obj ->"SBSHD244675433URAWRBMNXUDSAK"
 
:00458F8CB8A8AB4800 mov eax, 0048ABA8
:00458F91C644243900 mov [esp+39], 00
:00458F96C684248400000000 mov byte ptr [esp+00000084], 00
:00458F9E33ED xor ebp, ebp
:00458FA08D4801 lea ecx, dword ptr [eax+01]
 
* Referenced by a (U)nconditional or (C)onditional Jump at Address 00458FA8(C)
 
:00458FA38A10 mov dl, byte ptr [eax]
:00458FA540 inc eax
:00458FA684D2 test dl, dl
:00458FA875F9 jne 00458FA3
 

         Continuons pour voir ou est calculé le serial.En fait plus bas dans le code nous avons encore une boucle.Cette fois-ci cette boucle va construire pas à pas notre serial valide. Regardez le registre edi qui recoit progressivement une série de numéros et de lettres. Voici la routine de calcul du serial.

:00458FDC8B44241C mov eax, dword ptr [esp+1C]
...
:0045902BC6072D mov byte ptr [edi], 2D
:0045902E47 inc edi
 
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses :00459024(C), :00459029(C)
 
:0045902F8BDE mov ebx, esi
:0045903183FB18 cmp ebx, 00000018
:004590347CA6 jl 00458FDC
 

         On voit bien que c'est la routine de calcul du serial car le code hexédécimal 2D est présent dans cette portion de code.En effet ce code correspond en ascii au tiret "-" que l'on retrouve souvent dans les serials (par exemple 1234-1234-1234).Avant de faire une série de F8 pour sortir de la boucle regardons encore une fois le code. On a à l'adresse 00459031 l'instruction assembleur cmp ebx, 00000018 qui fait une comparaison de ebx à 18 (18 en hexa décimal est égal à 24 en décimal). Qu'est ce que ça pourrait bien être ? Eh bien vu que le serial qui est en train d'être calculé a une taille qui s'agrandit de plus en plus on peut penser que c'est la longueur finale de la chaîne contenant le serial.On verifie sorti de la boucle que le serial fait effectivement 24 caractères (sans les tirets).Dans la grande fenêtre des registres une fois sorti de la boucle vous avez ça

[edi-00000020] - 0002b000 ....
[edi-0000001C] - 364e5300 .SN6
[edi-00000018] - 2d333337 733-
[edi-00000014] - 37584241 ABX7
[edi-00000010] - 4d2d3344 D3-M
[edi-0000000C] - 33553442 B4U3
[edi-00000008] - 37412d4b K-A7
[edi-00000004] - 42535336 6SSB
[edi+00000000] - d2c19700 ....
[edi+00000004] - 70a6e877 w..p
[edi+00000008] - 714d0800 ..Mq

         Voila notre serial valide est SN6733-ABX7D3-MB4U3K-A76SSB

         Bon on ne s'arrête pas là. Nous on veut craquer le programme en forçant l'enregistrement pour n'importe quel nom.Continuons.Sorti de la boucle on retrouve comme par hasard dans eax le faux serial qu'on avait entré au début à savoir 123456 (pressez le bouton eax dans la grande fenêtre du debugger pour voir ce que contient le registre eax).C'est cette instruction qui fait cette opération.

:004590368B8424F0000000 mov eax, dword ptr [esp+000000F0]

         Elle est suivie de cette instruction qui met le bon serial SN6733-ABX7D3-MB4U3K-A76SSB dans esi.
 
:004590408DB42484000000 lea esi, dword ptr [esp+00000084]

         J'ai dit comme par hasard car vous vous en doutez la comparaison entre SN6733-ABX7D3-MB4U3K-A76SSB et 123456 va se faire maintenant puisque que le programme vient de calculer le bon serial.Bon voyons le code. Je crois que c'est clair mais j'explique quand même.

:004590478A10 mov dl, byte ptr [eax]
:004590498A1E mov bl, byte ptr [esi]
:0045904B8ACA mov cl, dl
:0045904D3AD3 cmp dl, bl
:0045904F751E jne 0045906F
:0045905184C9 test cl, cl
:004590537416 je 0045906B
:004590558A5001 mov dl, byte ptr [eax+01]
 

         Vous savez que le programme met le bon serial dans esi et celui qu'on a entré (le faux) dans eax.En 0045904F le saut va s'exécuter. Ca on s'en doute puisque dl va contenir le premier octet à l'adresse de eax soit 1 (c'est le 1 de 123456) et bl va contenir le premier octet (byte) à l'adresse de esi soit S (c'est le 1 caractère de SN6733-ABX7D3-MB4U3K-A76SSB).Comme ces 2 octets 31 (code hexadimal correspondant au 1) et 53 (code hexadimal correspondant au S) sont différents le cmp dl, bl va mettre l'indicateur ZF à 0 car dl-bl = 31-53 <>0 (ZF passe à 1 si on a obtenu 0 dans la comparaison).

         Si on continue l'exécution par F8 le programme arrive en 0045907A et saute 00459088 (une deuxième sortie du call (dans lequel on est depuis le début je le rappelle).

         Rappel : un ret veut dire fin d'un call et exécution de la ligne de code qui suit immédiatement le call.

:0045907A750C jne 00459088
:0045907CB801000000 mov eax, 00000001
:0045908181C4D8000000 add esp, 000000D8
:00459087C3 ret
 
* Referenced by a (U)nconditional or (C)onditional Jump at Address 0045907A(C)
 
:0045908833C0 xor eax, eax
:0045908A81C4D8000000 add esp, 000000D8
:00459090C3 ret
 

         Il y a fort à penser (voire c'est sûr à 100%) que cette sortie il ne faut pas la prendre.En effet il y a un mov eax,00000001 en 0045907C qui veut dire enregistré pour le programme. Eh bien c'est ce qu'on veut nous. Bon la solution à notre analyse est d'anuler le saut en 0045907A.

         On remplace

:0045907A750C jne 00459088

         par
:0045907A7500 jne 0045907C

On ouvre une copie de MOVGEAR.EXE dans winhex et on va à l'offset 5907A (c'est cet offset qui apparaît dans la barre de statut de w32dasm quand on sélectionne la ligne d'adresse 0045907A) en faisant ALT G -> 5907A.

On remplace 750C par 7500.On enregistre et on lance cette copie de MOVGEAR.EXE direction la boîte d'enregistrement.On entre pifoman / 123456 comme valeur pour nom / code. Et là on pousse un grand cri joie on est enregistré. On a le droit a un petit message de remerciements "Votre logiciel est maintenant enregistré.Félicitations.".

Voila c'est fini le logiciel est complètement craqué.

 

 

         Conclusion : l'analyse menée ici est riche sur beaucoup de plans. Elle vous apprend à localiser la routine de calcul de serial (le call 00459210), de voir le serial en clair (registre esi à l'adresse 00459040), de trouver l'endroit où se fait la comparaison entre faux et vrai serial (jne 00459088) et de craquer cette protection en ne changeant qu'un seul byte (à l'adresse 0045907B <=> offset 5907B 0C devient 00).

Dans ce crack nous avons craqué qu'un seul octet : on ne peut pas mieux faire en terme de craquage (moins vous craquez d'octets plus votre crack est bon !) Savoir en revanche quel octet craquer avec quelle valeur ça ça vient avec l'expérience.

Comme information supplémentaire le nom et le code que vous avez entrés sont enregistrés dans le registre (demarrer->exécuter->regedit) sous le chemin d'accès HKEY_LOCAL_MACHINE\SOFTWARE\gamani\GIFMovieGear\2.0.
Supprimez ce chemin si vous voulez repasser en version d'évaluation (ou bien restaurez la copie de sauvegarde).

 

Voila c'est fini !
Bonne soirée

 



pifoman




Nombre de visites depuis le 14/10/2004