Pour une meilleure lisibilité
téléchargez ce cours au format HTML et non pas TXT!

    Cours de Crack #3  - par Frog's Print - Septembre 1997





-SUJET
   : Introduction au Cracking - 3ère Partie            Fonctions Désactivées             -EXEMPLE : DLLCheck95 v4.0 Win95 (http://www.spywindows.com) -OUTILS  : W32Dasm85 / Hiew566 / SoftICE 3.xx



1/ INTRODUCTION

2/ EXECUTION DU CRACK

3/ NOTE A L'ATTENTION DES NEU-NEUS
4/ CONCLUSION
5/ EXERCICE

1/ INTRODUCTION
Pour ce troisième cours,nous allons finir notre introduction au désassemblage
de fichier (Dead Listing). Nous y reviendrons plus tard, mais pour des cours réservés
aux crackers 'avancés' (ce sera peut-être votre cas, si vous bossez bien...! :-).
Effectivement, les prochains cours seront tout particulièrement réservés à l'utilisation
du fameux SoftICE. Le cours #4 concernera l'étude avancée de ce debugger (interface,
programmation des Breakpoints, personnalisation...) et, par la même occasion,
je vous ferai un bon bourrage de crâne sur l'Assembleur (et oui, 'Mauvaise connaissance
de l'Assembleur = Mauvais_Utilisateur_De_SoftICE x Mauvais_Cracker ! :-).
Cependant, aujourd'hui nous allons pour la première fois utiliser SoftICE pour mettre
un Breakpoint afin de localiser certaines routines.
Aujourd'hui nous allons étudier les Fonctions Désactivées.
Késako?
Il s'agit tout simplement des logiciels de démonstrations dont certaines de leurs
fonctions ont été désactivées (Sauver, Copier/coller, Imprimer...)et ne sont disponibles
que dans la version commerciale.
Contrairement aux Sharewares qui, eux-aussi, ont des fonctions désactivées, les logiciels
de démonstrations ne peuvent pas être débridés par un mot de passe.
Un exemple 'classique': W32Dasm.
Ce type de protection est tout à fait intéressante à nos yeux, car nous devons voir si,
bien qu'elles aient été désactivées, ces fonctions sont présentes dans le programme ou
les DLLs qui l'accompagnent. Si elles y sont, il faudra trouver le moyen de les ré-activer,
sinon... il faudra les ré-écrire (entièrement ou en partie). Et c'est bien là que ça devient
interessant: il faudra utiliser toute nos connaissances pour savoir ce qu'il manque,
trouver la place à l'intérieur du programme pour y placer notre code (en pure ASM) etc...
C'est ce qu'on appelle Reverse Engineering (traduisez : Renverser le sens de la machine).
Bref, c'est le Top du Cracking!
Evidemment, nous n'allons pas griller les étapes puisque nous allons prendre un exemple
simple pour ce cours.

Le programme dont nous allons ré-activer les fonctions est le suivant:
DLLCheck95 v4.0 Win95 (328,192 Ko)disponible a http://www.spywindows.com .
Cet outil est assez intéressant (de même que les autres disponibles sur ce site) car
il recherche/espionne/surveille les modules 16 et 32 bits (DLL, EXE, DRV etc...) qui
sont chargés et/ou tournent sur votre PC. Ca peut toujours servir notre cause...
Pendant que vous serez sur Internet, n'oubliez pas de télécharger W32Dasm85 (W32DSM85.ZIP)
et la dernière version de Hacker's View (HIEW566.ZIP) sur ftp://ftpsearch.ntnu.no/ftpsearch
si vous ne les avez pas déjà (vous pourrez craquer W32dasm85 en utilisant mon 'patch' ou
même mon cours -en Anglais- qui se trouve quelque part sur Internet en attendant celui
en Français que je vous ai promis :-).
Utilisez W32Dasm85 puisque c'est le meilleur (jetez aux oubliettes les versions merdiques
comme W32Dsm70, W32Dsm80, W32Dsm87 et même l'infecte W32Dasm89 *Reg* que l'on trouve
partout: ils ne valent rien :-).





