Crack in France
par pifoman

 
 

Ce cours est un reflet fidèle du cours intégré au crack de ma création de PowerArchiver 9.25.01 fr.

 

INFOS SUR LE CRACK

 

Nom du prog PowerArchiver 9.25.01
Editeur http://www.powerarchiver.com/fr/
Téléchargeable http://download.powerarchiver.com/powarc925fr.exe
Date du prog Dimanche 12 juin 2005
Date du crack Mercredi 22 juin 2005
Réalisé par Pifoman
Url site http://pifoman.free.fr/pif.php
Url redirection http://www.geocities.com/mitonnes/pif.htm

 

COMMENTAIRES SUR LE PROGRAMME

 

       Un utilitaire d'archives puissant qui permet de compresser/décompresser aux formats ZIP, CAB, LHA (LZH), TAR, TAR.GZ, TAR.BZ2, BH, RAR, ARJ, ARC, ACE, ZOO, GZ et BZIP2. Il protège les archives à l'aide de mots de passe et il peut aussi les faire vérifier par un antivirus. Il sait gérer les fichiers codés en XXE et UUE et peut aussi créer des fichiers auto extractibles au format ZIP, RAR, ACE, ARJ, LHA et BH. Une fonction très utile permet de décompresser simultanément plusieurs fichiers. PowerArchiver intègre désormais une visionneuse de fichiers graphiques tels que les formats PNG, Jpeg, TIFF, PSD, PSP, SGI, PCX, etc. Le tout avec une interface plutôt bien réalisée comme dans Winzip, mais il est toutefois possible d'y appliquer des skins

 

LIMITATIONS

 

    1 - Ecrans de harcèlement (Nag-screen).
    2 - 30 jours d'utilisation maximum.

 

LES OUTILS

 

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
Pour éditer l'exécutable et modifier certains octets dans le but de la cracker.
On cherche l'offset trouvé dans Windasm 8.9 impliqué dans la protection et on
utilise ce même offset dans WinHex pour effectuer physiquement la modification.

 

ASSEMBLEUR

 

Offset
Déplacement depuis le début de la zone de code d'un programme.

EB
   Code hexadécimal correspondant en assembleur à un saut inconditionnel (jmp).
         On saute tout le temps vers l'adresse écrite sous forme hexadécimale qui suit le EB

90
 Code hexadécimal qui se traduit en assembleur par "ne rien faire" (= nop = No OPeration). 

 

LE CRACK

 

Détail des modifications POWERARC.EXE

OctetAdresse OffsetOriginalCrackéEffet
1

0065164A

250A4A

0600Enregistrement du logiciel pour la session courante.
2

00726E7D

32627D

0700Enregistrement du logiciel pour toutes les sessions.
3

00656B41

255F41

0800Enregistrement du logiciel pour toutes les sessions.

 

ANALYSE  DU  PROGRAMME

 

        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
        Code Offset = 00000400, Code Size = 00336C00
        Data Offset = 00337000, Data Size = 0000BE00

        Number of Objects = 0008 (dec), Imagebase = 00400000h

        Object01: CODE  RVA: 00001000    Offset: 00000400 Size: 00336C00 Flags: 60000020
        Object02: DATA  RVA: 00338000    Offset: 00337000 Size: 0000BE00 Flags: C0000040
        Object03: BSS     RVA: 00344000     Offset: 00342E00 Size: 00000000 Flags: C0000000
        Object04: .idata    RVA: 005BE000    Offset: 00342E00 Size: 00003E00 Flags: C0000040
        Object05: .tls        RVA: 005C2000    Offset: 00346C00 Size: 00000000 Flags: C0000000
        Object06: .rdata    RVA: 005C3000    Offset: 00346C00 Size: 00000200 Flags: 50000040
        Object07: .reloc    RVA: 005C4000    Offset: 00000000 Size: 00000000 Flags: 50000040
        Object08: .rsrc      RVA: 005F7000    Offset: 00346E00 Size: 000E7200 Flags: 50000040

 

       L'offset 250C98 est compris entre l'offset de début de section 00000400 et l'offset de début de section 00337000.
       Donc l'offset 250C98 appartient à la section nommée CODE.

       Pour calculer l'adresse correspondant à l'offset 250C98 on utilise la formule suivante :
       adresse recherchée =  offset trouvé - offset début de section + RVA section + Imagebase

       Prenons la calculatrice de windows dans Démarrer -> exécuter -> calc.exe en mode hexadécimal (bouton hex)
       On trouve 250C98 - 00000400 + 00001000 + 00400000 = 651898

       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é.

 

