Crack in France
par pifoman

 
 

Ce cours est un reflet fidèle du cours intégré au crack de ma création de winrar 3.41 fr

 

INFOS SUR LE CRACK

 

Nom du progWinrar 3.41
Disponible surhttp://www.rarlab.com
Téléchargeablehttp://www.rarlab.com/rar/wrar341fr.exe
Date du progJeudi 4 novembre 2004
Date du crackLundi 22 novembre 2004
Réalisé parPifoman
Url site

http://crackinfrance.free.fr

Url redirectionhttp://www.geocities.com/mitonnes

 

COMMENTAIRES SUR LE PROGRAMME

 

    WinRAR est un algorithme de compression de haute performance permettant des taux de compression meilleurs que ceux obtenus avec les outils d'archive de votre PC, surtout pour les fichiers exécutables, les bibliothèques d'objets, les fichiers texte de taille importante, …

   C'est un utilitaire de gestion de fichiers RAR et ZIP, il compresse les fichiers jusqu'à 30% de mieux que les archiveurs basés sur ZIP. Il n'a besoin d'aucun programme pour pouvoir soit compresser soit décompresser un fichier en format ZIP et permet également de réparer des fichiers ZIP endommagés. Vous pouvez aussi ouvrir et décompresser les archives au format ARJ, LZH, CAN ou ACE...

 

LIMITATIONS

 

    1 - Un écran de harcèlement (Nag-screen) systématique nous invitant à nous enregistrer.

    2 - 3 fonctions désactivées :

  • "Activer la vérification d'authenticité"
    Menu Commandes -> Ajouter des fichiers à l'archive -> Général.
     

  • "Placer les erreurs dans le journal"
    Menu Options -> Configuration...
     

  • "Effacer le contenu du disque de destination avant l'archivage"
    Menu Commandes -> Ajouter des fichiers à l'archive -> Sauvegarde.

 

LES OUTILS

 

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
Pour éditer l'exécutable et modifier certains octets dans le but de la cracker. On cherche l'offset trouvé dans la barre de statut de w32dasm 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 un endroit du code.

90
      Code hexadécimal correspondant en assembleur à une instruction à rien (= nop = No OPeration). 

 

LE CRACK

 

          Détail des modifications rar.exe

OctetAdresse OffsetOriginalCrackéEffet
1

004342AC

338AC53B0On remplace à l'adresse 004342AC le contenu d'un call par mov al, 01 suivi d'un ret. Cela met 01 dans le registre al et a pour conséquence d'enregistrer le programme.
2

004342AD

338AD5601
3

004342AE

338AE57C3

 

         Détail des modifications winrar.exe

OctetAdresse OffsetOriginalCrackéEffet
1

0044A2AC

498AD

1400On faitles changements suivants :
-> on met enregistré à dans a propos de winrar
-> version d'évaluation retiré dans le titre de winrar
-> les options du journal dans option configuration sont actives.

2

0044D05B

4C65B

00

01

Fignolage. On active toutes les options dans le menu commandes->ajouter des fichiers à l'archive et on supprime le nag-screen.On passe en version enregistrée.

 

ANALYSE  DU  PROGRAMME

 

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

 

:00428D87 E8784E0100 Call 0043DC04
:00428D8C 803D0031440000 cmp byte ptr [00443100], 00
:00428D93 741A je 00428DAF
:00428D95 8D542434 lea edx, dword ptr [esp+34]
 
* Possible Reference to String Resource ID=03014: "Registered to %s"

 

             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


:004348C9 E8DEF9FFFF call 004342AC
:004348CE A200314400 mov byte ptr [00443100], al


             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

 

:004348CE A200314400 mov byte ptr [00443100], al

 

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
             remplacé par
             B001909090

             Rappel : nop = no operation = instruction qui ne fait rien en assembleur.

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
 

:004342AC 53push ebx
:004342AD 56push esi
:004342AE 57push edi
 
on va remplacer par ces octets par ceux là
 
:004342AC B001mov al, 01
:004342AE C3ret


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

 

* Reference To: USER32.SetDlgItemTextA, Ord:0000h
 
:004447CD E800BD0400 Call 004904D2
:004447D2 803DBCF9490000 cmp byte ptr [0049F9BC], 00
:004447D9 7449 je 00444824
:004447DB BEB8F34900 mov esi, 0049F3B8
:004447E0 8DBD34F5FFFF lea edi, dword ptr [ebp+FFFFF534]
:004447E6 B981010000 mov ecx, 00000181
:004447EB F3repz
:004447EC A5movsd
 
* Possible Reference to String Resource ID=00960: "Registered to"
 

           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.
 

:00440AEF A2BCF94900 mov byte ptr [0049F9BC], al
 
Au dessus de 00440AEF on a ce call
 
:00440AEA E895970000 call 0044A284
:00440AEF A2BCF94900 mov byte ptr [0049F9BC], al

           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.
 
:0044A2AA 84C0test al, al
:0044A2AC 7414 je 0044A2C2
:0044A2AE B001mov al, 01


           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
          Les 2 options sont
                -> activer la vérification d'authenticité.
                -> effacer le contenu du disque de destination avant archivage.

          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 :

:00443C70 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:
          :0044D85B   , :0044FB22   , :00466634   , :004705AE

          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.

:0044D857

7411 je 0044D86A
:0044D859 8BC3 mov eax, ebx
:0044D85B E80064FFFF call 00443C60
:0044D860 6A00 push 00000000
     
* Possible Ref to Menu: MAIN_MENU, Item: "Deselect group Gray -"

          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).
    -> Allez à la postion 498AD avec ALT G -> 498AD et remplacez 14 par 00

          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).
   -> On lance le debugger de w32dasm par CTRL L.
   -> CTRL S (raccourci pour Goto->Go to code start)
   -> search -> find text -> mov byte ptr [0049F9BC]
   -> F2 sur la ligne trouvée
   -> F3 pour chercher le mov byte ptr [0049F9BC] suivant
   -> Alternez F2 et F3 encore 5 fois.

    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
   -> Le debugger break (vous entendez un bing)
   -> On continue avec F9 puis F9 (F9 veut dire aussi continuer sans s'arrêter)
   -> Winrar est ensuite lancé dans une nouvelle fenêtre
   -> On ferme le nag s'il apparaît
   -> Allez dans le menu commande->ajouter des fichiers à l'archive

    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
     par
     mov byte ptr [0049F778], 01

    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é

0044A2AC    498AD   14       00        ->enregistré à dans a propos de winrar/version d'évaluation retiré/les options                                                                 concernant le journal dans option configuration sont actives

0044D05B     4C65B   00       01        ->si octet précédent patché : retire le nag-screen et les 2 cases désactivées dans
                                                               commande->ajouter des fichiers à l'archive sont réellement cochables.

 

       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 !
Bonne nuit

 



pifoman




Nombre de visites depuis le 01/12/2004