Avant de regarder ce que DLLCheck95 a dans le ventre, revenons une minute à nos démos
désactivées.
Il faut étudier l'aspect commercial du problème:
Ecrire un programme puis le distribuer ça coûte de l'argent. Ecrire une version de
démonstration bridée et une version commerciale puis distribuer les 2, ça coûte
2 fois plus cher. Par conséquent, la solution la plus économique serait de n'écrire
qu'un seul programme puis d'y faire une toute petite modification (changer un Call
en Nop ou un Jnz en Jmp...) pour le tourner en version démo ou commerciale.
Et les programmeurs/distributeurs qui s'en sont aperçus bien avant vous, ont bien
evidemment opté pour cette solution.
En fait, il écrivent une version qui contient à la fois l'intégralité des fonctions
de la version commerciale mais aussi les differents nagscreens, et messages du genre
"This function is unavailable in the demo version..." de la version de démonstration.
Puis ils patchent très simplement leur programme:
- ils désactivent certaines fonctions pour en faire une Démo
- ils désactivent les nagscreens... pour en faire une version commerciale.

Donc, pour résumer la chose, 90% de ces logiciels peuvent être transformer en versions
100% fonctionnelles sans trop de peine (attention tout de même, car certains d'entre eux
ont vraiment des fonctions désactivées. exemple: re-W32dasm ) de même que l'inverse
se fait aussi: craquer la version commerciale pour en faire une démo ! Marrant non?
2/ EXECUTION DU CRACK
On installe DLLCheck95 on le lance et on regarde ce qui est désactivé. N'oubliez pas
de l'utiliser intensivement au moins un quart d'heure afin d'être sûr d'avoir essayer
toutes les options ou menus différents du programme.
Après on fait le bilan de tout ce qui est désactivé et/ou limité:
- 'Print' désactivé
- 'Copy' désactivé
- 'Save Log' désactivé
- 'View Log' limité à 5 éléments
Evidemment, toutes les fonctions les plus indispensables sont désactivées. Comment
voulez-vous évaluer une Démo avant de l'acheter si vous ne pouvez pas tester ses
options principales?
Nous allons arranger ça...

Lancez W32dasm85 et désassemblez DLLCheck95.
Ouvrez la liste des String Data References et jettez y un coup d'oeil. On y trouve,
entre autre:
- Printing in progress
- Printer selected is not valid
- Printer is not currently printing
- There is no default printer currently selected
...
...
Tiens donc! Comment ce fait-il qu'un programme démo qui a la fonction d'impression
désactivée contienne autant de references à celle-ci? Serait-ce bon signe pour nous?
Pour chacune de ses fonctions désactivées, le programme nous envoie une boite
de dialogue avec 'This feature is unavailable in the unregistered version'.
Cherchons si on peut trouver ça dans le listing. Bingo! On le trouve sans problème.
Cliquez dessus et vous tombez là:
:0043E912 668B0D28E94300          mov cx, word ptr [0043E928]
:0043E919 B202                    mov dl, 02
* Possible StringData Ref from Code Obj ->"This feature is unavailable in "
                                        ->"the unregistered version. Sorry."
:0043E91B B834E94300              mov eax, 0043E934
:0043E920 E8F3EAFEFF              call 0042D418
:0043E925 C3                      ret
Si vous cliquez à nouveau sur 'This feature is unavailable in the unregistered version',
vous verrez qu'il n'y a pas d'autres occurences. Par conséquent, les 3 fonctions
désactivées doivent obligatoirement appeler cette routine.
Nous allons donc utiliser SoftICE pour savoir qui l'appelle. Pour cela, nous mettons
un simple point d'arrêt (BreakPoint) à l'adresse :0043E91B. A chaque fois que le
programme passera par cette instruction, SoftICE le bloquera.
Lancer Symbol Loader (pour les neu-neus, c'est le programme livré avec SoftICE et qui
permet de charger un programme a débogger -:) et charchez DLLCheck95 puis appuyez
sur Module/Load pour le lancer. Dès que l'écran de SoftICE apparait, tapez:
 BPX cs:0043E91B
