Initiation au cracking Par Little Bob I Introduction Le shareware, c'est bien. C'est très bien même. Nous allons voir pourquoi... Vous vous êtes sûrement déjà retrouvé devant un logiciel très intéressant, mais qui refuse de fonctionner plus de 30 jours (parfois même 15), ou dont les fonctionnalités principales (sauver, imprimer) sont inaccessibles... Rageant, non ? Je vous propose ici d'apprendre à les cracker (à savoir : retirer la limite de temps, débrider le prog...). Deux méthodes existent pour cracker : la première (la plus facile à utiliser, à mon avis, et que je conseille fortement aux débutants) est le Dead Listing. En gros, on désassemble le programme (avec Win Dasm 8.93), on regarde ce qu'il fait, à quel moment, et on bidouille pour réussir à contourner la limitation shareware. La deuxième, c'est le debugging Live, où il s'agit de savoir ce que fait le programme en temps réel (avec SoftIce), ce qui est beaucoup plus complexe que le Dead Listing. En gros, on lance le programme on suit ce qu'il fait, on trouve l'endroit où il se bride, et on inverse la machine. Attention, il n'y a pas de méthode meilleure qu'une autre, l'idéal étant de toutes les connaîtres et de toutes les utiliser au moment propice. II Matériel nécessaire Un PC Une imprimante Un shareware à cracker Un bouquin résumant les principales fonctions de l'assembleur (50 francs environ) WinDasm 8.93 SoftIce Un éditeur hexadécimal (HexWorkShop est pas mal et sous Windows) Un paquet de clopes (les Lucky Strike sont très bonne pour la réflexion) Du Gin ou du Whisky (moins bon pour la réflexion, mais ça donne du courage) Un cerveau Des mains Des yeux III Théorie Je sais ce que vous pensez : la théorie, on en a rien à foutre, c'est mieux la pratique... Je suis d'accord avec vous ! Seulement, essayez de regarder un Dead Listing sans avoir fait de théorie, vous allez rigoler ! Bon, assez glandé, une gorgé de Gin et on y va... La plupart de ces programmes ont été conçus selon le même schéma : d'abord, on crée la version complète, ensuite on la bride, ce qui signifie que TOUTES les fonctionnalités sont encore dans le programme, mais que certaines ont été rendues inaccessibles... Eh oui ! Ca coûte moins cher de faire comme ça plutôt que de faire deux versions différentes ! Résultat : grâce à leur envie de plein de sous, les programmeurs nous aident à cracker leurs programmes !!! Plusieurs approches pour le faire sont disponibles. On peut essayer de s'amuser à réactiver les fonctions une par une (avec l'aide de WinDasm). Bof... C'est compliqué et ça ne donne pas forcément de bons résultats. On peut essayer de trouver un bon numéro de série (pour les programmes qui en demandent un, évidemment). La méthode est simple (la pratique un peu moins, SoftIce ayant une fâcheuse tendance à tout faire planter). Lancez WinDasm, et cherchez dans le prog la ligne où il nous balance "Mauvais code" ou un truc dans le genre. Notez le numéro de la ligne. Ouvrez le prog à cracker avec le Symbol Loader de SoftIce (je vous l'avais bien dit que les deux ensemble, c'était mieux). Lancez le debugging : normalement, SoftIce (un écran Dos tout moche) devrait s'ouvrir (sinon, Control D). Tapez bpx (ca met un breakpoint) suivi de l'adresse relevée, puis Contol D. Le prog continue à tourner (si SoftIce n'a pas planté entre temps) et allez vite mettre un nom bidon, et un numéro de série pêché au fin fond de votre esprit brumeux (d'autant plus brumeux que c'est déjà la cinquième Lucky depuis le début du debugging du soft, et que la bouteille de Gin y est passée). Faites OK et (O miracle), SoftIce s'ouvre (normal, ça sert à ça un bpx). En fait, il s'est arrêté juste après avoir comparé le numéro de série que vous avez entré avec le numéro valide. En général, il stocke le numéro valide en eax (ou ebx, ecx, edx : ça, ce sont les registres du processeur (sa mémoire, en gros)), sinon, allez zieuter un coup avec WinDasm autour de la chaîne (string) "mauvais code", où ça a été stocké... Sous SoftIce, tapez d eax pour voir ce qu'il y a dans eax. Là c'est plus compliqué : c'est en hexadécimal (pas étonnant). Donc un conseil : notez tout, éteignez l'ordi, prenez vos Luckies, allez au café du coin et commandez une bonne bière. Ensuite, regardez, observez, calculez et essayez de trouver quelque chose (vous aurez inévitablement besoin de connaître les modes de calcul en hexadécimal (ça serait con de se lancer dans le cracking sans les connaître !)). Finalement vous trouvez plusieurs séries de caractères différentes : essayez-les toutes jusqu'à trouver la bonne ! Si le prog est simple et que vous avez de la chance, le code se trouve écrit en ascii dans la colonne de droite. Avec cette méthode, vous n'avez pas vraiment cracké (le prog n'a pas été modifié), vous avez seulement bidouillé. Pour vraiment cracker, il vaut mieux utiliser le Dead Listing, pour regarder ce que fait le prog et quand. Ainsi, au moment de la routine de vérification du code, il fera un test entre le code entré et le bon, et, si ce ne sont pas les mêmes, il fera un saut (je ou jne, en général) jusqu'à la boîte de dialogue " Mauvais code ". L'astuce consiste à inverser le saut, afin que le prog croie que le code est bon alors qu'il ne l'est pas du tout. Attention : il faut inverser le saut de l'enregistrement ET le saut de vérification au lancement du prog (c'est impératif). IV La pratique Bon, pour la pratique, nous allons nous attaquer à Memory Game 95 (http://www.multimania.com/chezlittlebob/mem95.zip). Ce jeu, dont le principe est, il faut l'avouer, plutôt inintéressant, a un côté passionnant pour l'apprenti-crackeur : il reprend point par point les théories que je viens de vous énoncer. C'est une cible parfaite. En plus, il possède une option " unregister " qui permet de refaire plusieurs essais. Commençons par le désassembler avec Win Dasm 8.9. On cherche la ligne " Sorry ! The registration... " (avec la boîte de dialogue " String References ") et on la trouve deux fois : en 00405C50 et en 0040B9BC. Pour vous éviter des recherches, je vous aide un peu : la première est le contrôle effectué au lancement du prog, et la seconde celui effectué à l'enregistrement. C'est donc le deuxième qui nous intéresse pour le moment. Dans Win Dasm, lancez " Load Process " (Ctrl-L). Dans la fenêtre principale, cliquez sur " Goto Code Location " (Shift-F12) et entrez 0040B9BC. Posez un point de break sur cette ligne (Ctrl + Click gauche) et lancez ensuite " Run " dans la fenêtre " process " (une des nombreuses fenêtres ouvertes). Dans le menu " Game " du jeu, lancez " Register ", entrez comme nom : Little Bob, et comme serial : n'importe quoi --> Win Dasm beep et le prog bloque. Retournez dans Win Dasm, et, dans une des fenêtres, cliquez sur edx. Normalement, juste à côté, dans la partie ASCII, vous devriez lire : AC2B8FC94340C598. C'est notre code ! Notez-le, quittez Win Dasm et lancez le jeu, faitez " Register ", entrez le nom, le code, OK : c'est gagné ! ! ! Vous venez de cracker votre premier jeu ! (NB : La même chose aurait pu être réalisée avec Soft Ice.) C'était un peu facile, il faut l'avouer, d'autant plus que le numéro de série n'était pas codé en mémoire. Il se pourrait très bien que vous ne parveniez pas, pour certains (et la plupart) des programmes à trouver ce numéro aussi simplement. Il vaut mieux s'attaquer au programme lui-même. Voyons un peu comment la phase d'enregistrement fonctionne... Lorsque vous entrez un mauvais numéro de série, une fenêtre s'ouvre et vous crie : " Registration... ". C'est bon pour nous. Allez dans Win Dasm, recherchez cette chaîne : vous trouvez deux références décrites plus haut. Encore une fois, la deuxième seulement nous intéresse (pour le moment.) Vous devriez trouver ceci : ------------------------------------------------------------------------------------------ * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0040B744(C) | Possible Reference to String Resource ID=61244: "Sorry, the registration... | :0040B9BC 683CEF0000 push 0000EF3C etc... ------------------------------------------------------------------------------------------ " Referenced... " signifie que cette ligne est appelée par un saut (Jump) conditionnel (C) à l'adresse 0040B744. C'est donc à cette ligne (et celles qui sont autour) qu'il faut aller voir : ------------------------------------------------------------------------------------------ :0040B742 85C0 test eax, eax :0040B744 0F8572020000 jne 0040B9BC ------------------------------------------------------------------------------------------ D'abord il teste un bidule quelconque, ensuite il saute si ce n'est pas égal (à quoi ? ? ?). En clair, il déclare le code mauvais si ce n'est pas égal. Il suffit d'inverser le saut (je à la place de jne) et le tour est joué : prenez un éditeur hexadécimal, recherchez 85C00F8572020000 et remplacez le 0F8572 par OF8472. Désormais, le seul cas où il dira " Sorry, the registration... " sera le cas où vous aurez entré le bon code ! ! ! Donc, afin de faire plus pro, mieux vaut carrément effacer cette instruction en remplaçant le jne par une série de nop (= ne fait rien). Ainsi, il faudra remplacer 0F8572020000 par 909090909090. Cette fois-ci, tous les codes (valides ou non) sont bons ! ! ! Testez votre oeuvre : le prog vous enregistre, tout est OK. Quittez et relancez : il vous crie de nouveau que le code est mauvais. Cela veut dire qu'il vérifie le code à chaque démarrage du jeu, donc qu'il appelle une routine au début : c'est ici que va nous servir la première des deux chaînes trouvées précédemment, inutilisée encore : ------------------------------------------------------------------------------------------ 00405C45 85C0 test eax, eax :00405C47 0F8434010000 je 00405D81 :00405C4D 8B45E4 mov eax, dword ptr [ebp-1C] * Possible Reference to String Resource ID=61244: "Sorry, the registration code does not match! Try again or Ca" ------------------------------------------------------------------------------------------ Le principe est différent (inverse, même) : il teste, si c'est égal il saute par dessus et considére que le code est bon. Même principe que tout à l'heure : soit on inverse (remplacer 0F8434 par 0F8534), soit on remplace non pas par des nop, mais par un saut obligatoire (quoi qu'il arrive, le programme dit : code OK !). Dans ce cas, remplacer 0F8434010000 par E93501000090. Arrivé à ce stade, le programme est entièrement cracké : impossible d'aller plus loin ! Bravo ! ! ! J'espère que ce cours vous aura aidé. En tout cas s'il vous a plu, si vous désirez me poser des questions, me faire des remarques ou des suggestions, n'hésitez pas à me contacter (littlebob57@yahoo.fr), même pour me demander d'écrire un cours spécifique pour un prog. Vous pouvez aussi visiter ma page Web dédiée au cracking (http://www.multimania.com/chezlittlebob/) : vous y serez bien accueilli ! Si, d'aventure, mon URL était changée, mon Email littlebob57@yahoo.fr ne serait pas modifiée : vous pourrez toujours me contacter, pour me demander, entre autres, mon URL actuelle ! Amusez-vous bien et bonne chance ! Little Bob