|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ce cours est un reflet fidèle du cours intégré au crack de ma création de Winrar 3.50 fr.
w32dasm 8.9 Pour désassembler le progamme (transformation en langage d'assemblage) 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
a/ Enregistrement de 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 [00443AD0], 00 va comparer le contenu de l'adresse 00443AD0 à 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 00443AD0. On va rechercher un début d'instruction asm du style mov byte ptr [00443AD0] qui met à jour le contenu du premier byte de l'adresse 00443AD0. 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 00434E4A. Cette instruction mov byte ptr [00443AD0], al veut dire mettre dans le contenu de l'adresse 00443AD0 la valeur du registre al (al étant 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 00434E45. Nous le calcul on s'en fiche. Ce qu'on veut c'est al = 01 juste avant d'exécuter l'instruction asm en 00434E4A pour qu'on puisse être enregistré (ie empêcher le saut depuis 004291B4). On a donc 2 solutions possibles équivalentes (je privilégie la deuxième qui ne modifie que 3 octets au lieu de 5).
Solution 1 : on annule l'appel à la routine de mise à jour de al en mettant directement à jour al à la valeur 01. Remplacez dans rar.exe ouvert dans winhex à l'offset 34445 (commande ALT G -> 34445) le code hexadécimal en rouge suivant. 00434E45 E8BEF9FFFF call 00434808 Remarque 2 : 34445 c'est ce qui est marqué dans la barre de statut en bas dans w32dasm quand on sélectionne la ligne de code d'adresse 00434E45. Solution 2 : on entre dans le call en 00434E45 (flèche droite dans w32dasm sur l'adresse 00434E45), on met à jour al à 01 et on sort. Remplacez dans rar.exe ouvert dans winhex à l'offset 33E08 (commande ALT G -> 33E08) le code hexadécimal en rouge suivant. 00434808 53 push ebx Remarque 2 : ret (= return = retour) termine le call 00434808 et continue en 00434E4A
On enregistre (fermez w32dasm si winhex refuse d'enregistrer) et on lance rar.exe. Ca 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.50>rar a toto.rar License.txt
b/ Associer un nom à la licence de Rar.exe On peut aller plus loin dans l'enregistrement en assignant un nom (par exemple pifoman) à rar.exe l'enregistrement.
On voit clairement que c'est le registre edx qui reçoit le nom d'enregistrement. Celui-ci est passé en paramètre à la fin de la chaîne "Registered to" avec la variable %s (le s de %s signifie string).Ce que nous avons à faire c'est juste remplacer le dword ptr [esp+34] par l'adresse qui pointera vers le premier octet de notre nom (le nom que j'ai choisi est pifoman).Comment faire ça? Fermons w32dasm et ouvrons rar.exe dans winhex et cherchons une suite de 00 (zone non utilisée par le programme qui termine une section de l'exécutable). On en trouve une par exemple à la fin du fichier à partir de l'offset 48DA0.On se positionne sur l'offset 48DA0 par la commande ALT G -> 48DA0 et on écrit alors notre nom pifoman. Pourquoi l'offset 48DA0 est-il intéressant pour écrire notre nom ? Parceque premièrement il se situe vers la fin du fichier. Il nous laisse de la place pour écrire le nom d'enregistrement jusqu'au dernier octet du fichier qui est à l'offset 48DFF (ouvrez rar.exe dans winhex). 48DFF - 48DA0 + 1 = 60h = 96d. Cela fait donc 96 caractères au maximum que notre nom d'enregistrement peut contenir. Le deuxième avantage est que l'on peut dépasser ces 96 caractères et continuer à écrire notre nom au dela de l'offset 48DFF. Le crack le fait (écrire votre nom après /nom= dans le crack) mais rar.exe limite la lecture du nom à l'offset 48DFF. On revient à rar.exe désassemblé dans w32dasm.Comment transformer cet offset 48DA0 dans winhex en adresse dans w32dasm ? Car c'est d'une adresse qu'on a besoin pour remplacer le dword ptr [esp+34] plus haut. Regardez le détail des sections fournies par w32dasm :
Disassembly of File: C:\Program Files\WinRAR 3.50\Rar.exe Number of Objects = 0007 (dec), Imagebase = 00400000h Object01: .text RVA: 00001000 Offset: 00000600 Size: 0003D200 Flags: 60000020
Offset 00042A00 <= Offset 48DA0 implique que l'offset 48DA0 appartient à la section .rsrc. L'adresse équivalente à l'offset 48DA0 est donc 0045B3A0.Pour effectuer l'enregistrement à mon nom pifoman il suffit donc de remplacer à l'offset 287B4 dans winhex le code hexadécimal suivant en rouge :
004291B4 741A je 004291D0 remplacé par 004291B4 BAA0B34500 mov edx, 0045B3A0
On ajoute un nop (instruction ne rien faire) pour équilibrer le code. La suite 74 1A 8D 54 24 34 est composée de 6 octets tandis que la suite BA A0 B3 45 00 n'en contient que 5.
Winrar.exe
a/ Enregistrement de Winrar.exe Partie 1 : on va rechercher 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. On trouve 3 occurences de registered to. 1 seule nous intéresse (c'est la première).
En 0044580C le programme compare le contenu de l'adresse 0044580C à 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 0044585A après la comparaison) c'est que le contenu de l'adresse 004A6F94 (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 004A6F94 on va faire une recherche sur une instruction assembleur mov byte ptr [004A6F94] qui veut dire move in the content of address 004A6F94 one byte on a value <=> déplacer dans le contenu de l'adresse 004A6F94 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 [004A6F94] trouvés (on lance d'abord une session de debugging de winrar.exe dans w32dasm 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 004417BE en relançant une nouvelle session de debugging en mettant un bp (avec F2) sur la ligne d'adresse 004417BE. Dès que w32dasm break sur 004417BE 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 0044B4D2 (le saut c'est le debugger qui nous le dit avec un F8 sur 0044B4BC). On va donc faire l'opération inverse : on annule le saut en 0044B4BC en écrivant en hexadécimal dans une copie de winrar.exe ouverte dans winhex 7400 au lieu de 7414 à l'offset 4AABC (regardez la barre de statut de w32dasm quand la ligne d'adresse 0044B4BC est sélectionnée) pour que le programme saute en 0044B4BE et mette le byte 01 dans al ie pour qu'on soit enregistré. On ferme w32dasm et on enregistre les modifications puis on lance la copie de winrar.exe à la main (double clic dessus). On observe avec plaisir les changements: -> La barre de titre ne comporte plus de message "version d'évaluation"
Partie 2 : activation de 2 options désactivées dans le menu Commandes -> Ajouter des fichiers à l'archive. -> Activer la vérification d'authenticité (menu général). On regarde les string data reference de winrar.exe dans w32dasm et on voit "Available in registered version only". C'est l'équivalent en anglais de la phrase "Disponible uniquement la version enregistrée" qui apparaît quand on clique sur une des 2 options désactivées. On fait une petite recherche dans w32dasm sur cette chaîne. 61 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 61 occurences (par exemple la ligne d'adresse 0043B35A 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 dans w32dasm). On démarre le programme par F9 et dans winrar.exe on coche l'option "activer la vérification d'authenticité" dans Commandes -> Ajouter des fichiers à l'archive. w32dasm break ici :
00444B60 B86A000000 mov eax, 0000006A
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 0044EEDA (shift F12 -> 0044EEDA dans w32dasm).
Ce saut en 0044EED6 nous intéresse beaucoup. Il donne en effet la possibilité de survoler le call en 0044EEDA qui nous amène au message "Available in registered version only". Eh bien nous allons forcer le saut en 0044EED6 (offset 4E4D6).Remplacez dans une copie de winrar.exe ouverte dans winhex le code hexadécimal suivant en rouge. 0044EED6 7411 je 0044EEE9 remplacé par 0044EED6 EB11 jmp 0044EEE9 On lance la copie de winrar.exe une fois la modification faite. 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 004A6F94 (celle de la partie 1). Bon voici ce qu'on va faire :
a/ On ferme w32dasm b/ On fait les 2 modifications décrites dans les parties 1 et 2 sur winrar.exe (ouvert dans winhex.exe) à savoir c/ On désassemble winrar.exe qu'on vient juste de modifier dans w32dasm et on met un bp sur les 6 occurences mov byte ptr [004A6F94] pour voir où le programme va faire la vérification du statut d'enregistrement quand on veut cocher les cases du menu Commandes -> Ajouter des fichiers à l'archive. Pour mettre ces bp voici comment procéder. -> On lance le debugger de w32dasm par CTRL L. Voila les bp ont été mis sur les 6 instructions mov byte ptr [004A6F94]. -> Démarrer le programme winrar dans le débugger avec F9 Eh là le debugger de w32dasm break sur cette adresse 0044E66A C605946F4A0000 mov byte ptr [004A6F94], 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 [004A6F94]). On fait CTRL T pour terminer le processus winrar.exe et on ferme le debugger de w32dasm. Ce que nous allons faire c'est remplacer dans une copie de winrar ouverte dans winhex le code hexadécimal en rouge suivant : 0044E66A C605946F4A0000 mov byte ptr [004A6F94], 00 Pour faire ça on utilise le code hexadécimal correspondant aux instructions 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 avec CTRL ALT H dans winhex la séquence d'octets C605946F4A0000 par C605946F4A0001 (01 = enregistré). On lance winrar.exe. Toutes les protections sont retirées. On est totalement enregistré (ça implique que toutes les options sont cochables et le nag-screen a aussi disparu).
b/ Associer un nom à la licence de Winrar.exe On peut aller plus loin dans l'enregistrement en assignant un nom pour l'enregistrement.
On voit que c'est le registre esi qui reçoit le nom d'enregistrement (on dépile avec l'instruction asm pop esi une valeur de la pile en la mettant dans esi en 00445828 juste avant le "Registered to"). La valeur de esi sera accolée derrière la chaîne "Registered to".Ce que nous avons à faire c'est juste remplacer le 004A6990 par l'adresse qui pointera vers le premier octet de notre nom (le nom que j'ai choisi est pifoman).Comment faire ça ? Fermons w32dasm et ouvrons winrar.exe dans winhex et cherchons une suite de 00 (zone non utilisée par le programme qui termine une section de l'exécutable). On en trouve une par exemple à la fin du fichier à partir de l'offset D71A0.On se positionne sur l'offset D71A0 par la commande ALT G -> D71A0 et on écrit alors notre nom pifoman. On revient à winrar.exe désassemblé dans w32dasm.Comment transformer cet offset D71A0 en adresse ? Car c'est d'une adresse qu'on a besoin pour remplacer le 004A6990 plus haut. Regardez le détail des sections fourni par w32dasm :
Disassembly of File: C:\Program Files\WinRAR 3.50\WinRAR2.exe Number of Objects = 0007 (dec), Imagebase = 00400000h Object01: .text RVA: 00001000 Offset: 00000600 Size: 00096A00 Flags: 60000020
Offset 000A6C00 <= offset D71A0 implique que l'offset D71A0 appartient à la section .rsrc. L'adresse équivalente à l'offset D71A0 est donc 005195A0.Pour effectuer l'enregistrement à mon nom pifoman il suffit donc de remplacer à l'offset 44E16 dans winhex le code hexadécimal suivant en rouge :
00445816 BE90694A00 mov esi, 004A6990
Ce cours vous appris à manipuler le débugger fourni avec le désassembleur w32dam en mettant des point d'arrêt sur winrar. Ces points d'arrêt issus de l'étude des string data reférences permettent de localiser l'endroit dans le programme où se fait la vérification du statut d'utilisateur enregistré.C'est ce statut privilégié que nous avons cherché à atteindre pour réactiver des options verrouillées, bloquer un nag-screen et refaire le menu Aide -> A propos de winrar ... A la suite de cette étude avec w32dasm vous avez appris à patcher un exécutable avec winhex en écrivant à des offsets précis du code hexadécimal.Ce code n'est que la traduction d'un code assembleur modifié.Vous avez aussi appris à manipuler des adresses pour enregistrer le logiciel à votre nom en faisant des calculs sur les sections.
Bonne nuit à tous. ![]()
|