THJ19/Introduction au cracking
Un article de HackaWiki.
Pour inaugurer cette nouvelle rubrique, nous reprenons les bases de l'utilisation d'un désassembleur et d'un éditeur hexadécimal, avec un exemple simple, afin de préparer une suite d'articles de difficulté croissante.
Newbie
By Silkscalp
Sommaire |
Introduction
Pour commencer qu’est-ce que c’est que « cracker » ou « reverser » un programme ?
Cracker, c’est vulgairement modifier un programme à quelques endroits pour enlever les protections mises par l’éditeur, afin de l'utiliser sans le payer. Reverser, c'est déterminer le fonctionnement algorithmique d'un logiciel sans pour autant avoir accès à son code sources. Cette discipline possède beaucoup d'applications en sécurité en informatique : analyse d'exploits inconnus, de virus, de chevaux de Troie, de malwares et plus généralement de tout programme suspect, recherche de vulnérabilités, etc. Le reversing permet aussi de modifier le comportement d'un programme (ajout de fonctionnalités, traduction, etc.). On voit que le cracking est inclus dans le reversing.
Alors pourquoi s'intéresser au cracking, si c'est un sous-domaine « vulgaire » ? En fait, le cracking est une excellente manière d'appréhender le sujet et d'apprendre les bases de l'assembleur ou des outils de reversing. C'est plus facile, et les résultats sont plus directs. Savoir cracker ne signifie pas seulement faire sauter des protections, mais aussi comprendre le fonctionnement de certaines parties du programme (savoir reverser c’est comprendre le programme dans son intégralité). De plus, cela permet d'étudier les protections logicielles. On apprendra, au fur et à mesure de cette rubrique, à évaluer et à concevoir de telles protections. Enfin, apprendre des notions de cracking aide à mieux programmer : on y gagne une vision plus juste du fonctionnement de programmes informatiques, plus proches de la réalité matérielle (notamment à cause du travail en asm). On se retrouve aussi à maîtriser les outils et les méthodes de debugging bien plus à fond qu'on ne pouvait l'imaginer.
Bref, derrière se terme cracking qui a mauvaise réputation, se cachent des perspectives tout à fait intéressantes, légales et légitimes. Et ce, même si le cracking peut être utilisé pour retrouver le serial égaré d’un programme acheté légalement (rigolez pas c’est déjà arrivé à des copains).
Les outils
Un cracker ne peut pas se lancer sans ses outils ni quelques connaissances préalables.
Quelques notions de bases concernant l'assembleur sont données en encadré. Commençons par voir les différents types d'outils, que nous apprendrons à utiliser par la suite.
Note : on peut télécharger la plupart de ces outils sur http://protools.cjb.net/. Comme nous ne pouvons garantir l'authenticité des fichiers présents sur ce serveur, nous vous conseillons d'utiliser un antivirus.
Les Désassembleurs
Le déassemblage consiste à analyser le code machine d'un programme, un driver, une bibliothèque, etc. pour extraire une représentation compréhensible, en ASM, de son fonctionnement. Certains désassembleurs intègrent un petit débogueur (WDASM par exemple). D’autre offrent des fonctionnalités avancées comme le scripting (vous verrez plus tard que cela peut être très utile, par exemple pour désassembler un programme packé), ou des aides à la manipulation du listing ASM (renommer les noms des routines, ce qui rend la compréhension plus aisée, comme le permet IDA).
WDASM : Maintenant gratuit. Certains reversers de haut vol proposent même gracieusement des patchs pour ce programme, qui donnent des fonctionnalités supplémentaires très utiles (et utilisées) : traductions , mode spécial pour le Visual Basic, etc. (Voici un bon exemple de l’avantage important de savoir reverser.) IDA : Il existe une version light, gratuit. La version Pro, payante, est bien plus impressionante, notamment à cause d ses nombreux plugins pour énormément de formats d'exécutables et type de processeurs. http://datarescue.com.
Les débogueurs
Ils offrent plus de possibilités qu’un ‘simple’ désassembler et sont chouchoutés par les reversers (vous allez comprendre pourquoi). Les débogueurs permettent d'examiner le code d’un programme en mémoire vive, pendant son exécution.
Avec un débogueur on peut voir pas à pas (ligne par ligne) ce que fait un programme. On peut donc suivre le programme dès sa 1ere instruction, et aussi l’interrompre à un moment choisi avec des points d’arrêt appelés Break Point (BP). Ces BP peuvent être placés sur des adresses mémoire, sur des fonctions appelées (les API par exemple), sur des accès à des zones mémoires indiquées… . On peut aussi voir l’évolution du contenu des registres au fur et à mesure de l’exécution d’un soft et donc mieux comprendre ce que fait le programme avec les données. C'est pourquoi ils sont très utilisés par les développeurs, lorsqu'ils tentent de comprendre pourquoi leur programme ne fait pas ce qu'il devrait.
Soft-ice : Très puissant car il travaille en ring 0 (donc peux prendre la main avant le lancement de Windows). Mais il reste difficilement utilisable sur une plateforme Windows postérieure à 98SE, dans sa version classique : certaine API ne sont pas reconnu, problèmes pour l’installer et le lancer… Il est payant, et édité par Numega.
Ollydbg : Plus récent et plus moderne, c'est le standard actuel. Il propose des fonctions avancées comme les dumps, les scripts, et les plugins. Gratuit : http://home.t-online.de/home/Ollydbg/.
Editeur Hexadécimal
Ce genre d'éditeur permet d'ouvrir un fichier quelconque et de le modifier. Les données qu'il contient peuvent être représentées de diverses manières, et notament sous la forme de nombre hexadécimaux.
Exemples : Hiew, hexworkshop, winhex, Hedit.
Certains sont gratuits d’autres payant. Je vous encourage a utilisé ceux qui sont gratuits car les fonctionnalités avancé des logiciels payants ne nous servira presque jamais (on pourra toujours émuler la fonctionnalité).
Un éditeur/désassembleur libre et multi-plateformes prometteur : http://hte.sf.net.
Analyse du PE
Il en existe deux types : les analyseurs de protection et les analyseurs de PE (le format exécutable de Windows). Parfois certains font les deux. Les analyseurs de protection servent à voir si le programme cible a été protégé (parfois dans quel langage il a été conçu, avec StudPe par exemple), et si la cible est protégée il indique par quel type de protection (on obtient le nom du logiciel utilisé pour packer/protéger le soft).
Exemples d'analyseurs de protection : PeID, PE-scan, PEsniff, StudPE … (ces programme servent juste à indiquer la protection utilisée). Les éditeurs de PE : ProcDump (qui est aussi un unpacker générique et scriptable), StudPE (qui fait aussi analyseur de protection), LordPE. Dans la volée, on peut aussi citer quelques unpackers spécifiques, comme DeAsprotect, UnUPX.
Quelques uns ont été présentés dans le THJ13.
Editeurs des ressources
Ces programmes permettent de modifier les ‘ressources’ d’un programme (toutes les données, textes, icones, etc.). On peut par exemple s'en servir pour traduire un programme, ou changer l'interface (dégriser certains boutons peut être utile).
Exemple : ResGrabber, parmi pas mal d’autres.
Utilitaires de monitoring
Il est très intéressant de pouvoir surveiller les activité d'un programme : quels fichiers sont accédés, quelles sont les modifications qu'il fait à la base de registres, quels API utilise-t-il ?
Exemples : Filemon, Regmon, Apimon (tous disponible en freeware sur http://www.sysinternals.com).
Les deux types d'outils obligatoires sont les débogueurs/désassembleurs et les éditeurs hexadécimaux (quoique que l'on peut parfois pour certain cas simple ne se servir que d'un éditeur hexa, comme nous le verrons plus tard).
Un exemple
Pour commencer, analysons une routine banale sans protections particulière. Nous travaillerons sur un crackme spécialement réalisé pour cet article (à télécharger sur http://feedback.thehackademy.net).
Les seuls outils dont on a besoin : WDASM (désassembler) et un éditeur hexadécimal quelconque (WINHEX, par exemple).
Armé de ces deux programmes, la réflexion du cracker est la suivante :
- Le programme veut que je lui donne un numéro de série.
- Le numéro que je donne sera comparé au bon quelque part afin d’accepter ou de refuser ce sérial
- Si je trouve l’endroit où cela se fait je pourrais sûrement modifier le résultat de la comparaison
- Je peux faire la modification avec mon éditeur hexadécimal.
String references
C’est parti, après avoir réfléchi intensément à l’aide de trois tasses de café (la première pour le plaisir…), le cracker va lancer son désassembleur et ouvrir sa cible comme il le fait pour ouvrir un document dans un éditeur de texte, et tombe sur un listing assembleur (Voir la capture 1).
En faisant « Goto » puis « Goto Code Start » (ou en descendant manuellement la fenêtre si on veut voir les informations affichées) on arrive au début du code. Voir la capture 2.
Cet écran présente le code sous cette forme :
Il faut maintenant trouver le bon endroit à modifier, parmi plus de 2000 lignes d’un langage presque incompréhensible. Ce n’est pourtant pas si dur, quelques indices peuvent nous aider.
Si on clique sur les ‘String Data References’ on obtient certaines chaînes de caractère qui se trouvent dans le programme, comme le texte qui est dans des boites de dialogue ou des titres (attention, on n’obtient pas toujours les même chaîne avec des versions différentes de WDASM ou encore IDA). Nous utilisons ici WDASM 8.93 avec le patch VB, puisque le crackme a été fait dans ce langage (sans ce patch, il manque de nombreuses références). En cliquant sur le deuxième item en partant de la droite (dans la barre des menus), on tombe sur une fenêtre similaire à la capture 3.
Et là !! On voit des morceaux de texte très intéressant comme 'bien reussi’ et 'CRACKÉ’, qui laissent penser que c’est le bon chemin. D’un autre coté on voit 'foiré’ et 'nul’. Après avoir lancé le programme et rentré un faux code on obtient la confirmation que ‘nul’ et ‘foiré’ correspondent au titre et message de la boite d’erreur en cas de mauvais serial.
Si l’on double-clique sur ‘CRACKE’ dans la liste des références, on tombe sur la capture 4.
Trouver le saut
On note d'abord qu'il y a un saut quelques lignes avant la référence :
004020C3 74 7E je 00402143
Si on recherche les SDR mais qu’on double clique sur 'nul’, on tombe sur une autre portion du code donné dans la capture 5.
On voit ici que le programme peut arriver dans cette partie du code, qui dit que le serial est mauvais, à partir d'un saut inscrit à l'adresse 004020C3 : « Referenced by and (U)nconditional ou (C)onditional Jump at Address : 004020C3 (C) ». Le (C) indique que le saut est conditionnel, il s'agit bien du JE (saut provoqué en cas d'égalité des valeurs lors du dernier test réalisé) que l'on a vu plus haut.
Si on récapitule, il y a donc un saut qui empêcher d'arriver à la partie 'CRACKÉ’ et renvoi directement à la partie 'nul'. Le réflexe du cracker est de modifier ce saut pour ne plus aller sur le message d'erreur lorsque le serial n'est pas le bon, mais au contraire d'exécuter la partie qui valide l'enregistrement.
Si on clique sur la ligne d’adresse 004020C3, celle-ci change de couleur (chez moi je passe du bleu au vert), ce qui indique que l’on peut suivre le saut. Si l’on clique sur la flèche droite on va à l’adresse destination du saut, ce qui permet de voir rapidement où on est envoyé, puis de revenir au saut grâce à la combinaison Ctrl + flèche gauche. On tombe bien sur la partie 'nul’. On sait que c’est ce saut que l’on doit modifier.
Modifier le saut
Il ne reste qu'à désactiver ce JE 00402143. Il y a deux solutions qui se présentent (beaucoup plus en fait mais commençons par le plus simple) :
- Transformer le JE par son opposé : JNE. De cette façon, le saut aura lieu dans les conditions inverses que précédemment, c'est à dire uniquement lorsque l'on donne le bon serial (le saut n'aura donc pas lieu avec tous les autres serials, c'est ce que l'on cherche). La même logique peut s’appliquer à tout les saut : JLE est l’inverse de JG (G: greater, LE: less or equal), etc.
- Supprime purement et simplement la ligne qui nous dérange. On appelle cela ‘nooper’ : c’est remplacer chaque octet par 90, la valeur hexa de NOP, instruction qui ne fait rien par définition.
On doit cependant veiller à ce que le nombre d'octets reste le même. On ne peut pas changer simplement une instruction par une autre, codées sur plus ou moins de bytes (Rappel : 1 octet= 1 byte = 8 bits), ou simplement supprimer les octets de l'instruction que l'on veut supprimer. Sinon, on créerait un décalage dans tout le programme. On peut cependant remédier à ce problème dans certains cas, et modifier la taille d'un programme (voir l'article de Virtualabs dans le Manuel 13), mais ce n'est pas ce qui nous intéresse ici. Si on choisit de nooper le test, ici, il faut donc placer deux NOP (90 90) à la place des deux octets de l'instruction (74 7E). Si on inverse le saut, on les remplacera par une instruction qui prend la même place (75 7E) : pas de problème.
Pour plus de sûreté, on va travailler sur une copie du programme, afin de garder un exemplaire original (donc non modifié). On ouvre donc une copie avec un éditeur hexadécimal et avec WDASM simultanément, et on se positionne sur le saut que l’on veut modifier en cliquant dessus.
On regarde en bas dans WDASM et on voit :
Maintenant il faut savoir ce qu’est un offset. C’est un nom représentant un déplacement par rapport à un point, en l’occurrence le début du fichier mappé en mémoire, ici l'image base.
Cet offset correspond à la numérotation des « lignes » dans un éditeur hexadécimal. Ce qui veut dire qu’à la position 20C3h (h=hexadécimal) on trouvera le 747E que l'on veut remplacer par 9090 ou 757E.
Dans l'éditeur hexadécimal, on cherche donc la position 20C3.
On vérifie qu’on est au bon endroit : en bas de l’éditeur WINHEX est indiqué l’offset où se trouve le curseur. On modifie par ce qu’on a décidé précédemment (c’est pour voir si vous suivez) on obtient :
On sauvegarde sous un nouveau nom (pour plus de sécurité si on n’est pas sûr) et on peut maintenant lancer l’exécutable cracké. Le programme accepte bien n’importe quel numéro de série (sauf le bon). Il va de soit que ce programme n’a pas de protection proprement dite (techniquement il n’y a pas de protection). Mais cracker un programme c’est ça : modifier quelques octets aux bons endroits.
La suite dans le prochain numéro. Au programme ? L’utilisation simple d’un débogueur comme Ollydbg afin de montrer les éléments n’apparaissant pas avec un désassembleur et une introduction aux programmes packés.
