Introduction au cracking (le cas basique) :

En guise de petite introduction au cracking, je vais vous expliquer, à titre informatif, comment cracker un des clients IRC (sûrement le plus utilisé actuellement sur windows).

L’outil utilisé pour y parvenir est le débogueur OllyDbg.

Il faut ouvrir le logiciel que l’on souhaite cracker avec OllyDbg pour pouvoir analyser son comportement. On lance donc en premier OllyDbg, puis « File -> Open » pour indiquer où se trouve le logiciel.

Première chose : lancer le logiciel. Sur OllyDbg, touche « F9  » ou « Debug -> Run ».

Je ferme toutes les boîtes de dialogue du logiciel en question (sur celui-ci, il y en a deux qui s’affichent au démarrage), et je cherche dans le menu où est-ce que je peux entrer les informations d’enregistrement.

 

L’enregistrement :

Une fois ce menu trouvé, une boîte de dialogue apparaît me demandant mon nom et mon code d’enregistrement.

Dans l’API windows, c’est la fonction DialogBoxParam qui est utilisée pour créer cette boîte de dialogue.

Je retourne sur OllyDbg et je place un breakpoint sur chaque appel de DialogBoxParam. Dans la fenêtre CPU, partie code assembleur, je fais un clique droit -> « Search for » -> « Name (label) in current module » (CTRL+N) pour ensuite cliquer droit sur « USER32.DialogBoxParamW » et choisir « Set breakpoint on every reference ».

Je retourne maintenant dans le menu d’enregistrement pour cliquer dessus. OllyDbg devrait break avant l’affichage de la boîte de dialogue, me demandant mon nom et mon code d’enregistrement.

Il faut maintenant se rendre dans la fonction qui gère les messages de cette boîte de dialogue. Si je regarde sur la partie de la fenêtre CPU réservée à la pile, je vois l’adresse de cette fonction. Elle se nomme « DlgProc ». Il me suffit de taper « entrer » dessus.

Me voilà dans la fonction qui va traiter chaque évènement de cette boîte de dialogue. Avec l’API windows, je sais que pour obtenir le texte d’un contrôle il faut utiliser le message « WM_GETTEXT ». Je vais donc chercher ce message dans la fenêtre CPU au niveau du code assembleur.

Quelques lignes plus bas, je peux voir deux fonctions nommées « SendDlgItemMessageW » qui utilisent ce message (WM_GETTEXT). Ces fonctions sont utilisées pour obtenir le texte des contrôles me demandant mon nom et mon code d’enregistrement.

Je place un breakpoint juste après ces deux fonctions, il suffit pour cela de double cliquer sur les bytes correspondants à la ligne ou F2 (l’adresse de la ligne devient rouge) puis de continuer l’exécution du logiciel avec la touche F9.

La boîte de dialogue apparaît et me demande d’entrer les informations, je vais entrer « opc0de » en tant que nom et « azertyuiop » en tant que code d’enregistrement puis valider.

Je retourne dans OllyDbg qui s’est arrêté sur mon breakpoint placé après les deux WM_GETTEXT. Il s’agit maintenant de continuer pas à pas, c’est à dire touche F7 ou F8. J’ai supposé qu’une fonction devait vérifier si ce que je viens d’entrer est correct. Je sais qu’en assembleur, le retour d’une fonction se trouve dans le registre EAX. J’ai donc cherché chaque instruction qui testait ou comparait ce registre après un call dans le code, pour finir sur la bonne fonction se trouvant juste avant un « Sleep » de 1000 ms.

1
2
3
4
5
6
CALL logiciel.adresse
ADD ESP,0C
TEST EAX,EAX
JE logiciel.adresse
PUSH 3E8
CALL DWORD PTR DS:[]


 

Une fois trouvée, j’entre dans la fonction du CALL logiciel.adresse avec la touche F7. Pour assembler deux instructions je clique droit sur « Assemble » ou touche espace. La première : MOV EAX,1 puis à la suite, la deuxième instruction RET.

Je continue l’exécution du programme pour voir ce qu’il se passe avec F9. OllyDbg break encore sur DialogBoxParamW, je passe donc toujours avec F9.

Et là, une nouvelle boîte de dialogue apparaît me confirmant mon enregistrement!

Cette partie étant réglée, je sauvegarde le binaire par un clique droit sur la fenêtre CPU (partie code assembleur) -> Copy to executable -> All modification -> Copy all. Je ferme la nouvelle fenêtre, puis je répond « oui » et « Enregistrer » pour écraser celui d’origine.

Maintenant, si j’essaie d’exécuter le logiciel en dehors d’OllyDbg, rien ne se passe. Le logiciel a une protection qui contrôle l’intégralité du binaire (CRC) et comme je viens de le modifier, il refuse de s’exécuter.

 

Le CRC :

Pour checker l’intégralité d’un binaire, il faut l’ouvrir puis le lire. Sur windows, cela se fait avec les fonctions CreateFile et ReadFile. Je vais donc recharger le logiciel dans OllyDbg et mettre un breakpoint sur chaque appel de ces fonctions.

Je démarre OllyDbg, et dans File -> Open j’ouvre le logiciel que je viens de modifier. Ensuite, pour placer les breakpoints, je clique droit sur la fenêtre CPU (partie code assembleur) -> Search for -> Name (label) in current module (CTRL+N) et, clique droit sur KERNEL32.CreateFileW et KERNEL32.ReadFile pour choisir Set breakpoint on every reference.

