|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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
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
Offset Déplacement depuis le début de la zone de code d'un programme. EB 90
Détail des modifications de Gif Movie Gear 4.0.2
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.
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 : 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 :
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
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
Voyons ce qui se passe ensuite:
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
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
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.
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.
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 .... 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.
Elle est suivie de cette instruction qui met le bon serial SN6733-ABX7D3-MB4U3K-A76SSB dans esi.
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.
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.
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
par
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.
Voila c'est fini !
![]()
|