Tapez <entrée> puis <Ctrl-D> pour lancer le programme. Dès que celui-ci est prêt,
sélectionnez File/Print.
SoftICE apparait au niveau du Breakpoint correspondant à la routine ci-dessus.
Maintenant, pour savoir qui a appelé celle-ci, tapez:
 F12
Le programme vous envoie sa @#$£*&# de boite de dialogue 'This feature...'. Appuyez
sur <OK> et on se retrouve dans SoftICE ici:
:0043D1E5 64FF30        push dword ptr fs:[eax]
:0043D1E8 648920        mov dword ptr fs:[eax], esp
:0043D1EB 8B45FC        mov eax, dword ptr [ebp-04]
:0043D1EE E81D170000    call 0043E910
:0043D1F3 E967020000    jmp 0043D45F                     ; *ICI*
:0043D1F8 8B45FC        mov eax, dword ptr [ebp-04]
:0043D1FB 8B80B0010000  mov eax, dword ptr [eax+000001B0]
:0043D201 E842FAFEFF    call 0042CC48
:0043D206 84C0          test al, al
:0043D208 E8DF28FDFF    call 0040FAEC
On voit qu'à l'adresse :0043D1EE, on trouve un Call 0043E910 qui nous envoie
sur la boite de dialogue que nous voulons craquer.
Juste en dessous on trouve un jmp 0043D45F. Le programme va donc nous faire sauter
jusqu'a cette adresse. Etant donné que nous sommes à l'offset :43D1F3 et qu'on nous
envoie a l'offset :43D45F on peut se demander à quoi sert la partie de code que nous
allons sauter. Après tout, 0x43D45F - 0x43D1F3 = 0x26C ce qui fait en Décimal: 620.
620 octets inutilisés? Assez de place pour écrire une petite routine...pour lancer
une impression !!
On va essayer de trouver les 2 autres appels.
Appuyez sur Edit/Copy et recommencez (F12 - OK) et vous tombez ici:
:0043D51B 894DF4       mov dword ptr [ebp-0C], ecx
:0043D51E 894DF0       mov dword ptr [ebp-10], ecx
:0043D521 8BF0         mov esi, eax
:0043D523 33C0         xor eax, eax
:0043D525 55           push ebp
:0043D526 6811D84300   push 0043D811
:0043D52B 64FF30       push dword ptr fs:[eax]
:0043D52E 648920       mov dword ptr fs:[eax], esp
:0043D531 8BC6         mov eax, esi
:0043D533 E8D8130000   call 0043E910
:0043D538 E9B9020000   jmp 0043D7F6                 ; *ICI*
:0043D53D 33C0         xor eax, eax
:0043D53F 55           push ebp
:0043D540 68EFD74300   push 0043D7EF
:0043D545 64FF30       push dword ptr fs:[eax]
:0043D548 648920       mov dword ptr fs:[eax], esp
Ici, on nous fait sauter 697 octets!

