|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Autres rubriques sur le cracking : Cracker les Times Limits (limitations de temps) et d'autres arrivent !! Introduction. Objectif: Vous donnez toute la base du cracking ou "déplombage" pour que vous puissiez plus ou moins vous débrouillez pour vous faire votre propre crack sur la plupart de vos programmes. Crack
?! Ce qu'il vous faut : Un
désassembleur. C'est un programme qui va en décompiler un autre pour en
voir son code source, pour savoir où se trouve les modifications à faire.
Pour ce cours, nous allons utiliser Windasm 8.9x très facile à utiliser
et qui se trouve un peu partout sur le net (Allez voir dans la rubrique
programmes de hack du site ! partie cracking).
Un éditeur hexadécimal, qui va nous servir à modifier les octets du programme comme Uedit, HexWorkShop, HView,ect... Nous travaillerons avec HView 6.04 mais vous pouvez utiliser celui de votre choix. (Allez voir dans la rubrique programmes de hack du site !). Un cerveau prêt à l'emploi... De la logique et de la patience... Une base d'ASM peut beaucoup vous aider mais n'est pas nécessaire car nous allons voir tout ce qu'il vous faut savoir. Pour commencer, nous allons nous attaquer à un crackme tout simple: Téléchargez-le ici Bon, nous lançons notre petit programme... et on voit une belle fenêtre Windows demandant un sérial. Le problème c'est que nous on le connait pas celui-là, alors comment faire ??? Réfléchissez un peu, dans notre programme il doit y être mis quelque part que quand nous cliquons sur le bouton "Check", le programme doit prendre la valeur du sérial, la comparée avec le bon sérial et si les sérials sont les mêmes retourner un message de succès, sinon un message d'erreur. On se dit qu'on a rien à perdre et on entre n'importe quoi, par exemple "12345", on click sur "Check" et hop, un joli petit message d'erreur: "Incorrect try again !!". Bon ok, maintenant que l'on sait ce qu'il faut trouver, on démarre Windasm, on click sur "Open file to disassemble" et on choissit notre petit crackme. AAAHHH L'HORREUR, C QUOI CES TRUCS QUI VEULENT RIEN DIRE DANS TOUS LES COINS ????? Ben ouais, c'est ça l'assembleur... Ce sont des petites instructions qui s'enchainent l'une à la suite de l'autre pour former un programme. Surtout ne vous décourager pas, parce que c'est très simple pour trouver notre routine qui vérifie le sérial, mais avant toute chose, je vais vous faire la présentation de votre nouveau collègue de cracking, le dénommé Windasm... ;-)
Windasm.
En tout premier lieu, aller dans "Disassembler" => "Font..." => "Select Font" et choisissez un police qui convient. Puis aller dans "Disassembler" => "Font..." => "Save default font" pour l'enregistrer. Comme
je vous l'ai dit précédemment, Windasm est un désassembleur ( ou décompilateur
) pour Windows 16 et 32 bits. Mais pourquoi faut-il désassembler un programme
? Tout d'abord, ce qui apparaît à l'écran s'appelle le listing, c'est tout le code désassemblé par Windasm:
La
première colonne, souvent appelée Code Data, sert à déterminer l'adresse
correspondant à l'instruction. Remarquez que pour les programmes exécutable,
cette ligne commence à 401000. Ensuite, la barre d'option:
Nous allons voir ce que chacun d'eux représente respectivement 1 par 1 en partant de la gauche vers la droite.
"Save disassembly text file et create project file" : permet d'enregistrer votre listing et de créer un fichier de projet. "Find text" : permet de trouver une chaîne de caractère dans le listing. "Copy selected lines" : permet de copier les lignes sélectionnées. Pour ce faire, cliquez avec le bouton gauche de votre souris devant la ligne choisie pour la sélectionner. Si vous voulez en sélectionner plusieurs, appuyez sur Shift en même temps. "Goto code start" : permet de se rendre au début du code de votre programme. "Goto code entry point" : permet de se rendre au point d'entré du programme. "Goto page" : permet de vous rendre à la page du listing voulue. "Goto code location" : permet de vous rendre à une adresse ( Code Data ) spécifiée. "Execute jump" : permet de sauter si la ligne en cours ( marquée par une ligne de couleur ) est un saut. "Return from last jump" : permet de retourner à la ligne où se situais le dernier saut que vous avez effectué. "Execute call" : permet d'aller à la ligne de code appelée. "Return from call" : permet de retourner à la ligne où se situait le dernier call appelé. "Imports" : fonctions appartenant au fichier désassemblé. "Exports" : fonctions appartenant à un autre fichier que celui qui est désassemblé: dll, vxd,... "Hex display of data objet/segments" : permet de voir le programme en hexadécimal. "Hex display of code data" : idem que le prédédent. Rem je ne ferai pas la différence entre les deux car elles ne devrait pas vous servir à ce stade. "Dialog references" : références des boites de dialogues utilisées. "String data references" : références de toutes les chaines utilisées. "Print" : imprime les lignes sélectionnées. Si il y en a aucune, tout le listing entier est imprimer. Méfiez-vous, un listing atteint très très rapidement les 100 pages pour un programme de 50 à 100 Ko !!! Et voici la barre de status:
"Line:320"
définit le numéro de ligne en cours.
Trouver
le/les saut(s) conditionnel(s).
Bon, nous voilà fin près à débuter le cracking. Je suppose que vous avez quand même déjà désassemblé votre programme, sinon faites-le. Comme je vous l'ai déjà fait remarquez, il y a un endroit ou se trouve ce qu'on appelle un saut conditionnel vérifiant si le sérial est bon ou pas. Donc ils nous faut trouver ce saut. Rappellez-vous, quand nous avions entré un mauvais sérial, un message d'erreur était apparu:
Maintenant, on sait tout ce qu'il nous faut savoir pour cracker ce programme. Nous allons nous y prendre par la manière dite du "Dead Listing", c'est-à-dire qu'on repère le saut et on le change de façon à ce que même si le serial est mauvais, nous soyons enregistré. Pour ce faire, nous allons aller voir les "String data references".
Nous pouvons remarquez que le message d'erreur y est:"Incorrect try again!!". Donc nous double-cliquons sur celui-ci plusieurs fois en regardant l'adresse où ça nous mène pour vérifier si il n'y en a pas plusieurs. Une chance pour nous ce n'est pas le cas.
Et voilà, si le sérial n'est pas bon nous sautons ici. Celà affiche un message avec comme titre "Crackme" et comme texte "Incorrect try again!!". Mais nous pouvons voir ceci aussi: *
Referenced by a (U)nconditional or (C)onditional Jump at Address: Ce qui signifie que le saut conditionnel se situe à l'adresse "00401595". Donc nous cliquons sur "Goto code location" et spécifions "00401595" pour nous rendre à ce saut. Mais voici à présent toute la partie du code qui nous intéresse:
Nous avons bien remarqué qu'il faudrait soit inversé le saut, mais si vous taper le bon sérial alors vous irez vers le message d'erreur, soit désactivez ce saut afin de toujout arriver sur le message disant que le sérial est bon, et c'est la meilleur solution dans ce cas ci. Pour
ce faire, nous allons "noper" le "JNE 004015AD". Noper une instruction,
veut dire qu'on va remplacer celle-ci par "NOP". Mais qu'est-ce que c'est
ce "NOP" ??? Bon maintenant, il nous faut modifier notre programme. Je vous conseil, enfin c'est une bonne habitude, de faire une copie de votre programme et de travailler sur la copie. En cas de fausse manoeuvre, on n'aura qu'à en refaire une et supprimer l'ancienne.
Modifier
un fichier.
Je vous conseil, enfin c'est une bonne habitude, de faire une copie de votre programme et de travailler sur la copie. En cas de fausse manoeuvre, on n'aura qu'a en refaire une et supprimer l'ancienne. Pour ce faire, nous avons besoin d'un éditeur hexadécimal et de l'offset à mofidier. Pour obtenir l'offset, vous double-cliquez sur la ligne dont vous voulez l'offset, et il sera indiqué dans la barre de status ( remonter à la description de Windasm si vous voulez plus d'informations ). Nous utiliserons HView. Voci comment il se présente:
Je ne crois pas qu'il soit utile de l'expliquer de fond en comble car sont emploi est très simple. Vous pouvez choisir parmi les options qui sont indiqué tout en dessous en cliquant sur la touche correspondante ( ex: 1 = F1 ). Premièrement, déplacez-vous grâce aux flèches et "Enter" dans les répertoire. Ensuite, appuyez sur "Enter" au-dessus du programme à modifier. Là vous pouvez taper F5 pour entrer l'offet ou vous voulez vous rendre et F3 pour modifier ce qui doit être modifier. Une fois que vous avez tout fait cliquez sur F9 pour enregistrer et sur F10 pour fermer HView ce qui vous permettra de démarrer votre programme avec les changements. Nous prenons l'offset correspondant au saut conditionnel: 1595. Et nous démarrons HView, grâce aux flèches et à "Enter" nous nous rendont dans le répertoire du crackme et sélectionnons ce programme. Ensuite, nous cliquons sur F4 et choisissons le mode "Hex" ( pour hexadécimal ). Remarquez que nous aurions pu prendre le mode "Decode" mais je préfère de loin le mode hexadécimal. Nous cliquons alors sur F5 et entrons notre offset ( 1595 ) suivis de "Enter". Nous arrivons à ceci:
Nous
pouvons remarquez que tous les codes hexadécimaux se suivent l'un à la
suite de l'autre, mais nous devons modifier que 85C075166A40 en
85C090906A40. Donc nous cliquons sur F3 et modifions le programme.
Ceci Fait vous devriez obtenir ceci:
Ensuite nous appuyons sur F10 et lançons notre programme. Vérifiez bien de lancez la copie si vous en avez fais une. Nous entrons toujours "12345"... Woaw CA MMMMMMMAAAAAAAARRRRRRCCCCCCCHHHHHHEEEEEEE Dans le cas ou ça n'airait pas, vérifiez que vous avez fait comme je l'ai écrit et que vous avez bien lancé le programme que vous avez modifier.
Faire
des cracks.
Maintenant que vous avez modifié votre programme, il ne vous reste plus qu'à faire votre crack. Comme je n'ai pas de code source à vous filer, que j'ai encore beaucoup de choses à faire et que je n'ai pas le temps d'en faire un, je vous laisse aller sur votre moteur de recherche préféré pour en rechercher un dans votre langage préféré!
Sauts
conditionnels et instructions utiles.
Nous allons voir ici les différents sauts et instructions qui pourraient vous être utile lors de déplombage de vos propre programme.
Le tableau n'est pas tout à fait complet dans le sens ou tous les sauts ne sont pas présents, mais les principaux sont là.
Debugger
un programme grâce à Windams.
Contrairement au "Dead Listing" qui consiste à désassembler un fichier et en modifier certaines partie, le debbugage consiste à faire tourner un programme pas à pas. On peut ainsi par exemple, arrivé au test de votre sérial et du bon sérial, s'y arrêter un mettant ce qu'on appel un "break point" et récupérer à ce moment le bon sérial juste avant la comparaison. Pour lancer le debugger Windasm, vous devez d'abord désassembler le fichier à débugger et ensuite aller dans le menu "Debug" => "Load Process". Ensuite, cliquez directement sur "Load", les lignes de commandes ne servent que très rarement, et vous n'en aurez pas besoin ici. Nous gardons toujours le même programme qu'avant. Nous travaillerons ici sur la version originale, car nous ne modifierons rien dans le programme. Donc
nous devons posez un break point juste avant le teste des sérials, ce
qui nous permettra de les connaître. ...
:0040158D FF1500204000 Call dword ptr [00402000] <- Donc ici ! :00401593 85C0 test eax, eax :00401595 7516 jne 004015AD :00401597 6A40 push 00000040 ... Nous lançons donc le debugger, "Debug" => "Load Process" => "Load". On coche toutes les options de la fenêtre de droite, on revient dans Windasm, on clique sur "GoTo code location" et on entre notre adresse: 0040158D. Ensuite on click sur F2 pour mettre un break point. Maintenant cette ligne devrait apparaître en jaune si tout a été correctement fait. Maintenant revenez dans la fenêtre de droite et cliquez sur "Run" ou sur F9. Au début, vous pouvez le voir dans le fenêtre de gauche tout en bas cette fois-ci que le programme commence par charger les DLL. Après plusieurs clique, le programme est lancé, entré un sérial aléatoire comme "12345" et cliquez sur "Check". Là une fenêtre s'ouvre:
Voilà le résultat que vous obtenez. Ce que nous avons entré "12345" et le bon sérial "<BrD-SoB>". Il vous suffit de le tester. Lancez le programme en dehors du debugger, entré le serial trouvé. WOAW C'EST LE BON SERIAL... Eh oui, pas si compliqué quand même ?!
Keygen.
D'abord
qu'est-ce qu'un keygen ?? Ici nous allons utiliser un autre programme: Téléchargez le ici Maintenant que vous possédez le crackme n°2 regardons de quoi il s'agit. On le lance, et on voit qu'il veut un nom et le serial qui y correspond. Bon, on rentre n'importe quoi: "HoxkH" et "12345". Pas de chance, il nous retourne un joli message d'erreur: "Wrong code". On n'en sait déjà assez, on décompile le programme, on va dans les strings data références et on trouve notre chaîne. On double-click dessus et on vérifie qu'il en existe qu'une. Woaw, qu'est qu'il y en a des chaîne ici ! Ne vous inquiétez pas, le programme est lourd parce qu'il a été écrit en Delphi qui vous pouvez le remarquez n'est pas le meilleur compilateur pour la taille et la vitesse des programmes qu'il génère... ;-) Par chance, il n'y a qu'une occurrence de "Wrong code". et si on remonte un peu, on voit que tout le code qui test le sérial ce suit:
*
Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004416D5(C) | :00441744 68D4174400 push 004417D4 :00441749 8D45F8 lea eax, dword ptr [ebp-08] :0044174C BA05000000 mov edx, 00000005 :00441751 E89E23FCFF call 00403AF4 :00441756 8B55F8 mov edx, dword ptr [ebp-08] :00441759 58 pop eax :0044175A E8E523FCFF call 00403B44 <- Appel du test du sérial :0044175F 7517 jne 00441778 <- Saute si le sérial est mauvais :00441761 6A00 push 00000000 :00441763 668B0DD8174400 mov cx, word ptr [004417D8] :0044176A B202 mov dl, 02 *
Possible StringData Ref from Code Obj ->"Right Code" *
Referenced by a (U)nconditional or (C)onditional Jump at Address: *
Possible StringData Ref from Code Obj ->"Wrong Code"
Bon maintenant on va en 00403B44 voir précisément ce qu'il y a:
*
Referenced by a CALL at Addresses:
|:0040D71B , :00411A05 , :00416A25 , :00417710 , :00422296 |:00422321 , :00422F5F , :004231FC , :0042DA8B , :0042E091 |:0042E201 , :0042E375 , :00430BF1 , :00430CB5 , :00431090 |:0043114F , :004315AA , :004317CA , :00431D35 , :00431EF3 |:0043F543 , :0044175A | :00403B44 53 push ebx :00403B45 56 push esi :00403B46 57 push edi :00403B47 89C6 mov esi, eax :00403B49 89D7 mov edi, edx :00403B4B 39D0 cmp eax, edx :00403B4D 0F848F000000 je 00403BE2 :00403B53 85F6 test esi, esi :00403B55 7468 je 00403BBF :00403B57 85FF test edi, edi :00403B59 746B je 00403BC6 :00403B5B 8B46FC mov eax, dword ptr [esi-04] :00403B5E 8B57FC mov edx, dword ptr [edi-04] :00403B61 29D0 sub eax, edx :00403B63 7702 ja 00403B67 :00403B65 01C2 add edx, eax * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00403B63(C) | :00403B67 52 push edx :00403B68 C1EA02 shr edx, 02 :00403B6B 7426 je 00403B93 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00403B89(C) | :00403B6D 8B0E mov ecx, dword ptr [esi] :00403B6F 8B1F mov ebx, dword ptr [edi] :00403B71 39D9 cmp ecx, ebx :00403B73 7558 jne 00403BCD :00403B75 4A dec edx :00403B76 7415 je 00403B8D :00403B78 8B4E04 mov ecx, dword ptr [esi+04] :00403B7B 8B5F04 mov ebx, dword ptr [edi+04] :00403B7E 39D9 cmp ecx, ebx :00403B80 754B jne 00403BCD :00403B82 83C608 add esi, 00000008 :00403B85 83C708 add edi, 00000008 :00403B88 4A dec edx :00403B89 75E2 jne 00403B6D :00403B8B EB06 jmp 00403B93 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00403B76(C) | :00403B8D 83C604 add esi, 00000004 :00403B90 83C704 add edi, 00000004 * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00403B6B(C), :00403B8B(U) | :00403B93 5A pop edx :00403B94 83E203 and edx, 00000003 :00403B97 7422 je 00403BBB :00403B99 8B0E mov ecx, dword ptr [esi] :00403B9B 8B1F mov ebx, dword ptr [edi] :00403B9D 38D9 cmp cl, bl :00403B9F 7541 jne 00403BE2 :00403BA1 4A dec edx :00403BA2 7417 je 00403BBB :00403BA4 38FD cmp ch, bh :00403BA6 753A jne 00403BE2 :00403BA8 4A dec edx :00403BA9 7410 je 00403BBB :00403BAB 81E30000FF00 and ebx, 00FF0000 :00403BB1 81E10000FF00 and ecx, 00FF0000 :00403BB7 39D9 cmp ecx, ebx :00403BB9 7527 jne 00403BE2 * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00403B97(C), :00403BA2(C), :00403BA9(C) | :00403BBB 01C0 add eax, eax :00403BBD EB23 jmp 00403BE2 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00403B55(C) | :00403BBF 8B57FC mov edx, dword ptr [edi-04] :00403BC2 29D0 sub eax, edx :00403BC4 EB1C jmp 00403BE2 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00403B59(C) | :00403BC6 8B46FC mov eax, dword ptr [esi-04] :00403BC9 29D0 sub eax, edx :00403BCB EB15 jmp 00403BE2 * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00403B73(C), :00403B80(C) | :00403BCD 5A pop edx :00403BCE 38D9 cmp cl, bl :00403BD0 7510 jne 00403BE2 :00403BD2 38FD cmp ch, bh :00403BD4 750C jne 00403BE2 :00403BD6 C1E910 shr ecx, 10 :00403BD9 C1EB10 shr ebx, 10 :00403BDC 38D9 cmp cl, bl :00403BDE 7502 jne 00403BE2 :00403BE0 38FD cmp ch, bh * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00403B4D(C), :00403B9F(C), :00403BA6(C), :00403BB9(C), :00403BBD(U) |:00403BC4(U), :00403BCB(U), :00403BD0(C), :00403BD4(C), :00403BDE(C) | :00403BE2 5F pop edi :00403BE3 5E pop esi :00403BE4 5B pop ebx :00403BE5 C3 ret Et oui, long code pour le sérial, mais ce n'est pas proportionnel à la difficulté du sérial, vous aller voir. Maintenant, soit vous vous amuser à analyser tout ce code, soit vous mettez un break point sur le call en 0044175A pour avoir un aperçu du sérial. C'est la deuxième méthode que nous allons utilisé. Donc on debugge comme expliqué précédemment notre programme. Voici ce que vous devriez obtenir:
Et ici, on peut nettement deviner que le sérial correspondant à "HoxkH" est "HoxkHHoxkH625g72". Nous le testons... WOAW C'EST CA !!! Bon
maintenant, on sait que le sérial se composent de 2 fois le nom mais le
reste, serais-ce une constante ou quelque chose qui serais calculer en
fonction du nom ?! Nous pouvons en conclure que le sérial est: votre_nomvotre_nom625g72 Donc si vous voulez faire un keygen, il vous suffira de réappliquer ceci. Voilà, ça en est fini pour les keygen, je ne vais pas vous donner de code source, car il faut savoir un peut programmer pour faire un code qui va calculer notre sérial, donc je suppose que vous serez capable de tout faire... ;-) Astuces
pour bien commencer à cracker.
-
Lire pleins de tutoriaux fait sur de petits programmes et les comprendres
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|