|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Ce cours est un reflet fidèle du cours intégré au crack de ma création de PowerArchiver 9.25.01 fr.
Windasm 8.9 Pour désassembler le programme (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 POWERARC.EXE
POWERARC.EXE
Aujourd'hui on s'attaque à un logiciel très connu dans le monde de la compression de fichiers.
1/ La procédure d'enregistrement dans POWERARC.EXE
En ouvrant le logiciel on voit une fenêtre avec un bouton "Entrez le code d'enregistrement".Si on clique sur ce bouton on arrive dans une boîte d'enregistrement avec 2 champs à remplir. Entrons comme couple nom / code le couple pifoman / 123456. Une boîte s'affiche disant "Enregistrement incorrect. Essayez de réentrer le code que vous avez reçu.Si vous rencontrez de nouveau un problème, contactez ordering@conexware.com pour de l'aide". Prenons dans ce message le mot "incorrect" (je l'ai choisi car c'est le même mot en anglais) et cherchons le dans les string data référence de POWERARC.EXE que nous avons au préalable désassemblé dans w32dasm par la commande Disassembler -> Open File to disassemble -> POWERARC.EXE. Les string data reference dans w32dasm on y accède par le bouton nommé Strn Ref dans la barre de bouton de w32dasm. La recherche est infructueuse. Rien qui nous parle d'enregistrement incorrect. Bizarre ! On va utiliser une autre technique : faire une recherche de la chaîne "Enregistrement incorrect" directement dans le code binaire du programme. Pour cela on ouvre POWERARC.EXE dans winhex puis on fait Recherche -> texte -> Enregistrement incorrect en cochant la case "jeu de caractères unicode". Vous trouvez alors la chaîne "Enregistrement incorrect" à l'offset 250C98 (regardez en bas la barre de statut de winhex).
a/ Conversion d'un offset dans winhex en adresse dans w32dasm à l'aide des sections On revient à POWERARC.EXE désassemblé dans w32dasm. On va calculer l'adresse à laquelle correspond l'offset 250C98 dans POWERARC.EXE désassemblé. Pour cela regardons les sections de POWERARC.EXE en haut du listing de désassemblage de POWERARC.EXE dans w32dasm.
Disassembly of File: C:\Program Files\PowerArchiver\POWERARC.EXE Number of Objects = 0008 (dec), Imagebase = 00400000h Object01: CODE RVA: 00001000 Offset: 00000400 Size: 00336C00 Flags: 60000020
L'offset 250C98 est compris entre l'offset de début de section 00000400 et l'offset de début de section 00337000. Pour calculer l'adresse correspondant à l'offset 250C98 on utilise la formule suivante : Prenons la calculatrice de windows dans Démarrer -> exécuter -> calc.exe en mode hexadécimal (bouton hex) Conclusion : l'adresse dans POWERARC.EXE correspondant à l'offset 250C98 est 00651898.
b/ Localisation de la routine de calcul du vrai serial Maintenant qu'on a l'adresse faisons une recherche de cette adresse dans le code désassemblé pour voir où est appelé le message "Enregistrement incorrect. Essayez de réentrer le code que vous avez reçu.Si vous rencontrez de nouveau un problème, contactez ordering@conexware.com pour de l'aide". Dans w32dasm faîtes Search -> Find Text -> 00651898.Vous repèrez alors l'utilisation de cette adresse à l'adresse 0065178D. Voici le code qui précéde l'endroit où notre message d'erreur est appelé.
La routine d'enregistrement est située à l'adresse 00651718.Comment est ce que je sais ça ? Eh bien je pars de l'adresse trouvée 0065178D et je remonte dans le code en utilisant ce qui est dit dans le Referenced by. En l'occurence ici w32dasm nous dit que l'on arrive en 0065178D par l'adresse 00651778. Ensuite faîtes SHIFT F12 -> 00651778 pour aller à l'adresse 00651778 et appuyez sur la flèche haut du clavier. Quelques lignes au dessus en 00651718 vous voyez un call à la suite duquel on effectue un test (test al, al) suivi d'un saut conditionnel (jne 00651719).C'est le schéma classique de test d'enregistrement ; le call faisant l'appel à la procédure de comparaison serial entré / serial calculé.En plus juste au dessus du call vous voyez 2 mov qui mettent à jour les registres edx puis eax (sûrement les valeurs des 2 champs code et nom de la boîte d'enregistrement). Ce qu'on va faire maintenant c'est tracer l'exécution du programme depuis l'adresse 00651712. c/ Session de debugging de POWERARC.EXE dans la routine d'enregistrement Pour cela chargez POWERARC.EXE en mémoire via le débugger par la commande CTRL L de w32dasm.Démarrez ensuite le programme par F9 puis allez saisir le couple nom / code suivant pifoman / 123456 dans la boîte d'enregistrement de POWERARC.EXE sans faire OK dans POWERARC.EXE. Revenez ensuite à w32dasm et faîtes SHIFT F12 -> 00651712 -> OK puis F2. Vous venez de mettre un point d'arrêt (on dit encore breakpoint , en abrégé bp) sur l'adresse 00651712. Faîtes OK dans la fenêtre d'enregistrement de POWERARC.EXE. A ce moment le debugger de w32dasm surgit. Il vient de s'arrêter sur l'adresse 00651712 où on vient de mettre le bp.Faites 2 fois F8 (exécution pas à pas des lignes de code sans entrer dans les call mais en les exécutant quand même).Dans la grande fenêtre du debugger (celle qui s'était ouverte quand vous aviez fait CTRL L) en cliquant sur le bouton ebp vous voyez l'état de la pile du registre ebp.
[ebp-0000000C] - 0103fb4c L...
Si vous cliquez sur 0103fb4c (cette adresse est peut être différente chez vous) vous voyez en bas dans le rectangle Source For Data Disp 2 que l'adresse 0103fb4c est l'adresse du premier octet de la chaîne contenant le faux serial entré à savoir 123456.Voici ce que vous voyez après le clic sur 0103fb4c.
Address: 0103FB4C is Not in a Loaded Module.
De même vous voyez que 0104267c (cette adresse est peut être différente chez vous) pointe vers la chaîne contenant le nom entré à savoir pifoman.Ca c'est typique d'une procédure d'enregistrement. En effet en général on passe le code et le nom à la fonction de calcul et de comparaison des serials (ici le call 00651604 ) puis ensuite on appelle la fonction (avec un call).Allons explorer l'intérieur de la fonction en appuyant sur F7.Après plusieurs F8 vous arrivez ici.
Arrivé sur 0065163E vous voyez en interrogeant la valeur du registre [ebp-10] (clic dans la grande fenêtre du débugger sur le bouton ebp puis clic sur [ebp-00000010]) que [ebp-10] pointe sur la chaîne 3086307F (regardez en bas dans le rectangle Source For Data Disp 2).C'est le vrai serial correspondant au nom entré pifoman.Il est de longueur 8. On pourrait s'arrêter là mais nous ce qu'on veut c'est craquer le programme.Donc on continue. Arrivé en 00651649 vous voyez que le ZF (Zero Flag) vaut 0 (regardez en dessous de la lettre Z en haut dans la grande fenêtre du débugger sous le O D I T S Z A P C). Le jne 00651651 (jump if not equal to zéro) fait sauter le programme vers l'adresse 00651651 si dans le dernier calcul on n'a pas obtenu 0 auquel cas ZF=0. Ici ZF = 0 (cf grande fenêtre du debugger). On a donc obtenu 0 dans le dernier calcul et on saute donc par dessus le mov [ebp-09], 01 en 0065164B. Il faut annuler ce saut pour exécuter cette instruction mov [ebp-09], 01 et dire au programme que le code entré correspond au code attendu. En effet en 0065167F on met la valeur du premier byte de [ebp-09] dans al. C'est la valeur de al qui est testée par la suite en 0065171E (voir paragraphe précédent) quand on sort de notre fonction qui teste l'enregistrement (passage sur l'adresse 00651685). Pour rappel si al = 00 on affichait le message d'erreur sinon si al = 01 on affichait le message qui dit que l'enregistrement est OK. Comment annuler ce saut ? 2 techniques possibles au choix.
Solution 1 : arrivé en 00651649 on modifie ZF en le mettant à 1 (ZF est un bit qui vaut 0 ou 1). Pour cela cliquez sur le bouton Modify Data dans la grande fenêtre du debugger puis cliquez ensuite sur le 0 en haut en dessous de la lettre Z pour passer le bit à 1.Valider la modification en cliquant sur le bouton Modify puis Close.
Solution 2 : arrivé en 00651649 on transforme l'instruction assembleur jne 00651651 avec le patcher asm Pour cela cliquez sur le bouton Patch Code de la petite fenêtre du debugger.En dessous de la case "Entrer New instruction below" tapez jne 0065164B suivi de entrée. Cliquez ensuite le bouton Apply patch, sur le bouton Close en faisant Oui puis Oui.
Faites ensuite F9 une fois la modification effectuée.Voila on est enregistré.Le problème c'est que si vous effectuez physiquement la modification dans une copie de POWERARC.EXE ouverte dans winhex en remplaçant par la commande ALT G -> 250A49 (250A49 c'est offset donné dans w32dasm dans la barre de statut quand vous sélectionnez l'adresse 00651649) le code hexadécimal suivant en rouge vous voyez que l'enregistrement ne dure que la durée pendant laquelle le logiciel reste ouvert. :00651649 7506 jne 00651651
2/ Enregistrement complet de POWERARC.EXE
a/ Localisation de l'enregistrement dans la base de registre Une fois la modification du paragraphe précédent effectuée dans winhex (offset 250A49) si vous relancez le logiciel et que vous vous enregistrez avec le couple nom/code suivant pifoman / 123456 vous constatez en fermant l'application que le nom d'enregistrement pifoman a été enregistré dans le registre de windows. Ouvrez l'éditeur de registre par démarrer -> exécuter -> regedit.exe et recherchez le mot-clef pifoman. Vous voyez l'endroit où est stocké le nom et le code entrés au moment de l'enregistrement dans POWERARC.EXE. Ils sont sous la clé HKEY_CURRENT_USER\Software\PowerArchiverFR\General "Regname" = "pifoman" En regardant les valeurs stockées on comprend pourquoi le programme se remet en version d'évaluation dès qu'on le relance après l'enregistrement. Le programme a enregistré le faux code 123456 dans la base de registre au lieu du vrai qui est pour pifoman le code 3086307F.
b/ Démarrer l'application en mode enregistré On réfléchit. Si au redémarrage de l'application le programme sait qu'il doit passer en mode d'évaluation sans qu'on ait entré quoi que ce soit comme donnée c'est qu'il doit regénérer le vrai serial et le comparer à celui existant dans le clef du Regnumber du registre. L'endroit où est généré le vrai serial on le sait déja (cf plus haut). C'est à l'adresse 00651639
Terminez dans w32dasm la session de debugging courante par la commande CTRL T. Puis positionnez vous sur la ligne de code située à l'adresse 00651639 par la commande SHIFT F12 -> 00651639 -> OK. Ensuite avec la flèche droite du clavier descendez dans le call 0071F10C. Vous arrivez ici
La génération du vrai serial est donc demandée en 3 adresses : 00651639 (d'où l'on vient), 00656B29 et 00726E67. Allons voir ce qu'il y a en 00726E67 (SHIFT F12 -> 00726E67 -> OK).
Rechargeons en mémoire POWERARC.EXE via le débugger par la commande CTRL L de w32dasm et mettons un bp avec F2 sur l'adresse 00726E67. Si on lance le debugging avec F9 on voit que le programme s'arrête sur l'adresse 00726E67 et que le programme saute en 00726E7C vers 00726E85 (faîtes 5 fois F8). Si vous annuler le saut le programme démarrera en version enregistrée (le debugger arrivé avec des F8 sur l'adresse 00726E7C cliquez sur le bouton Modify Data dans la grande fenêtre du debugger puis cliquez ensuite sur le 0 en haut en dessous de la lettre Z pour passer le bit à 1.Valider la modification en cliquant sur le bouton Modify puis Close puis F9).
c/ Les octets à patcher avec winhex pour démarrer en mode enregistré On va enregistrer notre modification physiquement dans le programme. Ouvrez une copie de POWERARC.EXE dans winhex en remplaçant par la commande ALT G -> 32627C (32627C c'est l'offset donné dans w32dasm dans la barre de statut quand vous sélectionnez l'adresse 00726E7C) le code hexadécimal suivant en rouge :00726E7C 7507 jne 00726E85
Si on regarde la dernière adresse 00656B29 où est appelée la génération du serial on a exactement le même schéma. Cette adresse n'est pas appelée pour générer le serial dans les tests que j'ai fait.Je patche donc par sécurité (car il se peut que le programme utilise cette adresse à un moment donné que mes tests n'avaient pas couverte).
Ouvrez une copie de POWERARC.EXE dans winhex en remplaçant par la commande ALT G -> 255F40 (255F40 c'est offset donné dans w32dasm dans la barre de statut quand vous sélectionnez l'adresse 00656B40) le code hexadécimal suivant en rouge :00656B40 7508 jne 00656B4A
Dans ce cours vous apprenez à exploiter un message d'erreur donné lors de l'enregistrement du logiciel en fouillant dans le code binaire du programme avec winhex. Ensuite en regardant les sections de PowerArchiver dans w32dasm vous retrouvez grâce à un calcul d'adressage l'endroit où ce message d'erreur est appelé dans le programme puis en remontant dans le code vous localisez la routine d'enregistrement et enfin l'adresse exacte où se fait la comparaison du mauvais serial au vrai serial. Cette comparaison vous permet alors d'annuler un saut et ainsi de forcer l'enregistrement du logiciel. Cette technique qui ici n'enregistre le logiciel que pendant sa durée d'ouverture a besoin d'être complétée.Il suffit de se dire que l'application au démarrage génère le vrai serial et le compare à celui dans la base de registre. Comme nous savons où est calculé notre vrai serial un examen des appels à cette routine d'enregistrement nous conduit à une portion de code où nous devons simplement annuler un saut pour enregistrer définitivement le logiciel. J'ai voulu dans ce tutorial changer l'approche prédécente que j'avais eu dans le crack de la version 9.20.07 de PowerArchiver en la simplifiant (plus de branchement vers une zone de code où on recopie en mémoire le vrai serial sur le faux, plus d'ajout de boîte de dialogue) et un tutorial qui au final ne fait plus que 50 ko au lieu de 79.
Bonne soirée à tous. ![]()
|