Puis maintenant, Log/Save... (et encore F12 - OK) et vous tombez ici:
:0043DCDE 33C0         xor eax, eax
:0043DCE0 55           push ebp
:0043DCE1 68C3DD4300   push 0043DDC3
:0043DCE6 64FF30       push dword ptr fs:[eax]
:0043DCE9 648920       mov dword ptr fs:[eax], esp
:0043DCEC 8BC3         mov eax, ebx
:0043DCEE E81D0C0000   call 0043E910
:0043DCF3 E9B2000000   jmp 0043DDAA                      ; *ICI*
:0043DCF8 8B83AC010000 mov eax, dword ptr [ebx+000001AC]
:0043DCFE 8B10         mov edx, dword ptr [eax]
:0043DD00 FF5230       call [edx+30]
Et là, on saute 178 octets!
Comprendo?
C'est un peu à hurler de rire non? Ils auraient pu mettre un panneau de signalisation
avec écrit dessus: 'Hého! c'est là qu'on a patché le programme !'.
Ils ont simplement rajouté un appel à la boite de dialogue (Call xxxxxxxx) suivit
d'un saut (jmp xxxxxxxx) qui nous fais sauter chacune des routines de l'impression,
de la sauvegarde et du Copier/coller.
Craquons tout ça vite fait bien fait:
1ère occurence (Print):
Nous avions:
:0043D1EE E81D170000    call 0043E910
:0043D1F3 E967020000    jmp 0043D45F                      
:0043D1F8 8B45FC        mov eax, dword ptr [ebp-04]
On le change par:
:0043D1EE E905000000    jmp 0043D1F8                     ; *ICI*
:0043D1F3 E967020000    jmp 0043D45F 
:0043D1F8 8B45FC        mov eax, dword ptr [ebp-04]
2ème occurence (Edit/Copy):
Nous avions:
:0043D533 E8D8130000   call 0043E910
:0043D538 E9B9020000   jmp 0043D7F6
:0043D53D 33C0         xor eax, eax
On le change par:
:0043D533 E905000000   jmp 0043D53D                      ; *ICI*
:0043D538 E9B9020000   jmp 0043D7F6
:0043D53D 33C0         xor eax, eax
3ème occurence (Save Log):
Nous avions:
:0043DCEE E81D0C0000   call 0043E910
:0043DCF3 E9B2000000   jmp 0043DDAA
:0043DCF8 8B83AC010000 mov eax, dword ptr [ebx+000001AC]
On le change par:
:0043DCEE E905000000   jmp 0043DCF8                      ; *ICI*
:0043DCF3 E9B2000000   jmp 0043DDAA
:0043DCF8 8B83AC010000 mov eax, dword ptr [ebx+000001AC]



3/ NOTE A L'ATTENTION DES NEU-NEUS:

Etant donné que mon e-mail est pleine de courrier du genre:
"Comment tu fais avec W32Dasm pour editer les offsets d'un programme", je pense
qu'il est temps de faire une petite parenthèse ici, car je ne répondrai pas à
à toutes ces conneries!
1/ Tout d'abord, W32Dasm est un Désassembleur. Il désassemble pour montrer le code
et c'est TOUT (et c'est déjà pas mal).
2/ On N'EDITE PAS les offsets ni les segments mais les OCTETS (Bytes en Anglais).
   Les OFFSETS (et les SEGMENTS) ne sont que des adresses où se trouvent les Octets.
3/ Pour éditer/modifier un programme, on utilise un EDITEUR HEXADECIMAL.

Essayer d'éditer des offsets avec un désassembleur, c'est à peu près équivalent
à créer une page HTML avec WinZip.

Pour éditer, utilisez HIEW566 (qui tourne sous DOS et est très rapide contrairement
a W32Dasm pour rechercher des octets ou du texte -:) comme ça:

- Tapez HIEW + Le_Nom_De_Votre_Programme
- Appuyez sur F4 (ou Entrée) pour sélectionner le mode Decode.
- Recherchez la séquence d'octets qui vous interesse en tapant F7 et en entrant
  les OCTETS que vous recherchez dans la zone Hex.
 

Par exemple, dans notre 1ere occurence:  
 

