Crack in France
par pifoman

 
 

Ce cours est une copie remaniée (mise en forme) du cours intégré au crack de ma création de winrar 3.40 fr

 

INFOS SUR LE CRACK

 

Nom du progWinrar 3.40
Disponible surhttp://www.rarlab.com
Téléchargeablehttp://www.rarlab.com/rar/wrar340fr.exe
Date du progJeudi 16 septembre 2004
Date du crackSamedi 18 septembre 2004
Réalisé parPifoman
Url site

http://tresordeguerre.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'à 15% 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ématiquenous 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

 

Windasm 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 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 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
1004342643386453B0On remplace à l'adresse 00434268 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.
200434265338655601
3004342663386657C3

 

         Détail des modifications winrar.exe

OctetAdresse OffsetOriginalCrackéEffet
10044A191497911400On 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

0044CF3F

4C53F

00

01

Fignolage. On active toutes les options dans le menu commandes->ajouterdes 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 windasm. On inspecte les string data reference de rar.exe danswindasm. On voit une chaîne intéressante registered to -> en français enregistré à. C'est ce qu'on veut. On fait ensuite search->find text->registered to. On a une seule occurence (ça va être rapide !). Voici le listing de désassemblage trouvé :


:00428D47E8704E0100Call 0043DBBC
:00428D4C803DA02F440000cmp byte ptr [00442FA0], 00
:00428D53741Aje 00428D6F
:00428D558D542434lea edx, dword ptr [esp+34]
 
* Possible Reference to String Resource ID=03014: "Registered to %s"

 

             cmp byte ptr [00442FA0], 00 va comparer le contenu de l'adresse 00442FA0 à 00 pour voir si on est enregistré (00 pour non enregistré, 01 pour enregistré).On réfléchit et on se dit que le programme avant d'arriver ici a dû cette information dans l'adresse 00442FA0. On va rechercher une instruction asm du style mov byte ptr [00442FA0] qui met à jour le contenu de l'adresse 00442FA0.Petite remarque les crochets ça veut dire"contenu de". La recherche conduit à 1 seule occurence. On arrive ici

 

:00434886A2A02F4400mov byte ptr [00442FA0], al
 
Au dessus on a un call
 
:00434881E8DEF9FFFFcall 00434264
:00434886A2A02F4400mov byte ptr [00442FA0], al



             Le call fait la vérification du statut enregistré ou non en mettant dans al le résulat de ce statut. Comment je sais ça. Eh bien il suffit de regarder l'instruction en 00434886 A2A02F4400 mov byte ptr [00442FA0], al qui veut dire mettre dans le contenu de l'adresse 00442FA0 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 ce call. 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 hexa cela donne B001.Le pb c'est que E8DEF9FFFF ça fait 5 octets (E8 DE F9 FF FF) et B0 01 ça ne fait que 2 octets. Eh bien c'est pas grave on met des nop = 90 en asm à la place des bytes F9 FF FF soit au final E8 DE F9 FF FF remplacé par B0 01 90 90 90.

             Rappel : nop = No OPeration = instruction qui ne fait rien en assembleur. Ce remplacement on le fait dans winhex à l'offset 33E81 (c'est ce qui est marqué dans la barre de statut quand on sélectionne la ligne de code

 :00434881 E8DEF9FFFF call 00434264.

             Dans winhex on va cet offset par ALT G->33E81 et on remplace E8 DE F9 FF FF parB0 01 90 90 90. On essaie rar.exe ça marche. On n'a plus de version shareware d'affiché. (même quand on fait dans une fenêtre de commande (démarrer->exécuter->command)c:\>rar a toto.rar License.txt).

            Comme je suis assez perfectionniste on peut faire mieux que patcher 5 octets.On va enpatcher 3 au lieu de 5.On laisse le call appeler son adresse 00434264.Sauf que nous on va passer par là avant lui pour y faire un peu de ménage. Voici ce qu'on a en 00434264
 

:0043426453push ebx
:0043426556push esi
:0043426657push edi
 
on va remplacer par ça
 
