|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ce cours est un reflet fidèle du cours intégré au crack de ma création de winrar 3.41 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 rar.exe
Détail des modifications winrar.exe
Rar.exe
On ouvre rar.exe dans w32dasm. Dans w32dasm on inspecte les string data reference de rar.exe par ref->String Data References. On voit une chaîne intéressante registered to (en français enregistré à). C'est ce qu'on veut puisque cherche à atteindre le statut d'utilisateur enregistré dans rar.exe. On se place par CTRL S au début de la zone de code pour débuter la recherche de cette expression. On fait ensuite search->find text->registered to. On a une seule occurence (ça va être rapide). Voici le listing de désassemblage trouvé :
L'instruction asm (assembleur) cmp byte ptr [00443100], 00 va comparer le contenu de l'adresse 00443100 à 00 pour voir si on est enregistré (00 pour non enregistré, 01 pour enregistré). On peut assimiler cette comparaison à une comparaison de type comparaison booléenne. On réfléchit et on se dit que le programme avant d'arriver ici a dû mettre cette information dans l'adresse 00443100. On va rechercher un début d'instruction asm du style mov byte ptr [00443100] qui met à jour le contenu du premier byte de l'adresse 00443100. Petite remarque les crochets en asm ça veut dire"contenu de". La recherche conduit à 1 seule occurence. On arrive ici
Le call fait la vérification du statut enregistré ou non en mettant dans le registre 8 bits noté al le résultat de ce statut. Comment je sais ça ? Eh bien il suffit de regarder l'instruction en 004348CE
Cette instruction veut dire mettre dans le contenu de l'adresse 00443100 la valeur de al. al est un registre de taille 8 bits dans le micro-processeur intel. La valeur de al est calculée dans le call juste au dessus à l'adresse 004348C9. Nous le calcul on s'en fiche. Ce qu'on veut c'est un octet qui dit enregistré au programme dans al. Enregistré ça correspond à 01 (c'est souvent ce byte qui est utilisé). 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 hexadécimal cela donne B001. Le pb c'est que E8DEF9FFFF ça fait 5 octets (E8 étant le premier de la série des 5 et DE le suivant ...) et B0 01 ça ne fait que 2 octets. Eh bien c'est pas grave on met des 90 = nop en asm à la place des bytes F9 FF FF soit au final E8DEF9FFFF Ce remplacement on le fait dans winhex à l'offset 33EC9 (c'est ce qui est marqué dans la barre de statut en bas dans w32dasm quand on sélectionne la ligne de code :004348C9 E8DEF9FFFF call 004342AC. Dans winhex on va à cet offset par ALT G -> 33EC9 et on remplace E8 DE F9 FF FF par B0 01 90 90 90. On enregistre et on lance rar.exe ça marche. On n'a plus de version shareware d'affiché. (même quand on fait dans une fenêtre de commande lancée par démarrer->exécuter->command) C:\Program Files\WinRAR 3.41>rar a toto.rar License.txt Comme je suis assez perfectionniste on peut faire mieux que patcher 5 octets.On va en patcher 3 au lieu de 5.On laisse le call appeler son adresse 004342AC. Sauf que nous on va passer par là juste après l'appel pour y faire un peu de ménage. Voici ce qu'on a en 004342AC
L'instruction assembleur ret termine un call et le programme continue à l'instruction qui suit le call (celle en 004348CE). On a donc à remplacer en hexadécimal dans winhex 535657 par B001C3 en commençant à l'offset 338AC (338AC apparaît dans la barre de statut en bas de la fenêtre de w32dasm quand vous sélectionnez la ligne d'adresse 004342AC). On teste au cas où même si c'est exactement la même chose qu'avant écrite d'une manière différente et on voit que ça marche. Ok passons à winrar maintenant.
Winrar.exe
Octet 1
Notre but : on va recherche le statut d'utilisateur enregistré. On désassemble winrar.exe dans w32dasm par la commande Disassembler->Open File to Disassemble. On inspecte ensuite les string data référence dans w32dasm 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 se place par CTRL S au début de la zone de code du programme avant de lancer la recherche de l'expression. On effectue ensuite la recherche de registered to par search->find text dans w32dasm. 3 occurences trouvées. 1 seule nous intéresse (c'est la première).
En 004447D2 le programme compare le contenu de l'adresse 004447D2 à 00. 00 signifie dans beaucoup de cas non enregistré (01 pour enregistré = true) 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 00444824 après la comparaison) c'est que le contenu de l'adresse 0049F9BC (codée sur 1 byte = 1 octet) contient l'information qui dit enregistré ou pas. C'est la cas ici. Pour savoir où le programme va mettre l'information enregistré ou non dans l'adresse 0049F9BC on va faire une recherche sur une instruction assembleur mov byte ptr [0049F9BC] qui veut dire move in the content of address 0049F9BC on one byte a value <=> déplacer dans le contenu de l'adresse 0049F9BC sur un octet une valeur (qui est notre statut enregistré ou non). On a 6 occurences. Pour savoir laquelle prendre on pose un bp (break point : point d'arrêt) sur tous les mov byte ptr [0049F9BC] trouvés (on lance d'abord le debugging de winrar par CTRL L et on sélectionne chaque ligne trouvée sur laquelle on fait F2 suivi d'un F3 pour passer à l'occurence suivante). On démarre le programme avec le debugger avec F9.w32dasm break à 1 seul endroit.
On termine alors volontairement la session de debugging en faisant CTRL T dans w32dasm (T pour Terminate en anglais). On va entrer dans le call d'adresse 00440AEA en relançant une nouvelle session de debugging en mettant un bp (avec F2) sur la ligne d'adresse 00440AEA. Dès que w32dasm break sur 00440AEA on fait F7 pour descendre dans le call 0044A284 suivi de plusieurs F8 pour exécuter le programme instruction par instruction sans entrer dans les call mais en les exécutant quand même. On arrive ici.
Le programme fait le test al, al et saute en 0044A2C2 (le saut c'est le debugger qui nous le dit avec un F8 sur 0044A2AC). On va donc faire l'opération inverse : on annule le saut en 0044A2AC en écrivant en hexadécimal dans winhex 7400 au lieu de 7414 à l'offset 498AC (regardez la barre de statut de w32dasm quand la ligne d'adresse 0044A2AC est sélectionnée) pour que le programme saute en 0044A2AE et mette le byte 01 dans al ie pour qu'on soit enregistré. On ferme w32dasm et on enregistre les modifications puis 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'évaluation" -> le menu Menu Aide->A propos de Winrar... est mis à enregistré -> les options concernant le journal dans Options -> Configuration... sont 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 sont pas déverrouillées.
Octet 2
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 version only". On fait une petite recherche dans w32dasm sur cette chaine. 59 occurences. C'est beaucoup !! On va y aller à la méthode bourrin (celle qui marche à tous les coup mais qui est un peu contraignante). On met un bp (break point) sur la ligne de code qui succède chacune des 59 occurences (par exemple la ligne d'adresse 0043AA7C pour le premier bp...) comme ça quand on va cocher une des 2 options désactivées w32dasm va s'arrêter et nous donner l'adresse de l'appel du message "Available in registered version only" (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 coche l'option dans winrar "activer la vérification d'authenticité" dans Commandes -> Ajouter des fichiers à l'archive. w32dasm break ici :
On termine la session de debbuging par CTRL T.On remonte un peu pour voir comment on est arrivé là on y est arrivé par 4 appels * Referenced by a CALL at Addresses: Allons en 0044D85B (shift F12 -> 0044D85B dans w32dasm). On a au dessus du call qui nous a emmené en 0044D85B un appel à la fonction IsDlgButtonChecked de l'API USER32.dll * Reference To: USER32.IsDlgButtonChecked, Ord:0000h Remontons un peu pour voir ce qu'il y a.
Ce saut nous intéresse beaucoup. Il donne en effet la possibilité de survoler le call en 0044D85B qui nous amène au message "Available in registered version only". Eh bien nous allons forcer le saut en 0044D857 (offset 4CE57). 7411 devient EB11 (les modifications physiques du programme se font dans winhex en faisant la correspondance entre l'offset donné par w32dasm (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.exe une fois la modification faite (fermer w32dasm si winhex refuse d'enregistrer car un fichier ouvert avec w32dasm est verrouillé en écriture). C'est bien l'option est cochable 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 0049F9BC (celle de la première partie). Bon voici ce qu'on va faire : a/ On va d'abord craquer l'octet 1 -> Ouvrez une copie de winrar.exe dans l'éditeur hexadécimal winhex (différente de celle utilisée par w32dasm). b/ On va mettre un bp sur les 6 occurences mov byte ptr [0049F9BC] 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 désassemble dans w32dasm le programme winrar.exe patché (voir point a/ juste au dessus). Voila les bp ont été mis sur les 6 instructions mov byte ptr [0049F9BC]. -> Démarrer le programme winrar dans le débugger avec F9 Eh là le debugger de w32dasm break sur cette adresse :0044D055 C605BCF9490000 mov byte ptr [0049F9BC], 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 [0049F9BC]). On fait CTRL T pour terminer le processus winrar.exe et fermer le debugger de w32dasm. Ce que nous allons faire on va remplacer mov byte ptr [0049F778], 00 Pour faire ça on utilise le code hexadécimal correspondant aux instrucions asm au lieu d'utiliser l'offset comme on fait à chaque fois (c'est une autre méthode valide à condition de prendre suffisament d'octets :)). On remplace C605BCF9490000 par C605BCF9490001 (il n'y a qu'un octet à modifier 00 -> 01 : c'est le dernier de la suite). Rappel : 01 = enregistré.Pour effectuer le remplacement des bytes vous allez dans winhex et vous faites Recherche->Chercher chaîne hexa et vous tapez C605BCF9490000 dans la fenêtre qui s'affiche suivi de OK.Vous arrivez à l'offset 4C655 (regardez la barre de statut de winhex l'offset y apparaît comme lorsque l'on était dans w32dasm). On arrive sur C6 on se déplace de 6 cases (une case = un octet = 256 valeurs possibles = intervalle de valeurs de 00 à FF) et on remplace 00 par 01. Pourquoi 6 cases ? parceque C605BCF9490000 = C6 05 BC F9 49 00 00 et que l'offset 4C655 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é (ça implique que toutes les options sont cochables). Récapitulatif des modifications sur winrar.exe adresse offset original cracké
Conclusion : Si vous avez suivi ce tutorial vous êtes capable de craquer casiment tous les programmes avec w32dasm pour ceux qui ne sont pas compressés (auquel cas vous n'avez aucun code asm (assembleur) dans w32dasm lorsque le programme est ouvert dedans). 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.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 ! ![]()
|