(SEGMENT):OFFSETS OCTETS CODE ASM
:0043D1EE E81D170000 call 0043E910 
:0043D1F3 E967020000 jmp 0043D45F
:0043D1F8 8B45FC mov eax, dword ptr [ebp-04] 
On veut le remplacer par
:0043D1EE E905000000 jmp 0043D1F8
:0043D1F3 E967020000 jmp 0043D45F
:0043D1F8 8B45FC mov eax, dword ptr [ebp-04]
Par conséquent on va rechercher les OCTETS à changer, donc ici, E81D170000.
Mais attention: il ne faut pas rechercher une petite séquence d'Octets mais le plus
possible, car on peut trouver d'autres séquences identiques à celle qu'on cherche
dans d'autres zones du programmes mais qui ne signifient pas du tout la même chose.
Donc, on ne va pas rechercher uniquement E81D170000, mais aussi les octets qui suivent
ou précèdent ( au moins 10 octets voire plus pour certains programmes) soit:
>> E81D170000E9670200008B45FC.

Une fois que vous avez trouvé ça, déplacez le curseur sur la ligne du dessous et
appuyez à nouveau sur F7, pour voir s'il n'y a pas d'autre(s) occurence(s).
Si HIEW vous répond 'Target not found' vous êtes (presque) sauvé.
Positionnez le curseur sur les 2 premiers octets à modifier (ici E8) puis tapez F3
pour entrer les nouveaux octets (ici E905000000 ).
Ensuite appuyez sur F9 pour enregistrer vos modifications ou ESC pour annuler.
Pour quitter, appuyez sur F10.

Si vous ne comprenez toujours pas, cliquez > *ICI*

FIN DE LA PARENTHESE POUR NEU-NEUS 


Bon, nous avons ré-activé les options qui nous manquaient et nous nous sommes débarrassé
des neu-neus.
Il ne nous reste plus qu'à nous occuper de la limitation View Log 'Maximum of 5 items
displayed in the unregistered version.'.
Comme vous avez pu vous en apercevoir, les programmeurs de chez SpyWindows ne sont
pas vraiment des flèches ni des experts de la protections (de quoi douter de la fiablité
de leurs programmes) Nous devrions donc n'avoir aucune difficulté à craquer ça.
C'est presque dommage.
Recherchons dans la liste des String Data Ref la phrase 'Maximum of 5 items...'.
On la trouve:
* Referenced by a (C)onditional Jump at Address:0043EC38
:0043EC60 83FB06            cmp ebx, 00000006            ; < * Intéressant ! *
:0043EC63 7535              jne 0043EC9A
:0043EC65 8D45F8            lea eax, dword ptr [ebp-08]
:0043EC68 50                push eax
:0043EC69 C745F005000000    mov [ebp-10], 00000005
:0043EC70 C645F400          mov [ebp-0C], 00
:0043EC74 8D55F0            lea edx, dword ptr [ebp-10]
:0043EC77 33C9              xor ecx, ecx
* Possible StringData Ref ->"Maximum of %d items displayed "
                          ->"in unregistered version."
:0043EC79 B8FCEC4300        mov eax, 0043ECFC
:0043EC7E E83177FCFF        call 004063B4
:0043EC83 8B55F8            mov edx, dword ptr [ebp-08]
On voit tout de suite le cmp ebx, 00000006 qui, si on a atteint la limite, nous
écrira sur la  ligne notre  'Maximum of 5 items...'.
On voit aussi que cette routine est appellée à l'adresse :0043EC38 par un Jmp (C)onditionnel.
Regardons cette adresse (qui se trouve juste au dessus):
:0043EC34 43                inc ebx                      ; ebx:=ebx+1
:0043EC35 83FB06            cmp ebx, 00000006            ; ebx=6?
:0043EC38 7D26              jge 0043EC60                 ; Si ebx>=6 -> 'Maximum of items...'
:0043EC3A 8D4DF8            lea ecx, dword ptr [ebp-08]  ; Sinon on continue...

Là encore, c'est à hurler de rire. Au même endroit le programme additionne 1 à la valeur
de ebx, vérifie s'il n'est pas plus grand ou égal à 6 puis si c'est le cas, va afficher 
'Maximum of 5 items...'.
On le craque:
:0043EC34 90                nop                          ; No Operation
A chaque fois que le programme passera par là, ebx ne sera plus augmenté d'une unité mais
restera égal à sa valeur initiale : 0 (vous pourrez vérifier avec SoftICE en mettant
un BPX 0043EC34 puis en regardant dans les registres la valeur de ebx).

