¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ MILLENIUM CRACKING TUTORIAL (PART I) ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ [ NdRedoxx : Ce tutorial m'a été transmit en entier par ACiD BuRN ; il est le precurseur des hacks de Caramail et le "détenteur du record" de ces hacks, mais il est surtout connu chez les ricains, c'est l'ex group-leader de Eclipse, et il est désormais membre de UCF (United Cracking Force), les créateurs d'ELITE, avec le Phrozen Crew !!! Etant donné qu'il fait environ 10 ko, j'ai décidé de le diviser en plusieurs parties et de le diffuser au fur et à mesure des numéros de APOCALYPSE. Je vous signale également qu'il a décidé de changer de pseudo, laissant ACiD BuRN pour devenir tHE ANALYST, parce que trop de types portent le pseudo de Angelina Jolie dans le film "HACKERS" et que la plupart d'entre eux sont des lamers ; cependant, il a écrit ce tutorial alors qu'il avait encore son ancien pseudo, donc vous trouverez ses patches sous ce nom. Allez, let's go!!! ] Sommaire :::::::::: :::::::::: 1) Introduction 2) Les Bases minimales requises (sauts conditionnels, nop, call ...) 3) Introduction à W32Dasm8x 4) Patcher les protections avec Registrations (serial, name / serials) 5) Introduction à Soft-ice (configuration et commandes de base) 6) Trouver des serials valides pour vos noms avec Soft-ice 7) Comment keygener pas mal de programmes (utilisation des BPR...) [ NdRedoxx : les rubriques suivantes se trouveront dans les numéros 2 et 3 de APOCALYPSE ] 8) Transformer un Programme en son propre keygen 9) Time Limits (limitation de 30 jours et autres merdes !!) 10) Nag et autres Splash screen (diverse méthodes...) 11) Keyfile 12) CD Check (les BPX, et techniques diverses..) 13) Visual Basic (keygener, serialiser, patcher, tout sur le VB !!) 14) JAVA Reverse Engineering 15) Manual Unpacking (comment unpacker, les tools, méthodes...) 16) Checksum (comment les contourner) 17) Anti Soft-ice 18) Divers 19) Greetings 20) Conclusion Introduction :::::::::::::: :::::::::::::: Ben, voilà je me suis dit il y a quelques jours, pourquoi ne pas écrire un cours englobant tous les types de protections les plus courantes et comment les mettre en échec!! Cette fois-ci, c'est donc bien un cours global de cracking et en français en plus !! Vous l'avez sûrement remarqué, la taille de ce cours est assez grande !! Plusieurs dizaines de Ko! Je vous conseille donc de lire çà au calme et avec attention !! Je préviens de suite !! pour les personnes ayant l'habitude de faire des remarques mal placées ! Ce n'est pas la peine de critiquer ce cours !! Mais si vous avez plutôt des suggestions, je suis disposé à écouter... Ce cours a été écrit alors que j'étais très malade, il se peut qu'il y ait quelques "âneries", je serais content si vous pouviez m'en faire part! Merci et sur ce, bonne lecture. [ ACiD BuRN ] ************************************************************************* ** Les Bases minimales requises (sauts conditionnels, nop, call ...) ** ************************************************************************* Pour pouvoir cracker, vous devez avoir des bases en assembleur!! Je vais ici vous énumérer les choses à savoir au départ, différentes instructions, ce qu'elles veulent dire .. Si vous êtes déjà habitué au cracking, vous pouvez passer à la suite sans problème je pense, à part si vous avez de grosses lacunes! L'assembleur est le langage qui se rapproche le plus de celui du PC, ou plutôt que le Microprocesseur puisse comprendre: "le langage machine." L'asm est donc le langage de programmation de plus bas niveau qui existe. Ce langage retrouve sa place dans tous les programmes car il ne faut pas oublier que n'importe quel programme, écrit dans n'importe quel langage est finalement traduit en langage machine pour être exécuté... Si on désassemble n'importe quel programme, on retrouve un listing en ASM, d'où l'utilité de connaître l'assembleur. Passons à l'étude des instructions (Très basique) afin d'éclaircir les problèmes. * CALL: l'instruction CALL permet d'appeler une sous-routine. ex: Call 00405741 <-- ceci appelle la routine qui se trouve en 00405741. * CMP: compare. Cette instruction soustrait l'opérande source à l'opérande de destination. ex: CMP EAX, EDX <--- soustrait EAX à EDX = EDX - EAX Les CMP sont généralement accompagnés de sauts conditionnels, nous les verrons très bientôt... * JMP: (JUMP) elle effectue un saut inconditionnel à une autre partie du programme ex: JMP 0040458 <--- saute à 0040458 * NOP: (no operation): cette instruction n'est pas comme les autres. Elle ne fait tout simplement RIEN!! Vous verrez par la suite son intérêt ! * RET: (return): instruction qui permet de revenir au programme appelant quand une sous-routine est terminée! (très utile certaines fois) * ADD: elle réalise une addition entre les 2 opérandes et place le résultat dans l'opérande destination. ex: ADD EAX, FFh --> EAX = EAX + FFh * SUB: c'est pour effectuer une soustraction entre 2 opérandes... ex: SUB EAX, EDX --> EAX = EAX - EDX Il y a aussi les DIV, MUL (je vous fait pas de dessin, je pense que devinez ce que ça fait !! * Les saut conditionnels: Vous rencontrez beaucoup de tests, comparaison, pendant le cracking. Ainsi pour traiter les résultats de ceux-ci, il existe une multitude de sauts conditionnels, je vais vous en citer quelques-uns: JNE (jump if not equal) = jump if not equal to zero (JNZ sous Soft-ice) JE (jump if equal) = jump if equal to zero (JZ sous Soft-ice) JG (jump if greater) = jump si c'est supérieur JGE (jump if greater or equal) = jump si c'est supérieur ou égal JL (jump if less) = jump si c'est inférieur JLE (jump if less or equal) = jump si c'est inférieur ou égal JA (jump if Above) JNA (jump if not above) ...... je vous conseille de lire une documentation sur l'asm si vous voulez plus d'infos sur les types de saut ! Il en existe encore... * MOV: l'instruction mov sert à placer une valeur dans un registre. ex: MOV EAX, 56h ---> met 56h (86 en décimal) dans le registre EAX. * XOR: c'est un ou exclusif! Très utilisé dans les routines de cryptage ou de génération de serials! Voici la table de fonctionnement du XOR: 0 XOR 0 = 0 0 XOR 1 = 1 1 XOR 0 = 1 1 XOR 1 = 0 Le xor est utilisé pour remettre un registre à 0. En effet quand on xor 2 mêmes valeurs, le résultat est toujours 0. ex: XOR EAX, EAX ---> EAX = 0 * PUSH: l'instruction push permet de placer une donnée sur la pile. Elle peut venir d'un registre ou d'un emplacement mémoire! ex: PUSH EAX ---> pousse la valeur de EAX sur la pile * POP: l'instruction pop permet de récupérer une donnée posée sur la la pile. Elle peut être placée dans un registre ou dans un emplacement mémoire! ex: POP EAX ---> récupère la valeur de EAX sur la pile Voilà, ça sera tout pour les bases en ASM!! Ces quelques descriptions ont, je l'espère, mis au clair les qq problèmes pouvant être rencontrés du à l'incompréhension de certaines instructions!! Mais il serait préférable pour vous d'avoir un livre d'asm près de vous, cela vous permettrais de chercher la description des instructions qui vous posent problème ! (exemple de livre: ASSEMBLEUR PRATIQUE, éditions Marabout) Introduction à W32Dasm8x :::::::::::::::::::::::::: :::::::::::::::::::::::::: Tout d'abord, je vais vous expliquer ce qu'est W32Dasm, à quoi il sert et quelles sont ses principales options! W32Dasm est un désassembleur! Il permet de désassembler n'importe quel fichier de type EXE, DLL, OCX ... pour obtenir son équivalent en asm! A quoi bon ? hehe ce genre de programme vous permettra de cracker qq jeux, de s'enregistrer dans vos programmes et encore des tas d'autres choses !!! Utilisation: Après avoir dézippé W32Dasm dans un répertoire, il vous faudra configurer la fonte car celle qui est par défaut n'est pas lisible, lol :) Car quand vous allez l'utiliser pour la première fois, vous verrez des signes tout à fait bizarres et qui ne veulent rien dire !! Normal ! La fonte par défaut est : widings ou qq chose comme ça. Changez la en : Times new roman par exemple, et vous pourrez enfin comprendre ce que W32Dasm vous montrera après avoir désassemblé ! Changement de fonte: lancez W32Dasm, dans le menu désassembler choisissez Font. et ensuite select Font! et là vous pouvez faire votre choix!!! Les différents menus: Dans Disassembler: Open file to disassemble C'est avec ce menu que vous choisissez le fichier à désassembler! Ouvrez le fichier Calc.exe présent dans le répertoire de Windows pour essayer par exemple! Après avoir désassemblé, vous pouvez sauvegarder ce fichier pour pouvoir le réouvrir ultérieurement !! (désassembler de gros fichiers peut être parfois TRES long !! d'où l'intérêt de sauver le fichier !) Pour cela, allez dans le menu "Save disassembly Text files.." de Disassembler. Juste à côté de ce menu vous pouvez voir "Project"! Ceci sert à ouvrir les fichiers sauvegardés précédemment ! Je ne vais pas m'attarder sur la description de W32Dasm, car il est fourni avec une aide super !!! décrivant avec précision les différentes commandes! Pour finir cette brève description des menus, je vais vous décrire le menu Refs! Alors celui-là !! c'est le menu le plus utilisé dans W32Dasm !! Après avoir clické dessus, vous devez apercevoir 3 sous-menus, je ne vous parlerai pour l'instant que de: String Data References! Kesako çà ? C'est en fait une liste de tout les messages rencontrés dans le programme disassembler! Il vous servira notamment pour les jeux avec des messages du genre: "Please insert your CD" ou encore les autres names / serials: "the serial you entered is not Valid!" .... L'utilisation sera détaillée dans la suite de ce cours ! Quelques astuces en vrac: Pour copier-coller dans W32Dasm, il suffit de clicker sur le début de la ligne à copier (un point rouge doit apparaître) et ensuite appuyez sur la touche Shift. Maintenant allez sur la dernière ligne à copier, et vous verrez que toutes les lignes entre les 2 points que vous avez sélectionnés contiennent des points rouges !! Cela signifie que vous pouvez maintenant copier-coller le texte qui est sélectionné! Ctrl+C = copie le texte Ctrl+V = colle le texte L'intérêt de ceci est que vous pouvez découper des bouts de codes et les introduire dans vos tuts, ou Keygens :)) Patcher les protections avec Registrations :::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::::::::: Nous allons voir ici l'utilisation de W32Dasm pour patcher les protections par serials !! Théorie: Dans de nombreux sharewares, vous rencontrez des protections par name / serials et les programmes souvent pas très malin vous mettent un msg disant que le serial entre n'est pas bon !! qd vous avez rentré une connerie! Appelons X le programme protégé par name serial. Lancez X, et allez là où vous pouvez entrer un nom et un code d'enregistrement. Entrez votre nom et un serial à la con style: 112233 et clickez sur le bouton permettant de vérifier le serial style "OK" et vous verrez le message à la con vous disant: "le serial que vous avez entré n'est pas valide" Hehehehe, déjà si vous voyez çà vous pouvez vous dire que c'est bien parti ! Alors ouvrez W32Dasm et sélectionnez le fichier exécutable du programme à cracker comme je vous ai montré dans la partie d'avant !! Maintenant allez jeter un oeuil dans les String Data References et vous n'avez plus qu'à chercher le message d'erreur rencontré lors du mauvais serial !! Sans tarder vous le trouvez dans la liste des messages !! Double-cliquez dessus et vous atterrissez à l'endroit dans le programme où s'effectue le test. Vous tomberez Très souvent sur qq chose comme çà: :01001777 FF151C110001 Call 0100111C :0100177D 85C0 test eax, eax :0100177F 7512 jne 01001793 :01001781 8D856CFFFFFF lea eax, dword ptr [ebp+FFFFFF6C] * Possible StringData Ref from Code Obj ->"le serial que vous avez entré.." Ici on voit très bien le message d'erreur du programme !! Si on regarde juste au dessus, on voit un Test, et un JNE! Regardez dans la liste des fonctions asm que je vous ai donné au début si vous avez oublié la fonction de jne... Que fait donc ce code ? Si le code n'est pas égal au bon code : TEXT EAX, EAX n'est pas égal à 0 et donc le jne (jump if not equal) saute vers le message d'erreur! Donc comment cracker ça ? Facile, nous devons avoir EAX = 0 pour que le serial soit pris comme valide donc la façon la plus propre est de forcer EAX à 0! L'instruction qui met à 0 un registre est XOR. XOR EAX, EAX = 0 (si vous ne comprenez pas pourquoi, allez voir au début du cours dans les bases en ASM). Le code modifié ressemble à ceci : :01001777 FF151C110001 Call 0100111C :0100177D 33C0 xor eax, eax :0100177F 7512 jne 01001793 :01001781 8D856CFFFFFF lea eax, dword ptr [ebp+FFFFFF6C] * Possible StringData Ref from Code Obj ->"le serial que vous avez entré.." La ligne: :0100177D 85C0 test eax, eax est devenue: :0100177D 33C0 xor eax, eax Voilà !! EAX = 0 pour toujours donc le programme ne sautera plus jamais avec le jne et le programme vous mettra le message comme quoi vous avez entré un bon serial !! "Merci de Votre support, vous êtes maintenant enregistré BLABLABLA " :-) Coool tout ça !! Mais vous vous demandez sûrement comment j'ai su que le 85C0 deviendrait 33C0 et comment on peut changer ça dans le programme ? hehe, ça vient !! Pour savoir à quoi ressemble le code en hexa d'une instruction vous pouvez utiliser l'option de l'éditeur hexa Hacker view, mais bon j'aime pas cet éditeur!! je connais ces valeurs par coeur. Donc essayez de vous en rappeler. Pour effectuer ces modifications dans le programme, il faut utiliser un éditeur hexadécimal. J'utilise HexWorkshop car c'est à mon avis le meilleur! Donc lancez l'éditeur hexa, et ouvrez votre fichier à patcher avec... Faites une recherche des octets à patcher et remplacez par les nouvelles valeurs. Exemple dans ce cas: recherchez: 85C075128D856CFF Vous devez trouver un seul endroit correspondant à ces octets sinon faites une recherche avec plus d'octets!! Une fois que vous avez trouvé, remplacez par: 33C075128D856CFF sauvegardez le fichier et c'est prêt!! NOTE: si vous avez ouvert le fichier et qu'il est toujours ouvert par W32Dasm, vous ne pourez l'enregistrer car le fichier sera déjà en lecture donc vous serez en lecture seule!! Petite astuce pour ne pas être emmerdé : Avant de désassembler votre exécutable, faites-en une copie et renommez l'extension en .AB par exemple! Désassemblez le fichier avec l'extension .ab et une fois que vous savez où il faut patcher, vous ouvrez la copie du fichier qui a toujours l'extension .exe avec HexWorkshop! Vous pourrez modifier l'exe et sauvegarder, tout en vous servant de W32Dasm! Donc voilà, vous avez sauvegardé le fichier ! Relancez l'exécutable modifié et vous entrez un nom / serial bidon, et clickez sur le bouton pour vérifier le serial! Miracle le message : "Merci de votre support" ou autres conneries du genre apparaît !! Vous venez de cracker votre premier name / serial. Mais attention, il se peut que quand vous relanciez le programme, il ne soit plus enregistré :(( pourquoi ?? Ben tout simplement car il y a un autre contrôle du serial dans la base de registre ou même dans un fichier .ini!! L'enculé :) heheh il est souvent très simple à patcher cela ! Dans les String Data References, si vous voyez une référence du genre: "Licenced to:" <-- il doit avoir des tests plus haut, ou des appels par des call ou sauts conditionnels !! Vous avez juste à modifier le programme pour qu'il saute en version enregistrée à tout les coups !! en remplaçant un JE en JMP (en hexa: 74 --> EB)... Pour en revenir à l'exemple de tout à l'heure on a modifié le TEST en XOR, mais on aurait très bien pu nopper le saut conditionnel!!! Explications: :01001777 FF151C110001 Call 0100111C :0100177D 85C0 test eax, eax :0100177F 7512 jne 01001793 :01001781 8D856CFFFFFF lea eax, dword ptr [ebp+FFFFFF6C] * Possible StringData Ref from Code Obj ->"le serial que vous avez entré.." Le jne saute au mauvais message si le numéro de série n'est pas bon !! Donc pourquoi ne pas l'empêcher de sauter tout simplement ?? Comment ? ben si vous avez jeté un oeuil au début du cours vous avez sûrement remarqué l'instruction: NOP (no operation)!!! Cette instruction ne fait rien du tout !! Chouette on va s'en servir pour tuer le saut !! Notre code devient donc: FF151C110001 Call 0100111C 85C0 test eax, eax 90 nop 90 nop 8D856CFFFFFF lea eax, dword ptr [ebp+FFFFFF6C] Et voilà !! plus de problèmes non plus :) Le code hexa pour nop = 90 !! ne pas oublier ça !! Vous vous en servirez toute votre vie (de cracker). Modification dans l'exécutable comme tout à l'heure: on cherche: 85C075128D856CFF et on remplace par: 85C090908D856CFF Sauvegardez et Enjoy!!! Pratique: Petit exemple illustrant ce que je viens de vous apprendre: Crack de WinRAR 2.05 On va patcher ce prog pour qu'il accepte n'importe quel numéro de série. Nous allons voir comment faire quand un prog accepte le serial mais dès qu'on le relance, il nous dit version non enregistrée !! Et pour finir réactiver une fonction du prog accessible seulement en version enregistrée !!! donc pour ce crack on a besoin de : - WinRAR 2.05 - W32Dasm 8.9 - éditeur hexa comme HexWorkshop 1) Analyse du prog ! On lance WinRAR et on voit dans la barre des tâches : (evaluation Copy), dans option, general, 2 functions désactivées (Log errors to file et put authenticity verification). Et dans option : Registration. On rentre notre nom et numéro de série, il nous dit: Registration failed. 2) Lets kick this fucking tool ! Donc on fait une copie de sauvegarde de WinRAR95.exe puis on le désassemble avec W32Dasm, on va dans String Data References et on trouve : .... String Resource ID=00106: "Registration failed" String Resource ID=00107: "Thank you for support" .... Dons on double click sur Registration Failed et on retourne dans W32Dasm, on remonte un peu on voit çà: :00413c5f 7532 jne 00413c93 * Possible StringData Ref from Code Obj ->"Normal" :00413c61 6A30 push 000000030 * Possible StringData Ref from Code Obj ->"Warning" <-- Le message d'erreur! :00413c63 6a1a push 0000001a :00413c65 e8fe640000 call 0041a168 :00413c6a 59 pop ecx .... .... * Possible StringData Ref from Code Obj ->"Registration failed" .... .... et là on voit tout de suite le saut conditionnel : jne 00413c93 jne veut dire jump if not equal, donc le prog saute au message d'erreur quand le code est mauvais ! On le remplace par je 00413c93 et hop ! Il ira sur le mauvais message quand on rentrera un bon code !! Il peut tjs attendre !!! Donc on remplace le 7532 par 7432 (note: j'aurais très bien pu nopper mais c'est pour vous montrer que les sauts sont renversables), on sauvegarde et on relance le tout !! On entre son nom, son code bidon, et il nous dit : Thank you for .... :) Mais si on relance, le prog n'est plus enregistré :( On réfléchit et on voit dans la barre des titres: (evaluation copy). Tout à l'heure quand on a rentré un code, ce message était parti. Donc on cherche : '(evaluation copy'), dans les String Data References. (bien prendre celle avec parenthèses) On trouve: String Resource ID=00252: "(evaluation copy)" on double click et on remonte un peu et on voit : :00418d1e 833d5c57420000 cmp dword ptr [0042575c], 00000000 :00418d25 752f jne 0041d56 <=== Jump to BAD CRACKER !!! Encore un chtit saut conditionnel, on le remplace en je avec un 74 à la place du 75 on sauvegarde, on relance et on est enregistré ! :) Mais, n'oublions pas de tester le proggy !! et on voit les 2 fonctions désactivées citées plus haut. :( Dans Menu\Options\general on coche une des deux cases, il nous dit : "Available in registered version only" <=== va te faire petit !!! :) On note le message et on le cherche dans W32Dasm, comme d'hab ! On trouve: String Resource ID=00051: "Available in registered version only" On double click et on voit : :004138a9 833d5c57420000 cmp dword ptr [0042575C],00000000 :004138B0 7534 jne 004138e6 <===== jump to BAD CRACKER * Possible StringData Ref from Code Obj -> "Normal" :004138B2 6a30 push 00000030 * Possible StringData Ref from Code Obj -> "Warning" :00413c63 6a1a push 0000001a :00413c65 e8fe640000 call 0041a168 :00413c6a 59 pop ecx :00413c6b 50 push eax * Possible StringData Ref from Code Obj -> "Available in registered ..." .... .... Encore un saut conditionnel vous avez compris je pense, on le remplace le jne 004138e6 par je 004138e6 !! On enregistre et on relance WinRAR !! On essaie de cocher les cases !! Bingo !!! CRACKED !! :) // extrait de mon cour sur WinRAR 2.05 (j'ai patché comme un cow-boy mais // si je commence à retoucher tout j'ai pas encore fini !! Bon ben voilà !! C'était un exemple concret de comment patcher un programme pour qu'il accepte tous les serials à la con, et comment réactiver des fonctions désactivées ! Il existe des programmes BEAUCOUP plus durs à patcher et aussi encore plus simple que celui là !! Note: si jamais après avoir désassemblé vous ne voyez aucune String Data References, il y a de fortes chances que le programme soit packé (crypté grâce à un packer!!), pour savoir comment décrypter un exécutable à la main (manual unpacking) lisez la suite du cours !! Ca arrive ;-) Et pour finir voici une source d'un patch en Delphi que j'ai programmé il y a déjà un bon moment :) //-------------------------- start of sources: unit1.pas --------------------------------- unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Menus, jpeg; type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; Label2: TLabel; Button2: TButton; MainMenu1: TMainMenu; About1: TMenuItem; Image1: TImage; Image2: TImage; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses Unit2; {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); Const A: Array[1..4] of Record // nombre de changements: 4 octets A : Longint; B : Byte; End = ((A:$5C8A;B:$85), // (A = offset et B = valeur que l'on met a la place ) en hexa (A:$5C93;B:$85), (A:$5C9B;B:$EB), (A:$7CD8;B:$EB)); Var Ch:Char; I:Byte; F:File; begin if OpenDialog1.Execute then { affiche une "Open dialog box" } begin AssignFile(F, OpenDialog1.FileName); {$I-} Reset (F, 1); {$I+} If IOResult <> 0 then begin MessageDlg('File write protected or used !!!', mterror, [mbcancel], 0); halt(1); end; If FileSize (F) <> 512000 Then Begin // taille du fichier MessageDlg('Wrong File size !!!', mterror, [mbcancel], 0); halt(1); end else For I:=1 to 4 do {<---------------------- nombres de changement: 4} Begin Seek(F,A[I].A); Ch:=Char(A[I].B); Blockwrite(F,Ch,1); end; MessageDlg('Mem Turbo is now Cracked , enjoy !!!', mtInformation, [mbOk], 0); closefile(f); end; end; procedure TForm1.Button2Click(Sender: TObject); begin close end; end. //-----------------------Fin des sources: unit1.pas -------------------------------- Introduction à Soft-ice ::::::::::::::::::::::::: ::::::::::::::::::::::::: Alors là on commence les choses plus sérieuses !! Voici Soft-ice le débugger de chez Numega !! C'est le débugger utilisé par tout crackers digne de ce nom. Grâce à ce programme, la seule chose qui vous limite vraiment c'est vous et vos connaissances, on peut cracker des dongles (AutoCAD, 3DSMax), trouver des serials, faire des keygens (très utile pour tracer les routines de registration) ... Bref, je vais vous citer ici les différentes commandes utiles et nécessaires pour pouvoir se démerder ;) Mais d'abord, je vais vous expliquer comment configurer ce petit programme :) La configuration de Soft-ice se passe dans le fichier Winice.dat . Donc éditez votre fichier winice.dat avec Notepad par exemple, et voici les choses à modifier: PHYSMB=64 <--- mettez ici votre nombre de RAM (j'en ai que 64 !!) Pour une meilleur lisibilité, à la ligne ou vous voyez ceci INIT, mettez: INIT="lines 60;ww;wl;wr;wd 24;wc 24;code on;x;" Bien entendu, ce n'est pas obligatoire, mais c'est pour que vous soyez dans les meilleures conditions possibles!!! Ensuite à la ligne ou vous voyez "AF4" mettez ceci: AF4="^s 0 l ffffffff 56,57,8b,7c,24,10,8b,74,24,0c,8b,4c,24,14,33,c0,f3,66,a7;" Ca, c'est une technique utilisée dans le Visual Basic (pour trouver des serials :) Bon maintenant, on commence la partie qui est la plus utile car si on ne modifie pas ça ! Niet le cracking :) ; ***** Examples of export symbols that can be included for Windows 95 ***** ; Change the path to the appropriate drive and directory ;EXP=c:\windows\system\kernel32.dll ;EXP=c:\windows\system\user32.dll ;EXP=c:\windows\system\gdi32.dll ;EXP=c:\windows\system\comdlg32.dll ;EXP=c:\windows\system\shell32.dll ;EXP=c:\windows\system\advapi32.dll ;EXP=c:\windows\system\shell232.dll ;EXP=c:\windows\system\comctl32.dll ;EXP=c:\windows\system\crtdll.dll ;EXP=c:\windows\system\version.dll ;EXP=c:\windows\system\netlib32.dll ;EXP=c:\windows\system\msshrui.dll ;EXP=c:\windows\system\msnet32.dll ;EXP=c:\windows\system\mspwl32.dll ;EXP=c:\windows\system\mpr.dll Voilà !! Cherchez ça! C'est pas bien loin dans le fichier, et vous avez sûrement remarqué les ";" , les points virgules mettent en commentaires ! donc il faut les enlever sinon on ne pourra rien cracker car les bpx sur les API Windows seront impossibles (si vous comprenez pas ce que je raconte ;p ca fait rien vous comprendrez bien assez tôt !!) Donc modifiez ça en: ; ***** Examples of export symbols that can be included for Windows 95 ***** ; Change the path to the appropriate drive and directory EXP=c:\windows\system\kernel32.dll EXP=c:\windows\system\user32.dll EXP=c:\windows\system\gdi32.dll EXP=c:\windows\system\comdlg32.dll EXP=c:\windows\system\shell32.dll EXP=c:\windows\system\advapi32.dll EXP=c:\windows\system\Msvbvm50.dll EXP=c:\windows\system\Msvbvm60.dll EXP=c:\windows\system\shell232.dll EXP=c:\windows\system\comctl32.dll EXP=c:\windows\system\crtdll.dll EXP=c:\windows\system\version.dll EXP=c:\windows\system\netlib32.dll EXP=c:\windows\system\msshrui.dll EXP=c:\windows\system\msnet32.dll EXP=c:\windows\system\mspwl32.dll EXP=c:\windows\system\mpr.dll Vous avez sûrement remarqué que j'ai ajouté 2 fichiers dll dans la liste ci-dessus par rapport à avant: EXP=c:\windows\system\Msvbvm50.dll EXP=c:\windows\system\Msvbvm60.dll Rajoutez-les !! On en a besoin si on veut cracker les programmes en Visual Basic :-) Pour ceux qui s'en branlent de ce que je raconte (il y en a toujours :/), voici le winice.dat que j'utilise actuellement, qui n'a aucune prétention si ce n'est de marcher ;p ;************ACiD BuRN's Winice.dat copier à partir d'ici************************ PENTIUM=ON NMI=ON ECHOKEYS=OFF NOLEDS=OFF NOPAGE=OFF SIWVIDRANGE=ON THREADP=ON LOWERCASE=OFF WDMEXPORTS=OFF MONITOR=0 PHYSMB=64 SYM=1024 HST=256 TRA=8 MACROS=32 DRAWSIZE=2048 INIT="lines 60;ww;wl;wr;wd 24;wc 24;code on;x;" F1="h;" F2="^wr;" F3="^src;" F4="^rs;" F5="^x;" F6="^ec;" F7="^here;" F8="^t;" F9="^bpx;" F10="^p;" F11="^G @SS:ESP;" F12="^p ret;" SF3="^format;" CF8="^XT;" CF9="TRACE OFF;" CF10="^XP;" CF11="SHOW B;" CF12="TRACE B;" AF1="^wr;" AF2="^wd;" AF3="^wc;" AF4="^s 0 l ffffffff 56,57,8b,7c,24,10,8b,74,24,0c,8b,4c,24,14,33,c0,f3,66,a7;" AF5="CLS;" AF8="^XT R;" AF11="^dd dataaddr->0;" AF12="^dd dataaddr->4;" CF1="altscr off; lines 60; wc 32; wd 8;" CF2="^wr;^wd;^wc;" ; WINICE.DAT ; (SIW95\WINICE.DAT) ; for use with SoftICE Versions greater than 3.0 (Windows 95) ; ; ************************************************************************* ; If your have MORE than 32MB of physical memory installed, change ; the PHYSMB line to the correct # of Megabytes. ; If you have LESS than 32MB you can save a bit of memory by ; specifying the correct # of Megabytes ; Example: PHYSMB=32 ; ************************************************************************* ; ***** Examples of sym files that can be included if you have the SDK ***** ; Change the path to the appropriate drive and directory ;LOAD=c:\windows\system\user.exe ;LOAD=c:\windows\system\gdi.exe ;LOAD=c:\windows\system\krnl386.exe ;LOAD=c:\windows\system\mmsystem.dll ;LOAD=c:\windows\system\win386.exe ; ***** Examples of export symbols that can be included ***** ; Change the path to the appropriate drive and directory ;EXP=c:\windows\system\vga.drv ;EXP=c:\windows\system\vga.3gr ;EXP=c:\windows\system\sound.drv ;EXP=c:\windows\system\mouse.drv ;EXP=c:\windows\system\netware.drv ;EXP=c:\windows\system\system.drv ;EXP=c:\windows\system\keyboard.drv ;EXP=c:\windows\system\toolhelp.dll ;EXP=c:\windows\system\shell.dll ;EXP=c:\windows\system\commdlg.dll ;EXP=c:\windows\system\olesvr.dll ;EXP=c:\windows\system\olecli.dll ;EXP=c:\windows\system\mmsystem.dll ;EXP=c:\windows\system\winoldap.mod ;EXP=c:\windows\progman.exe ;EXP=c:\windows\drwatson.exe ; ***** Examples of export symbols that can be included for Windows 95 ***** ; Change the path to the appropriate drive and directory EXP=c:\windows\system\kernel32.dll EXP=c:\windows\system\user32.dll EXP=c:\windows\system\gdi32.dll EXP=c:\windows\system\comdlg32.dll EXP=c:\windows\system\shell32.dll EXP=c:\windows\system\advapi32.dll EXP=c:\windows\system\Msvbvm50.dll EXP=c:\windows\system\Msvbvm60.dll EXP=c:\windows\system\shell232.dll EXP=c:\windows\system\comctl32.dll EXP=c:\windows\system\crtdll.dll EXP=c:\windows\system\version.dll EXP=c:\windows\system\netlib32.dll EXP=c:\windows\system\msshrui.dll EXP=c:\windows\system\msnet32.dll EXP=c:\windows\system\mspwl32.dll EXP=c:\windows\system\mpr.dll ;************End of ACiD BuRN's Winice.dat fin de sélection ***************** Donc vous copier / coller ceci dans un fichier nommé winice.dat et mettez-le à la place du vôtre !! Mais changez quand même le nombre de Ram par celui de votre PC (pas trop dur ;p) Voilà, ça sera tout pour la configuration de Soft-ice !! Passons aux commandes maintenant !!! ***************************** ** Commandes de Soft-ice: ** ***************************** - pour faire apparaître Soft-ice, pressez: Ctrl+D Tout d'abord, les points d'arrêt (Breakpoints)! On les utilise sur les fonctions de Windows (API) mais c'est une autre histoire! Vous verrez dans la suite du cours :] Pour poser un breakpoint, sous Soft-ice tapez: BPX API_windows (apiwindows représente la fonction Windows que vous voulez 'étudier') Apres avoir mis un bpx sur une API Windows vous pouvez par exemple voir la liste des bpx déjà posés! Liste des bpx: BL Editer un bpx: BE numéro_du_bpx Effacer un bpx: BC numéro_du_bpx Effacer tous les bpx: BC * Désactiver un bpx: BD numéro_du_bpx Désactiver tout: BD * Activer un BPX: BE numero_du_bpx Activer tous les BPX: BE * Il y a les: BPINT (breakpoint sur les interruptions comme INT3 ...) ex: BPINT 3 Il existe aussi les BPM et autres BPR (je vous reparle des BPR dans la partie sur le keygening) Je ne vois pas de commande TRES utile tout de suite! On verra bien si j'ai oublié qq chose d'important! Mais il existe des milliers de commandes dans Soft-ice! Le but premier du Logiciel et de debugger gentiment ses propres programmes :) Ce que je fais aussi, mais quand je code un keygen en asm (souvent comme un cow-boy et que je dois tracer pour voir ce qui part en couille *grin*) Maintenant quelques exemples d'utilisation de notre nouveau jouet !! Trouver les serials (Serial Fishing) :::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::::::::: Voilà, comment trouver les serials valides pour votre nom dans les programmes telles que WinZIP, WinImage ... (WinRAR c'est pas encore pareil (v2.0 a 2.5)) On commence avec un exemple: ******************************************* **** WWW GIF ANIMATOR 1.0 **** ******************************************* Entrez un nom, prénom, et un numéro de série à la mord-moi-le-noeud! On appuie sur OK. Là le programme nous envoie chier car le numéro est bidon. On va donc poser un point d'arrêt sur une fonction de Windows qui est très couramment utilisée dans ce genre de protection, en fait il y en a 2: Getwindowtexta pour les progs 32 bits (Getwindowtext pour 16 bits) getdlgitemtexta pour les progs 32 bits (getdlgitemtext pour 16 bits) Pour aller sous Soft-ice, il faut presser les touches Control+D. Une fois sous Soft-ice on tape: si vous n'avez pas: on appuie sur alt + R pour voir les registres (eax, edx ...) on appuie sur alt + D pour voir la zone data. Pour poser le point d'arrêt: BPX Getwindowtexta BPX getdlgitemtexta On appuie sur F5 et on retourne à Windows. J'ai entré pour First Name: ACiD pour Last Name : BuRN code : 12345 on appuie sur OK. Boum, Soft-ice est réapparu et nous dit : 'break due to BPX Getdlgitemtexta' On tape D EAX et on voit dans la zone data : ACiD BuRN On appuie une fois sur F5 car on est dans le 'contrôle' du nom et que l'on veut s'occuper du serial. Entre la zone data et la zone de code, il y a marqué : USER32 .... Nous ne sommes donc pas dans le programme, donc on fait F12 puis il n'y a plus rien. On est maintenant dans le programme. On trace comme un fou avec F10 et au bout d'un moment on voit dans la zone Registre EAX=00003039. Intéressant car si on fait : ? EAX on voit apparaître : 00003039 0000012345 "09" 3039 c'est en hexadécimal et 12345 c'est en décimal. 12345 ce ne serait pas le code que l'on a tapé au début ? Mais si, on ne doit pas être très loin. On continue à tracer (avec F10) tout en surveillant EAX et après quelques F10, eax change !!! EAX a changé. Il est devenu : EAX=7D5F4 on tape ? EAX on obtient: 0007D5F4 00005135314 Tiens si on essayait 513534 comme code ? On fait control + D et on tape BC 0,1 pour effacer les 2 points d'arrêt. F5 et nous voilà sous Windows. Donc on entre First Name: ACiD Last Name : BuRN Code : 513524 Et voilà le programme ne nous envoie pas chier, nous sommes maintenant enregistrés !!! Hihihi, trop simple n'est-ce-pas ? Mais bon, ne vous réjouissez pas trop vite, il existe des protections par name/serial BCP BCP plus dures, un exemple est Phrozen Crew trial crackme! Car dans ce cas là, j'ai dû faire une équation, et le serial n'est pas tapable au clavier directement.. je vous invite donc à lire ce cours qui se trouve sur ma page :) Petite astuce sur les programmes écrits en delphi: les API précédemment citées ne marchent pas en Delphi!! car ils ne sont pas utilisés! donc pour pouvoir Breaker: BPX hmemcpy <-- je me sers très souvent de celui-là !! On est sûr de stopper dans Soft-ice au moins! Dans de nombreux programmes, la comparaison GOOD serial / BAD serial se fait de la façon suivante: CMP EAX, EDX je good message jmp get_the_fuck_outta_here! En gros, le bon serial (dans EDX) est comparé au mauvais serial dans (EAX) Il suffit de faire: d EAX (pour voir le faux serial) d EDX (pour voir le bon serial) Autre astuce, pour ce genre de contrôle de serial !! Si le programme est en Delphi et que vous ne cherchez qu'un serial valide: mettez un bpx Hmemcpy après avoir entré un nom et numéro de série. Ensuite, pressez le bouton OK, et vous revenez sous Soft-ice, maintenant pressez F5 le nombre de fois nécessaire pour quitter Soft-ice mais comptez les !! exemple: 12 fois Ensuite, recommencez la même chose, mais arrêtez vous une fois avant le nombre de F5 que vous avez compté! Pour mon exemple: 12 fois - 1 = 11 fois donc vous pressez F5 11 fois !! Ensuite pressez F12 pour quitter les Dll tels que USER32, kernel32 une fois que vous êtes au bon endroit (vous verrez le nom de l'exe à la place du nom des dlls) commencez à tracer avec F10! Vous rencontrerez une série de RET, mais ça ne fait rien !!!! Au bout d'un moment, pas long du tout ;p vous allez vous retrouver avec qq chose du style: mov eax, blablabla mov EDX, blablabla Call blablabla <-- entrez dans ce call grâce à F8 jz blablabla Tracez ensuite avec F10 et vous devriez voir le fameux: CMP EAX, EDX décrit plus haut ;)) Note: en faisant: D eax et D edx sans entrer dans le call, on aurait eu les serials aussi !!! Et le jz (jz = je) , c'est lui qui défini si c'est ok !! Remplacez-le par un JMP par exemple et le programme ira toujours au bon message !! donc vous serez enregistré :) Oh my god hehe :) Je ne vais pas encore écrire un tut pour ça ;p mais je dois avoir encore un exemple sur un name / serial. Cette fois-ci, c'est sur un crackme programmé en Delphi :) donc on va utiliser BPX hmemcpy comme prévu :)) *********************************** **** Hellforge Crackme 2 **** *********************************** Ce crackme a une protection "Name/Serial"... chargez SI! Il y a 2 BPX utiles pour ce genre de protection : - bpx Getwindowtexta - bpx Getdlgitemtexta Ctrl+D entrez les 2 breakpoints du dessus F5 Enter name: ACiD BuRN et serial: 1122334455. Cliquez sur "Click here to check your serial !!!" Wrong code .. Quoi??? Nous ne sommes pas sous SI?? ! Donc ces breakpoints ne fonctionnent pas ici!! Merde!! On va essayer bpx hmemcpy, ça marche tout le temps! Ok, on réentre name: ACiD BuRN et serial: 1122334455. Cliquez sur le bouton et là on est de retour dans Soft-ice ! Cool ! Nous voyons KERNEL en bas de la fenêtre... il faut sortir d'ici. Pressez F12 autant de fois nécessaire (7x) pour que vous voyez en bas de la fenêtre: HF CRACKME .. Nous sommes à la bonne place... F10 pour continuer à tracer... EAX contient la longueur du nom : ACiD BuRN = 9 Continuez de tracer avec SI encore un peu et vous voyez que EAX=B92COC tapez d eax dans SI et vous voyez ACiD BuRN et un nombre: 104837121. Qu'est ce ? un serial? On va l'essayer! Désactivez tous les breakpoints avec BD * : nAME: ACiD BuRN cODE: 104837121 Cool, le message !!! Well done, Crackme cracked !! Comment keygener pas mal de programmes (utilisation des BPR...) ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: Avant de vous parler des méthodes comme l'utilisation de BPR, je vais vous décrire ce qu'est le keygening pour ceux qui ne savent pas !! Keygener un programme c'est quoi ? C'est écrire un programme qui génère des clefs (serials) valides pour un programme donné, en fonction des noms, numéro de série du disque dur ... Bref, on trace avec Soft-ice la génération du serial en mémoire et on reprogramme ceci, afin que l'on obtienne les codes valides pour ce programme très rapidement :) C'est très intéressant, croyez moi :) Bon tout d'abord, je vais vous montrer un exemple très simple !! Sans méthode spécifique, et ensuite, dans un prochain exemple vous montrer qu'utiliser les BPR est un gain de temps non négligeable !! ******************************************************************* **** How to keygen the Cracking4newies Crackme 3 project **** ******************************************************************* niveau: débutant I) C'est parti !! Ok, c'est parti, il est temps de keygener cette chiotte :) donc dans Soft-ice, mettez vos BPX préférés !! Ceux utilisés dans les protections par names / serials : bpx getwindowtewta et getdlgitemtexta . Entrez votre nom et un faux serial (name : ACiD BuRN / Serial : 12345). Clickez sur enter et vous êtes de retour dans Soft-ice !! Pressez F12 parce que vous n'êtes pas à la bonne place, mais dans cette merde de user32.dll... Maintenant, vous êtes dans le crackme ! (j'espère que vous comprenez tout, je suis trop fatigué !) Tracez tant que vous n'arrivez pas à ça: * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004010C6(C) | :004010AF 0FBE4415C0 movsx eax, byte ptr [ebp+edx-40] ; mets en eax la 1ère valeur ascii de votre nom (pour ACiD BuRN : A=41) :004010B4 03F0 add esi, eax / :004010B6 8D7DC0 lea edi, dword ptr [ebp-40] / :004010B9 83C9FF or ecx, FFFFFFFF / :004010BC 33C0 xor eax, eax / :004010BE 42 inc edx / Boucle :004010BF F2 repnz / :004010C0 AE scasb / :004010C1 F7D1 not ecx / :004010C3 49 dec ecx / :004010C4 3BD1 cmp edx, ecx / :004010C6 76E7 jbe 004010AF / Ok cool, mais que fait cette boucle ? : movsx eax, byte ptr [ebp+edx-40] <== eax = valeur ascii du caractère à la position EDX add esi, eax <== esi = esi + eax inc edx <== caractère suivant cmp edx, ecx <== compare la longueur du nom avec le compteur en edx jbe 004010AF <== Boucle tant que tout les chars n'ont pas été faits! Donc, cette boucle prends les valeurs ascii de chaque lettres et les ajoutes dans ESI. Résultat pour ACiD BuRN: 2A8h 41h + 43h + 69h + 44h + 20h + 42h + 75h + 52h + 4Eh = 2A8h A C i D space B u R N Après cette boucle, vous arrivez ici: :004010C8 897508 mov dword ptr [ebp+08], esi ; [ebp+8] prends la valeur d'ESI :004010CB C1650807 shl dword ptr [ebp+08], 07 ; [ebp+8] = shl [ebp+8],7 :004010CF 8D4DF4 lea ecx, dword ptr [ebp-0C] :004010D2 6A0A push 0000000A :004010D4 51 push ecx :004010D5 68E9030000 push 000003E9 :004010DA 53 push ebx Comme vous pouvez le voir, la valeur d'ESI (pour moi: 2A8) est placée dans [ebp+8]. Ensuite, on voit : shl dword ptr [ebp+08], 07 Intéressant ;) Ben, on continue à tracer :-] Tant que vous n'arrivez pas à ça : * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004010E4(C) | :00401102 8D55F4 lea edx, dword ptr [ebp-0C] :00401105 52 push edx :00401106 E840010000 call 0040124B :0040110B 8B4D08 mov ecx, dword ptr [ebp+08] ; ECX = [ebp+8] ([ebp+8]= shl esi,7) :0040110E 83C404 add esp, 00000004 :00401111 03CE add ecx, esi ; ECX = ECX + ESI (ESI=2A8 pour moi) :00401113 3BC8 cmp ecx, eax ; ? eax = fake serial / ? ecx = bon :00401115 6A00 push 00000000 :00401117 751B jne 00401134 ; si c'est pas égal saute à BAD CRACKER * Possible StringData Ref from Data Obj ->"Good!" | :00401119 685C504000 push 0040505C * Possible StringData Ref from Data Obj ->"Congratulations!!" | :0040111E 6848504000 push 00405048 :00401123 53 push ebx Sympa tout ça! Vous pouvez coder un keygen facilement non ? !! Laissez-moi vous répéter l'algo: 1st part: Additionnez les valeurs ascii du nom et mettez le résultat qq part (ESI en mémoire) 2nd part: Prenez la valeur en ESI et faites un shl,7 dessus et mettez le résultat qq part ([ebp+8] en mémoire) 3rd part: Additionnez la valeur de la première partie et additionnez là à celle de la 2ème partie 4th part: Prenez le résultat en décimal et vous avez votre serial :) Name : ACiD BuRN sERiAL : 87720 Je vous ai tout donné pour faire votre propre keygen, mais je vous file qd même mes sources: Je vais vous montrer 2 sources! Une en Delphi+asm et une en C+asm. Celle en Delphi a été codée à 2h du matins !! vite fait :) mais ça marche :)) *********************SOURCES DELPHI************************ procedure TForm1.Edit1Change(Sender: TObject); var i,ascii,result: integer; begin for i:=1 to length(edit1.text) do begin ascii:=ascii + ord(edit1.text[i]); end; asm mov eax,ascii mov ecx,ascii shl eax,7 add eax,ecx mov ascii,eax end; result:=ascii; edit2.text:=inttostr(result); end; end. *********************FIN DE SOURCES DELPHI********************************************* Maintenant la version en C+asm (le C me sert juste pour déclarer les variables! Bien moins chiant que l'asm direct!!) *********************SOURCES C++ + ASM************************************************ #include #include #include int main(){ int i,len; unsigned char name[100]; unsigned long check=0; printf("\[ Cracking4Newbies crackme3 ] *Keygen* By : ACiD BuRN / ECLiPSE 1999\n"); printf("\______________________________________________________________________\n"); printf("\nEnter your name: "); gets(name); len=strlen(name); asm { xor ecx, ecx xor edx, edx xor esi, esi xor edi, edi mov esi, [len] start: movsx eax, [name+ecx] add edi, eax mov eax, edi inc ecx cmp ecx, esi jne start shl edi, 7 add edi,eax mov [check], edi } printf("Your Serial is: %lu" ,check); printf("\nEnjoy!"); getch(); return 0; } *********************FIN DE SOURCES C++ + ASM**************************************** ************************************************************************************* **** BPR: La bonne méthode :) **** ************************************************************************************* Maintenant ! Utilisation des BPR pour keygener ! La technique que je vais vous montrer marche très très bien avec les programmes en C++ par exemple :) Je ne vais pas vous saouler longtemps, mais écrire directement un exemple d'utilisation de cette commande!! On va bosser sur un Crackme: RD116 Crackme Ok, la protection est de type name / serial! Ca a été écrit en C++ Coool, très bien pour s'amuser avec !! On peut keygener ce crackme sans utiliser les BPR, mais grâce aux BPR. Vous allez voir comment tomber directement sur la routine de génération du serial !!! Let's go: Entrez votre nom : ACiD BuRN et serial: 112233 Sous Soft-ice mettez les bpx suivants: bpx getdlgitemtexta et bpx getwindowtexta .... Ensuite pressez le bouton pour vérifiez le serial et vous êtes de retour sous Soft-ice!! On voit "Break due to BPX USER32!GETWINDOWTEXTA ... Ok! Alors ne pressez pas F11 ni F12 encore sinon on ne pourra pas examiner les paramètres sur la pile !! On va agir intelligemment plutôt ! On va examiner la pile ! Nous allons regarder les paramètres mais pour cela on va se mettre en Dword sous Soft-ice !! Ca sera plus lisible déjà. Sous Soft-ice: dd esp "dd" veut dire: display dword et "esp" c'est pour le pointeur de pile! Après avoir fait "dd esp", la fenêtre de Soft-ice change et on peut voir les paramètres : xxxx:yyyyyyyy A B C D ................ xxxx:yyyyyyyy E F G H ................ Où A,B,C,D,E... sont du genre: XXXXXXXX Vous devez voir qq chose qui ressemble à cela: xxxx:yyyyyyyy 5F403504 00000098 00654250 0000000A ........... On ne vas s'occuper que de çà !! (donc vous l'avez remarqué, ici A=5F403504 , B=00000098 ...) On voit ici l'adresse à laquelle notre nom se termine (00654250). Tapez D "adresse à laquelle finis le nom" exemple ici: D 00654250 Vous pouvez maintenant presser F11 et vous pouvez voir votre nom à l'adresse que vous avez tapé :) C'est bon signe déjà !! Nous allons maintenant poser un bpr (break on memory range). Ce type de bp marche de la façon suivante: bpr "adresse de départ" "adresse de fin" RW RW veut dire: Read et write (lecture et écriture) Donc, ça stoppera qd on lit ou écrit à cette adresse en mémoire ! Donc tapez ceci sous Soft-ice: bpr 654250 654250+(longueur_du_nom - 1) rw Dans notre exemple, cela donne pour ACiD BuRN (longueur: 9 -> 9 - 1 = 8) bpr 654250 654250+8 rw Vous pouvez désactiver les bpx sur getwindowtexta et getdlgitemtexta now ! Vous n'avez plus qu'à presser F5, et on se retrouvera directement dans la routine de génération de serial !! Notes: Pressez F5 tant que vous n'êtes pas dans le crackme !! C'est-à-dire que les DLL on s'en branle :) Une fois que vous êtes dans le crackme vous arrivez direct sur la génération. Une partie qui bosse sur le nom: :00401580 8A18 mov bl, byte ptr [eax] ; Prends la valeur ascii (position cl) :00401582 32D9 xor bl, cl ; XOR cette valeur avec le compteur :00401584 8818 mov byte ptr [eax], bl ; store le résultat :00401586 41 inc ecx ; incrémente ecx (ecx = ecx + 1 ) :00401587 40 inc eax ; incrémente eax (eax = eax + 1 ) :00401588 803800 cmp byte ptr [eax], 00 ; encore des lettres ? :0040158B 75F3 jne 00401580 ; si oui, lettre suivante! :0040158D 33C0 xor eax, eax ; remet à zero :0040158F 33DB xor ebx, ebx ; les registres :00401591 33C9 xor ecx, ecx ; EAX, EBX, ECX :00401593 B90A000000 mov ecx, 0000000A ; ECX = Ah (10 en hexa) :00401598 33D2 xor edx, edx ; EDX = 0 :0040159A 8B45F0 mov eax, dword ptr [ebp-10] ; on récupère les valeurs 2ème partie: sur le serial entré : * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004015A8(C) | :0040159D 8A18 mov bl, byte ptr [eax] ; Prends la valeur ascii (position cl) :0040159F 32D9 xor bl, cl ; XOR cette valeur avec le compteur :004015A1 8818 mov byte ptr [eax], bl ; store le résultat :004015A3 41 inc ecx ; incrémente ecx (ecx = ecx + 1 ) :004015A4 40 inc eax ; incrémente eax (eax = eax + 1 ) :004015A5 803800 cmp byte ptr [eax], 00 ; encore des chiffres ? :004015A8 75F3 jne 0040159D :004015AA 8B45E4 mov eax, dword ptr [ebp-1C] :004015AD 8B55F0 mov edx, dword ptr [ebp-10] Et la dernière routine: vérification du serial * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004015BF(C) | :004015B0 33C9 xor ecx, ecx ; ECX = 0 :004015B2 8A18 mov bl, byte ptr [eax] ; on récupère les valeurs et on les :004015B4 8A0A mov cl, byte ptr [edx] ; mets dans EAX et EDX :004015B6 3AD9 cmp bl, cl ; on compare! c'est égal ? :004015B8 7509 jne 004015C3 ; non jmp : bad cracker :004015BA 40 inc eax ; eax = eax + 1 :004015BB 42 inc edx ; edx = edx + 1 :004015BC 803800 cmp byte ptr [eax], 00 ; on fait ça pour tout ! :004015BF 75EF jne 004015B0 :004015C1 EB16 jmp 004015D9 ; si tout est ok! GENTIL CRACKER * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00401503(U), :0040151C(U), :004015B8(C) | :004015C3 6A00 push 00000000 * Possible StringData Ref from Data Obj ->"Rat" | :004015C5 686C304000 push 0040306C * Possible StringData Ref from Data Obj ->"Mauvais serial, essaye encore... " .......... * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004015C1(U) | :004015D9 6A00 push 00000000 ; tout est ok !! on arrive ici * Possible StringData Ref from Data Obj ->"Bien jou" | :004015DB 6834304000 push 00403034 * Possible StringData Ref from Data Obj ->"C' est crack" | :004015E0 6820304000 push 00403020 :004015E5 8B4DE0 mov ecx, dword ptr [ebp-20] Donc voilà !! Je crois que vous avez compris ce qu'il se passe ici :) La routine de génération est très simple !! Je ne vais donc pas m'attarder dessus, mais je vais donner les sources du keygen bien sûr !! Après le C++, le Delphi, c'est au tour du VB !! Ayant la flemme de traduire ça en ASM (très simple, mais j'ai pas le goût), je vous propose tout de même ces sources !! Le but de cette explication était la familiarisation avec les BPR !! Pas de savoir keygener juste ce crackme là !! Avec cette technique vous pouvez keygener bcp de choses, ensuite ça dépends de votre niveau en asm et de la registration !! Si ça fait 1000 lignes ! On fait copier-coller ;) et on programme en ASM sans trop se poser de questions ! Bref, voici les sources: ********************** Source en VB: RDD-116 Crackme 1 Keygen*********************** Private Sub Text1_Change() If Len(Text1.Text) < 6 Then Text2.Text = "Le nom doit être supérieur à 6 chars" Else For i = 1 To Len(Text1.Text) a = 9 + i temp = Asc(Mid$(Text1.Text, i, 1)) Xor i Xor a result = result & Chr(temp) Next i Text2.Text = result End If End Sub ********************** Source en VB: RDD-116 Crackme 1 Keygen*********************** Hehe simple non ? Voilà, la partie des keygens est terminée, mais entraînez-vous avec les BPR! C'est super et utilisé par bcp de keygeners aussi... Pour le Delphi, il vous faut trouver l'adresse mémoire de votre nom et faire à peu près la même chose ensuite :)) Enjoy ! -¤)-[ tHE ANALYST ]-(¤- ^^^^^^^^^^^^^^^^^^^^^^^