Cours de Crack #3
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
Index
- INTRODUCTION
- EXECUTION DU CRACK
- NOTE A L'ATTENTION DES NEU-NEUS
- CONCLUSION
- 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 occurrences. 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!
- 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).
- 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.
- 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 6è 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