|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ce cours est une copie remaniée (mise en forme) du cours intégré au crack de ma création de winrar 3.40 fr
Windasm 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 rar.exe
Détail des modifications winrar.exe
Rar.exe
On ouvre rar.exe dans windasm. On inspecte les string data reference de rar.exe danswindasm. On voit une chaîne intéressante registered to -> en français enregistré à. C'est ce qu'on veut. On fait ensuite search->find text->registered to. On a une seule occurence (ça va être rapide !). Voici le listing de désassemblage trouvé :
cmp byte ptr [00442FA0], 00 va comparer le contenu de l'adresse 00442FA0 à 00 pour voir si on est enregistré (00 pour non enregistré, 01 pour enregistré).On réfléchit et on se dit que le programme avant d'arriver ici a dû cette information dans l'adresse 00442FA0. On va rechercher une instruction asm du style mov byte ptr [00442FA0] qui met à jour le contenu de l'adresse 00442FA0.Petite remarque les crochets ça veut dire"contenu de". La recherche conduit à 1 seule occurence. On arrive ici
On va donc effacer le call et forcer cette mise de 01 dans al par exemple avec une instruction du style mov al, 01 en hexa cela donne B001.Le pb c'est que E8DEF9FFFF ça fait 5 octets (E8 DE F9 FF FF) et B0 01 ça ne fait que 2 octets. Eh bien c'est pas grave on met des nop = 90 en asm à la place des bytes F9 FF FF soit au final E8 DE F9 FF FF remplacé par B0 01 90 90 90. Rappel : nop = No OPeration = instruction qui ne fait rien en assembleur. Ce remplacement on le fait dans winhex à l'offset 33E81 (c'est ce qui est marqué dans la barre de statut quand on sélectionne la ligne de code :00434881 E8DEF9FFFF call 00434264. Dans winhex on va cet offset par ALT G->33E81 et on remplace E8 DE F9 FF FF parB0 01 90 90 90. On essaie rar.exe ça marche. On n'a plus de version shareware d'affiché. (même quand on fait dans une fenêtre de commande (démarrer->exécuter->command)c:\>rar a toto.rar License.txt). Comme je suis assez perfectionniste on peut faire mieux que patcher 5 octets.On va enpatcher 3 au lieu de 5.On laisse le call appeler son adresse 00434264.Sauf que nous
on va passer par là avant lui pour y faire un peu de ménage. Voici ce qu'on a en 00434264
L'instruction assembleur ret termine un call et le programme continue à l'instruction qui suit le call (celle en 00434886). On a donc à remplacer en hexa décimal dans winhex 535657 par B001C3 en commençant à l'offset 33864.On teste au cas où même si c'est exactementla même qu'avant écrite d'une manière différente et on voit que ça marche.
Winrar.exe
Avant propos Cette version de winrar n'est pas une version très aboutie au niveau du code. C'est du vite fait. Si vous cherchez par exemple la chaine "registered to" et que vous mettez un point d'arrêt sur chacune d'elles (on fait çadans windasm quand winrar est chargé dedans avec CTRL L + F2 sur la ligne de code qui précède registered to) vous verrez que seule 1 seule occurence sur les 3 au total est testée et utilisée (les autres ne servent à rien). Celle qui est testée par le programme a lieu quand vous faites dans le menu aide -> A propos de winrar (adresse 004446B5 dans windasm). Bref passé ces considérations attaquons nous au programme.
Octet 1 Notre but : onva recherche le statut enregistré. On ouvre winrar dans windasm.On inspecte les string data référence dans windasm
comme d'habitude. On trouve une chaîne intéressante "registered to" : enregistré à en français. Cette chaîne signifie que l'on peut avoir accès à toutes les fonctions du programme si on arrive à être enregistré. C'est ce statut que l'on va chercher à atteindre. On effectue la recherche de registered to par search->find text dans windasm. 3 occurences. 1 seule nous intéresse (c'est la première).
En 004446BA le programme compare le contenu de l'adresse 0049F778 à 00. 00 signifie dans beaucoup de cas non enregistré (01 pour enregistré) si on a une instruction de comparaison (cmp en assembleur) qui la précède. C'est le cas ici. On réfléchit et on se dit que si le programme saute par dessus le registered (code je 0044470C après la comparaison) c'est que le contenu de l'adresse 0049F778 (codée sur 1 byte = 1 octet) contient l'information qui dit enregistré ou pas. C'est le cas ici. Pour savoir
où le programme va mettre l'information enregistré ou non dans l'adresse 0049F778 on va faire une recherche sur une instruction assembleur mov byte ptr [0049F778]qui veut dire move in the content of address 0049F778 on one byte a value <=> déplacer dans le contenu de l'adresse 0049F778 sur un octet une valeur (qui est notre statut enregistré ou non). on a 6 occurences. Pour savoir laquelle prendre on pose un bp(point d'arrêt) sur tous les mov byte ptr [0049F778] trouvé (on lance le debugging de winrar par CTRL L et on sélectionne chaque ligne sur laquelle on fait F2. On démarre le programme avec le debugger avec F9.Windasm break à 1 seul endroit.
Le programme fait le test al, al et saute en 0044A1A6. On va donc faire l'opération inverse : on annule le saut en 0044A190 en écrivant en hexa décimal dans winhex 7400 au lieu de 7414pour que le programme mette en 0044A192 le byte 01 dans al ie pour qu'on soit enregistré.On lance winrar à la main (double clic dessus). On observe avec plaisir les changements: -> la barre de titre ne comporte plus de message "version d'avaluation" -> le menu Menu aide->a propos est mis à enregistré -> les options concernant le journal dans option->configuration son déverrouillées. On a bien travaillé mais c'est pas fini.En effet l'enregistrement est partiel. Le message d'invite à s'enregistrer est toujours là et les options dans commandes->ajouter à l'archive ne sontpas déverrouillées.
Octet 2 Notre but : suppression du message d'invite à s'enregistrer (nag-screen en anglais) Cette étape est faculative quand les octets1 et 3 sont patchés. En effet 1 et 3 réalisé => on est complètement enregistré => plus de nag-screen. Je laisse ce point pour vous montrer comment retirer un nag screen facilement sans se casser la tête. Méthode : on ouvre winhex et on cherche comme le titre de la fenêtre qu'onveut fermer est "merci de vous enregistrer" une chaîne du style "please register". On fait ça dans winhex avec CTRL F + option unicode (sans cette option on ne trouvepas de chaine). Et là bing. Il y a qu'une seule occurence. On remplace la 1 ière lettrede l'expression qui est p par 00. Ce code 00 code dit au prog s'il a envie d'ouvrir la fenêtre dont le titre est "please register" de la fermer (voir cours de smeita n°9 du site tresordeguerre.free.fr). On essaie ça marche. Plus de nag-screen. On continue.
Octet 3 Notre but : activation de 2 options désactivées dans commandes -> ajouter des fichiers à l'archive On regarde encore une fois les string data reference et on voit "Available in registered". On fait une petite recherche dans windasm sur cette chaine. 59 occurences. C'est beaucoup !! On va y aller à la méthode bourrin : on met un bp (break point) sur la ligne de code qui précède chacune des 59 occurences comme ça quand on va cocher une des 2 options désactivées windasm va s'arrêter et nous donner l'adresse de l'appel du message "diponible uniquement dans la version enregistrée" (avant de mettre les bp avec F2 sur la ligne de code sélectionnée il faut faire CTRL L).On démarre le programme par F9 et on va essayer de cocher l'option dans winrar "activer la vérification d'authenticité". Elle est dans commandes->ajouter des fichier à l'archive ->onglet général. Windasm break ici :
Ce saut nous donne la possibilité de survoler le call qui nous amène au message "Available in registered". Eh bien on le force le saut 751d devient EB1D (les modifications physiques du programme se font dans winhex en faisant la correspondance entre l'offset donné par windasm (en bas dans la barre de statut où c'est marqué @offset et le raccourci ALT G dans winhex qui mène à un offset). On lance winrar une fois la modification faite. C'est bien l'option et cochée mais quand on choisit un autre onglet l'option redevient décochée. Le craquage est partiel. On réfléchit : je sais on n'arrête pas de réfléchir mais l'asm c'est que de la réflexion :). Si le programme décoche l'option dans mon dos quand je vais dans un autre onglet de ce menu c'est qu'il sait si je suis enregistré ou pas. Le programme a pris donc soin d'interroger la fameuse adresse du début ie 0049F778 (celle de la première partie). Bon voici ce qu'on va faire : a/ On va d'abord craquer l'octet du point 1 (2 c'est juste pour le fun) -> Ouvrez une copie de winrar.exe dans l'éditeur hexadécimal winhex (différente de celle utilisée par windasm). b/ On va mettre un bp sur les 6 occurences mov byte ptr [0049F778] pour voir où le programme va faire la vérification du statut d'enregistrement quand on veut coher les cases du menu commande->ajouter des fichiers à l'archive. -> on lance le debugger de windasm par CTRL L (winrar ouvert dans windasm au préalable). Voila les bp ont été mis sur les 6 instructions mov byte ptr [0049F778]. -> Démarrer le programme winrar dans le débugger que vous venez de lancer avec CTRL L avec F9 Eh là le debugger de windasm break sur cette adresse :0044CF39 C60578F7490000 mov byte ptr [0049F778], 00 Voila la solution est là on fait F9 et Winrar devient disponible. C'est donc le seul endroit où winrar s'arrête sur les 6 bp déposés (sur mov byte ptr [0049F778]). On fait CTRL T pour terminer le processus winrar.exe et fermer le debugger de windasm. Ce que nous allons faire on va remplacer mov byte ptr [0049F778], 00 Pour faire ça on utilise le code hexa décimal correspondant.On remplace C60578F7490000 par C60578F7490001 (il n'y a qu'un octet à modifier 00->01). Rappel : 01 = enregistré. L'offset correspondant à l'adresse 0044CF39 est 4C539. On va dans winhex, on ouvre une copie de winrar.exe (winrar.exe est monopolisé en écriture par windasm) et on fait ALT G et on tape 4C539 ->OK. On arrive sur C6 on se déplace de 6 cases (une case = un octet = 256 valeurs possibles = intervallede valeurs de 00 à FF) et on remplace 00 par 01.Pourquoi 6 cases ? parceque C60578F7490001 = C6 05 78 F7 49 00 01 et que l'offset 4C539 nous mène en C6.On enregistre la modification par CTRL S. On lance winrar.exe. Toutes les protections sont retirées. On est totalement enregistré (il n'y a plus de nag (le point 2 devient bien facultatif) et les optionssont toutes activées). Récapitulatif des modifications sur winrar.exe adresse offset original cracké
Réflexion finale Conclusion : si on a patché ses 2 octets on est enregistré et donc vouloir forcer le cochage de la vérification d'authenticité en 0044D72F ne sert à rien puisque qu'on est enregistré et qui dit enregistré dit droit de cocher les options. Donc on annule le EB en 4CD2F et on relance winrar.exe. Et là mon raisonnement se vérifie. En somme on a donc 2 octets à patcher (un à l'offset 49791 et un à l'offset 4C53F) ; l'autre en 4CD2F est redondant (il y aura toujours le saut puisqu'on est enregistré !). Conclusion : Si vous avez suivi ce tutorial vous êtes capable de craquer casiment tous les programmes avec windasm pour ceux qui ne sont pas compressés (auquel cas vous n'avez aucun code asm (assembleur) dans windasm lorsque le programme est ouvert dedans).Heureusement ils sont relativement rares. Si vous tombez un jour dessus il vous faudra des outils pour récupérer le contenu des exécutables qui ont la particularité d'être toujours décompressés quand ils s'exécutent (en mémoire centrale) (proc dump est un de ces outils). Enfin avec ce tutorial vous êtes capable aussi de mener une analyse et un debuggage complet d'un programme en le traçant sur des chaînes de caractères précises : les string data références). Je pense que ce tutorial est assez formateur (j'y ai passé beaucoup de temps à le rédiger et à le peaufiner) : il est néanmoins riche de contenu. Mon but c'est aussi de vous faire prendre conscience que l'asm même si c'est dur au départ ça vous apprend la méthodologie la rigueur et beaucoup de technicité. Pour rappel l'assembleur dans le monde de la programmation est considéré comme généralement réservé à une élite : peut-être en ferez vous partie un jour ? Moi je ne me considère que comme n'appartenant pas à cette élite ; j'ai encore beaucoup de choses à apprendre ... Voila c'est fini ! ![]()
|