:00434264B001mov al, 01
:00434265C3ret


            L'instruction assembleur ret termine un call et le programme continue à l'instruction qui suit le call (celle en 00434886). On a donc à remplacer en hexa décimal dans winhex 535657 par B001C3 en commençant à l'offset 33864.On teste au cas où même si c'est exactementla même qu'avant écrite d'une manière différente et on voit que ça marche.

 

         Winrar.exe

 

            Avant propos

            Cette version de winrar n'est pas une version très aboutie au niveau du code. C'est du vite fait. Si vous cherchez par exemple la chaine "registered to" et que vous mettez un point d'arrêt sur chacune d'elles (on fait çadans windasm quand winrar est chargé dedans avec CTRL L + F2 sur la ligne de code qui précède registered to) vous verrez que seule 1 seule occurence sur les 3 au total est testée et utilisée (les autres ne servent à rien). Celle qui est testée par le programme a lieu quand vous faites dans le menu aide -> A propos de winrar (adresse 004446B5 dans windasm). Bref passé ces considérations attaquons nous au programme.

 

           Octet 1


          Notre but   : onva recherche le statut enregistré.

          On ouvre winrar dans windasm.On inspecte les string data référence dans windasm 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 effectue la recherche de registered to par search->find text dans windasm. 3 occurences. 1 seule nous intéresse (c'est la première).
 

:004446B5E808BC0400Call 004902C2
:004446BA803D78F7490000cmp byte ptr [0049F778], 00
:004446C17449je 0044470C
:004446C3BE74F14900mov esi, 0049F174
:004446C88DBD34F5FFFFlea edi, dword ptr [ebp+FFFFF534]
:004446CEB981010000mov ecx, 00000181
:004446D3F3repz
:004446D4A5movsd
 
* Possible Reference to String Resource ID=00960: "Registered to"


           En 004446BA le programme compare le contenu de l'adresse 0049F778 à 00. 00 signifie dans beaucoup de cas non enregistré (01 pour enregistré) 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 0044470C après la comparaison) c'est que le contenu de l'adresse 0049F778 (codée sur 1 byte = 1 octet) contient l'information qui dit enregistré ou pas. C'est le cas ici.

             Pour savoir où le programme va mettre l'information enregistré ou non dans l'adresse 0049F778 on va faire une recherche sur une instruction assembleur mov byte ptr [0049F778]qui veut dire move in the content of address 0049F778 on one byte a value <=> déplacer dans le contenu de l'adresse 0049F778 sur un octet une valeur (qui est notre statut enregistré ou non). on a 6 occurences. Pour savoir laquelle prendre on pose un bp(point d'arrêt) sur tous les mov byte ptr [0049F778] trouvé (on lance le debugging de winrar par CTRL L et on sélectionne chaque ligne sur laquelle on fait F2. On démarre le programme avec le debugger avec F9.Windasm break à 1 seul endroit.
 

:004409D7A278F74900mov byte ptr [0049F778], al
 
Au dessus de 004409D7on a ce call
 
:004409D2E891970000call 0044A168
:004409D7A278F74900mov byte ptr [0049F778], al
 
On entre dedans avec F7 sur l'adresse 004409D et ensuite on fait f8 plusieurs fois. On arrive ici
 
:0044A18E84C0test al, al
:0044A1907414je 0044A1A6
:0044A192B001mov al, 01


           Le programme fait le test al, al et saute en 0044A1A6. On va donc faire l'opération inverse : on annule le saut en 0044A190 en écrivant en hexa décimal dans winhex 7400 au lieu de 7414pour que le programme mette en 0044A192 le byte 01 dans al ie pour qu'on soit enregistré.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'avaluation"
  -> le menu Menu aide->a propos est mis à enregistré
  -> les options concernant le journal dans option->configuration son 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 sontpas déverrouillées.

 

           Octet 2


          Notre but   : suppression du message d'invite à s'enregistrer (nag-screen en anglais)

          Cette étape est faculative quand les octets1 et 3 sont patchés. En effet 1 et 3 réalisé => on est complètement enregistré => plus de nag-screen. Je laisse ce point pour vous montrer comment retirer un nag screen facilement sans se casser la tête.

          Méthode   : on ouvre winhex et on cherche comme le titre de la fenêtre qu'onveut fermer est "merci de vous enregistrer" une chaîne du style "please register". On fait ça dans winhex avec CTRL F + option unicode (sans cette option on ne trouvepas de chaine). Et là bing. Il y a qu'une seule occurence. On remplace la 1 ière lettrede l'expression qui est p par 00. Ce code 00 code dit au prog s'il a envie d'ouvrir la fenêtre dont le titre est "please register" de la fermer (voir cours de smeita n°9 du site tresordeguerre.free.fr). On essaie ça marche. Plus de nag-screen. On continue.

 

           Octet 3


          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". On fait une petite recherche dans windasm sur cette chaine. 59 occurences. C'est beaucoup !! On va y aller à la méthode bourrin : on met un bp (break point) sur la ligne de code qui précède chacune des 59 occurences comme ça quand on va cocher une des 2 options désactivées windasm va s'arrêter et nous donner l'adresse de l'appel du message "diponible uniquement dans la version enregistrée" (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 va essayer de cocher l'option dans winrar "activer la vérification d'authenticité". Elle est dans commandes->ajouter des fichier à l'archive ->onglet général. Windasm break ici :

:00443B58B86A000000mov eax, 0000006A
 
on remonte un peu pour voir comment on est arrivé là on y est arrivé par 4 appels
 
|:0044D73F , :0044F9F3 , :0046648D , :00470406
 
Allons-y en 0044d73f (shift F12->0044d73f dans windasm)
 
On a * Reference To: USER32.IsDlgButtonChecked, Ord:0000h au dessus du call qui nous a emmené en 00443B58. Remontons un peu pourvoir ce qu'il y a.
 
:0044D72F751Djne 0044D74E

          Ce saut nous donne la possibilité de survoler le call qui nous amène au message "Available in registered". Eh bien on le force le saut 751d devient EB1D (les modifications physiques du programme se font dans winhex en faisant la correspondance entre l'offset donné par windasm (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 une fois la modification faite. C'est bien l'option et cochée 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 0049F778 (celle de la première partie). Bon voici ce qu'on va faire :
 

          a/ On va d'abord craquer l'octet du point 1 (2 c'est juste pour le fun)

    -> Ouvrez une copie de winrar.exe dans l'éditeur hexadécimal winhex (différente de celle utilisée par windasm).
    -> Allez à la postion 49791 avec ALT G->49791 et remplacez 14 par 00

          b/ On va mettre un bp sur les 6 occurences mov byte ptr [0049F778] 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 lance le debugger de windasm par CTRL L (winrar ouvert dans windasm au préalable).
   ->CTRL S (raccourci pour Goto->Go to code start)
   ->search->find text->mov byte ptr [0049F778]
   -> F2 sur la ligne trouvée
   -> F3 pour chercher le mov byte ptr [0049F778] suivant
   -> Alternez F2 et F3 encore 5 fois.

    Voila les bp ont été mis sur les 6 instructions mov byte ptr [0049F778].

   -> Démarrer le programme winrar dans le débugger que vous venez de lancer avec CTRL L 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 windasm break sur cette adresse

   :0044CF39  C60578F7490000    mov byte ptr [0049F778], 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 [0049F778]). On fait CTRL T pour terminer le processus winrar.exe et fermer le debugger de windasm. 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 hexa décimal correspondant.On remplace C60578F7490000 par C60578F7490001 (il n'y a qu'un octet à modifier 00->01). Rappel : 01 = enregistré. L'offset correspondant à l'adresse 0044CF39 est 4C539. On va dans winhex, on ouvre une copie de winrar.exe (winrar.exe est monopolisé en écriture par windasm) et on fait ALT G et on tape 4C539 ->OK. On arrive sur C6 on se déplace de 6 cases (une case = un octet = 256 valeurs possibles = intervallede valeurs de 00 à FF) et on remplace 00 par 01.Pourquoi 6 cases ? parceque C60578F7490001 = C6 05 78 F7 49 00 01 et que l'offset 4C539 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é (il n'y a plus de nag (le point 2 devient bien facultatif) et les optionssont toutes activées).

 

Récapitulatif des modifications sur winrar.exe

adresse         offset    original cracké

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

0044D72F    4CD2F  75        EB       ->si offset 1 patché : la case activer la vérification d'authenticité dans                                                                commande->ajouter des fichiers à l'archive est partiellement activée (elle se
                                                               désactive quand on change d'onglet)

0044CF3F    4C53F  00       01        ->si offset 1 et 2 patchés : retire le nag-screen et les 2 cases désactivées dans
                                                               commande->ajouter des fichiers à l'archive sont réellement actives

 

           Réflexion finale


           En relisant mon tutorial je me suis demandé à quoi servait de craquer en 0044D72F   4CD2F  75  EB puisque le programme pour voir si on est enregistré fait 2 vérifications différentes. Une au lancement à l'adresse 0044A191 et une autre quand on entre dans le menu commande à l'adresse 0044CF3F (pour désactiver les options et nous afficher un nag-screen).

           Conclusion : si on a patché ses 2 octets on est enregistré et donc vouloir forcer le cochage de la vérification d'authenticité en 0044D72F ne sert à rien puisque qu'on est enregistré et qui dit enregistré dit droit de cocher les options. Donc on annule le EB en 4CD2F et on relance winrar.exe. Et là mon raisonnement se vérifie. En somme on a donc 2 octets à patcher (un à l'offset 49791 et un à l'offset 4C53F) ; l'autre en 4CD2F est redondant (il y aura toujours le saut puisqu'on est enregistré !).

 

       Conclusion :

         Si vous avez suivi ce tutorial vous êtes capable de craquer casiment tous les programmes avec windasm pour ceux qui ne sont pas compressés (auquel cas vous n'avez aucun code asm (assembleur) dans windasm lorsque le programme est ouvert dedans).Heureusement ils sont relativement rares. 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 (j'y ai passé beaucoup de temps à le rédiger et à le peaufiner) : 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 14/10/2004