Attention à ne pas vous tromper en patchant cette partie de code, car il en existe une autre presque identique dans le programme.
Voila, maintenant que nous avons ré-activé les fonctions de ce programme nous allons 
pouvoir l'évaluer avec plus de précision...
4/ CONCLUSION
Ce cours vous a montré que, hélas, même les programmes bridés ne nécessitants pas de mot
de passe peuvent être transformés en versions complètes avec une simplicité enfantine
(mais ne vous rejouissez pas trop vite car le jour où nous craquerons W32Dasm, ça sera
un peu moins rigolo -on fera ça avant la fin de l'année 97! -:).
Le problème est toujours le même: le fric ! On écrit n'importe quoi, n'importe comment
le but étant de vendre et seulement de vendre ses softs (bonjour à Micro$oft...). Avec
les languages de programmations actuels, on n'a plus besoin de savoir comment marche un
PC, ce qu'est l'assembleur, les registres bref on s'en tape et on écrit des monstruosités
avec des pseudo-protections à pisser de rire. Je devrais dire 'à pleurer' puisque ça devient
extrêment lassant et chiant pour un très bon Cracker de n'avoir plus rien à se mettre
sous la dent. C'est pour cela que les meilleurs d'entre eux disparaissent d'Internet:
ils se font chier!
Mais je ne suis pas là pour vous décourager, bien au contraire. Si vous prenez du plaisir
à craquer et apprendre, alors continuez, ne vous arrêtez pas. Et puis le 'cracking', ça
ne concerne pas uniquement les sharewares, démos ou même l'informatique. Ca touche tout.
Tenez, j'ai toujours craqué tous les programmes que j'ai eu: de ce premier jeu stupide
de Star Trek en Basic que j'avais trouvé il y a longtemps pour mon 'ordinateur' Oric 1
(à l'époque on utilisait pas de disquettes, mais des cassettes audios pour enregistrer
les programmes) jusqu'à SoftICE ou W32dasm. Mais j'ai aussi toujours 'craqué' ce qui
ne me plaisait pas, du premier jeu electronique (Morpion) de mon petit frère (je ne
supportais pas de perdre) jusqu'à ma connections Internet (je ne supporte pas de payer
pour ça) en passant par le Trésor Publique et Telecom (je ne supporte pas les cons).
Bref, continuez et n'arrêtez JAMAIS d'apprendre, encore et encore. Ca vous servira
un jour ou l'autre, croyez-moi.
En cette période de rentrée scolaire, n'oubliez pas pour notre prochain cours de vous munir
d'un joli cahier pour prendre des notes, du stylo que Maman a offert après les résultats
du bac, de vos livres sur l'Assembleur ainsi que de mettre SoftICE dans votre cartable.
Nous allons bientôt passer à la vitesse supérieure; l'introduction au Cracking ne peut pas
durer indéfiniment...
5/ EXERCICE
Pour ceux que ça interesse, sachez que vous trouverez a www.spyWindows.com un autre
programme nommé TopToBottom V4.0 Win95 qui n'est autre que la version Pro de DLLCheck95
(avec + de fonctions interessantes).
Vous pouvez vous faire la main en le craquant aussi. Mais attention, son schéma de 
protectionest proche de ce que nous venons de voir à quelques différences près.
Pour le craquer vous utiliserez la même méthode que celle étudiée ici. Une fois craqué,
testez-le intensivement pour voir si vous n'avez rien oublié car il se pourrait qu'il
reste encore un nagscreen et une fonction désactivée quelque part.
Vous pouvez toujours m'envoyer votre travail et je publierai les meilleurs cracks
à la suite de ce cours!
Frog_s_Print@ThePentagon.com
 Retour