:006517128B55F4 mov edx, dword ptr [ebp-0C]
:006517158B45F8 mov eax, dword ptr [ebp-08]
:00651718E8E7FEFFFF call 00651604
:0065171D59 pop ecx
:0065171E84C0 test al, al
:006517200F858B000000 jne 006517B1
...
:00651778EB0A jmp 00651784
...
 
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00651778(U)
 
:00651784668B0D90186500 mov cx, word ptr [00651890]
:0065178BB201 mov dl, 01
:0065178DB898186500 mov eax, 00651898
:00651792E8F5480800 call 006D608C
...
 
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00651720(C)
 
:006517B133C0 xor eax, eax
...
 
* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:00651829(U), :00651837(U)
 
:00651840668B0D90186500 mov cx, word ptr [00651890]
:00651847B202 mov dl, 02
:00651849B8EC196500 mov eax, 006519EC
:0065184EE839480800 call 006D608C

 

       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...
        [ebp-00000008]  - 0104267c  |&..

 

        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.
        char[006]:"123456"
        DWORD:34333231, WORD:3231, BYTE:31
        CODE: xor dword ptr [edx], esi

 

        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.

 

* Referenced by a CALL at Address:
|:00651718
 
:0065160455 push ebp
...
:006516338D55F0 lea edx, dword ptr [ebp-10]
:006516368B45FC mov eax, dword ptr [ebp-04]
:00651639E8CEDA0C00 call 0071F10C
:0065163E8B55F0 mov edx, dword ptr [ebp-10]
:006516418B45F8 mov eax, dword ptr [ebp-08]
:00651644E8073FDBFF call 00405550
:006516497506 jne 00651651
:0065164BC645F701 mov [ebp-09], 01
:0065164FEB04 jmp 00651655
 
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00651649(C)
 
:00651651C645F700 mov [ebp-09], 00
 
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0065164F(U)
 
:0065165533C0 xor eax, eax
...
:0065167F8A45F7 mov al, byte ptr [ebp-09]
:006516828BE5 mov esp, ebp
:006516845D pop ebp
:00651685C3 ret

 

        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
        remplacé par
        :00651649    7500                    jne 0065164B

 

 

        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"
        "Regnumber" = "123456"

        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

 

:00651639E8CEDA0C00 call 0071F10C
:0065163E8B55F0 mov edx, dword ptr [ebp-10]
:006516418B45F8 mov eax, dword ptr [ebp-08]

 

        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

 

* Referenced by a CALL at Addresses:
|:00651639 , :00656B29 , :00726E67
 
:0071F10C55 push ebp
 

        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).

 

:00726E67E8A082FFFF call 0071F10C
:00726E6C8B95F8FBFFFF mov edx, dword ptr [ebp+FFFFFBF8]
:00726E72A160C29B00 mov eax, dword ptr [009BC260]
:00726E77E8D4E6CDFF call 00405550
:00726E7C7507 jne 00726E85
:00726E7EC60564C29B0001 mov byte ptr [009BC264], 01
 
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00726E7C(C)
 
:00726E85803D64C29B0000 cmp byte ptr [009BC264], 00
:00726E8C7516 jne 00726EA4
 

        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
        remplacé par
        :00726E7C     7500                 jne 00726E7E

 

        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).

 

:00656B29E8DE850C00 call 0071F10C
:00656B2E8B95F832FFFF mov edx, dword ptr [ebp+FFFF32F8]
:00656B34A1CC2F7400 mov eax, dword ptr [00742FCC]
:00656B398B00 mov eax, dword ptr [eax]
:00656B3BE810EADAFF call 00405550
:00656B407508 jne 00656B4A
:00656B42A128307400 mov eax, dword ptr [00743028]
:00656B47C60001 mov byte ptr [eax], 01
 
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00656B40(C)
 
:00656B4AA128307400 mov eax, dword ptr [00743028]
:00656B4F803800 cmp byte ptr [eax], 00
:00656B520F8541040000 jne 00656F99

 

        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
        remplacé par
        :00656B40     7500                 jne 00656B42

 

 

CONCLUSION

 

         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.
Et à bientôt pour de nouveaux cours.
Pifoman

 



pifoman




Nombre de visites depuis le 06/07/2005