Maintenant je peux run le logiciel avec F9. Je tombe alors sur le premier breakpoint, le premier CreateFileW dont il faut regarder le nom du fichier qui va être ouvert, dans mon cas il s’agit bien du logiciel. Je garde donc en tête l’adresse de la valeur de retour du CreateFileW qui correspond au handle du fichier.

Je continue l’exécution (touche F9) pour tomber sur un nouveau breakpoint qui correspond à un ReadFile. Une fois rendu ici, je commence par comparer les handles, qui, dans mon cas, correspondent parfaitement.

La fonction ReadFile prend en argument un pointeur sur le buffer qui va contenir ce qui va être lu. Je vais poser un breakpoint pour stopper l’exécution lorsque ce buffer sera lu. Dans la fenêtre CPU, sur la partie qui correspond à la pile, je vois l’adresse de ce buffer. Je clique droit dessus et je choisis « Follow in Dump ». Ensuite, dans la partie de la fenêtre CPU correspondant au « Hex dump », je me place sur le premier byte pour y faire un clique droit -> Breakpoint -> Hardware, on access et choisis Dword.

Je run (F9) et je tombe sur le Hardware breakpoint où j’y vois la ligne suivante :

1
REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]


 

On voit donc qu’il met tout dans ES:[EDI]. Je vais refaire un Hardware breakpoint mais ce coup-ci sur ES:[EDI]. Dans la fenêtre CPU, dans la petite partie entre le code assembleur et la partie « Hex dump », j’y vois l’adresse de ce ES:[EDI]. Je me place dessus puis clique droit et « Follow address in Dump ». Je me replace, dans « Hex dump », sur le premier byte puis clique droit puis Breakpoint -> Hardware, on access et rechoisis Dword.

Pour ne pas retomber sur le Hardware breakpoint 1, je le delete : menu Debug -> Hardware breakpoints -> Delete 1 et valide. Je désactive également tous les autres breakpoints : menu View -> Breakpoints et je supprime tout.

Je run (F9). Je tombe alors sur une grosse boucle qui a l’air de checker si c’est correct. A la première sortie de la boucle dans laquelle je suis tombée, je vois une comparaison et un saut qui n’est pas effectué :

1
2
CMP EAX,-1
JE SHORT logiciel.0044B123


 

Je décide de prendre ce saut en remplaçant (touche espace sur la ligne) ce JB par un JMP. Le code devient donc :

1
JMP SHORT logiciel.0044B123


 

Avec ce saut, je me retrouve à la ligne juste après la boucle qui, je suppose, check le CRC. Ensuite, je delete le Hardware breapoint 2 : menu Debug -> Hardware breakpoints -> Delete 2 et OK. Je run à nouveau (F9) et le logiciel se lance. Je vérifie et je vois qu’il est bien enregistré en tant qu’opc0de. Le logiciel est donc cracké ! Il faut enregistrer notre travail car ce n’est pas finit.

 

L’espèce d’anti-crack :

Si vous utilisez le logiciel tel qu’il est maintenant, vous remarquerez qu’au bout d’environ 10 minutes d’utilisation, vous ne serez plus enregistré et qu’à son prochain démarrage, vous ne le serez plus du tout.

Donc il doit y avoir dans notre logiciel une routine qui doit revérifier si notre enregistrement est correct et supprimer quelque chose qui, je suppose, se trouve dans la base de registre.

Relançons notre logiciel dans OllyDbg, puis rendons-nous sur notre channel favoris, mettons des breakpoints à l’appel de la fonction fournie par l’api win32 pour delete une donnée dans la base de registre, cette fonction se nomme : RegDeleteKeyW.

Donc, fenêtre CPU, partie code assembleur, clique droit -> « Search for » -> « Name (label) in current module » (CTRL+N), clique droit sur « ADVAPI32.RegDeleteKeyW » et choisir « Set breakpoint on every reference ».

Au bout d’environ 10 minutes d’utilisation, OllyDbg break dessus dans une petite routine. Maintenant je regarde dans la stack où est appelée cette routine et je m’y place, je vois bien le call qui nous y amène. Quelques lignes plus haut on peut voir un JNZ qui saute la partie où est exécuté ce call :

1
JNZ logiciel.00FC8756

 

Je pause un breakpoint dessus, je delete tous les autres breakpoints et je relance le logiciel dans OllyDbg. Il n’y a plus qu’à attendre, toujours environ 10 minutes après avoir rejoint un channel.

OllyDbg break sur notre JNZ et on voit bien qu’il n’est pas pris en compte, on le change par un JMP pour être sûr qu’il jump et on voit ce qu’il se passe…

Avec cette modification le logiciel IRC reste enregistré.

Voilà, c’est tout pour ce tutoriel car il n’y a plus rien à faire sur le logiciel irc que j’ai utilisé comme exemple.

Ce contenu a été publié dans Cracking, avec comme mot(s)-clef(s) , . Vous pouvez le mettre en favoris avec ce permalien.

2 réponses à Introduction au cracking (le cas basique) :

  1. regmon dit :

    Bonjour, Grand merci pour le travail que vous faites.

    Je cherche les technique du crack concernant un logiciel sans SDR (avec ollydbg).

    Merci encore

    regmon

  2. Michel dit :

    Bonjour
    Merci pour vos cours. Je suis un débutant dans le cracking. En fait, je suis confronté au problème des SDR (Strings Data) qui n’apparaissent pas dans beaucoup de logiciels. J’ai Unpacké un vieux logiciel de 2001 (qui se ferme en me disant : expired) mais je ne retrouvé toujours pas ce message dans W32dasm ou OllyDBG. Pouvez vous m’aider SVP
    Merci d’avance.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Protected by WP Anti Spam

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.