cours de cracking

141
Cours récapitulatif de cracking par Acid Burn Publié par Tsehp mai 2000 Au programme: Introduction Les Bases minimales requises (sauts conditionnels, nop, call ...) Introduction à W32Dasm8x Patcher les protections avec Registrations (serial, name / serials) Introduction à Soft-ice (configuration et commandes de base) Trouver des serials valides pour vos noms avec Soft-ice Comment keygener pas mal de programmes (utilisation des BPR...) Transformer un Programme en son propre keygen Time Limits (limitation de 30 jours et autres merdes !!) Nag et autres Splash screen (diverse méthodes...) Keyfile CD Check (les BPX, et techniques diverses..) Visual Basic (keygener, serialiser, patcher, tout sur le VB !!) JAVA Reverse Engineering Manual Unpacking (comment unpacker, les tools, méthodes...) Checksum (comment les contourner) Anti Soft-ice Divers Greetings 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

Upload: mass-murderer63

Post on 06-Jun-2015

5.525 views

Category:

Documents


22 download

DESCRIPTION

un cours sur le cracking

TRANSCRIPT

Page 1: Cours De Cracking

Cours récapitulatif de cracking par Acid Burn

Publié par Tsehp mai 2000

Au programme:IntroductionLes Bases minimales requises (sauts conditionnels, nop, call ...)Introduction à W32Dasm8xPatcher les protections avec Registrations (serial, name / serials)Introduction à Soft-ice (configuration et commandes de base)Trouver des serials valides pour vos noms avec Soft-iceComment keygener pas mal de programmes (utilisation des BPR...)Transformer un Programme en son propre keygenTime Limits (limitation de 30 jours et autres merdes !!)Nag et autres Splash screen (diverse méthodes...)KeyfileCD Check (les BPX, et techniques diverses..)Visual Basic (keygener, serialiser, patcher, tout sur le VB !!)JAVA Reverse EngineeringManual Unpacking (comment unpacker, les tools, méthodes...)Checksum (comment les contourner)Anti Soft-iceDiversGreetingsConclusion

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 couranteset 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 assezgrande !! 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 fairedes 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 aitquelques "âneries", je serais content si vous pouviez m'en faire part!Merci et sur ce, bonne lecture.

[ ACiD BuRN ]

Page 2: Cours De Cracking

ESSAY :

*************************************************************************** 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 suitesans 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 quiexiste.Ce langage retrouve sa place dans tous les programmes car il nefaut pas oublier que n'importe quel programme, écrit dans n'importe quel langage est finalement traduit en langage machinepour être exécuté...Si on désassemble n'importe quel programme, on retrouve un listingen ASM, d'où l'utilité de connaître l'assembleur.Passons à l'étude des instructions (Très basique) afin d'éclaircirles 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.

Page 3: Cours De Cracking

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

Page 4: Cours De Cracking

Voilà, ça sera tout pour les bases en ASM!! Ces quelques descriptions ont, je l'espère, mis au clairles qq problèmes pouvant être rencontrés du à l'incompréhensionde certaines instructions!!Mais il serait préférable pour vous d'avoir un livre d'asmprès de vous, cela vous permettrais de chercher la descriptiondes 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 sertet quelles sont ses principales options!

W32Dasm est un désassembleur! Il permet de désassembler n'importe quelfichier de type EXE, DLL, OCX ... pour obtenir son équivalenten asm!A quoi bon ? hehe ce genre de programme vous permettra de crackerqq jeux, de s'enregistrer dans vos programmes et encore des tas d'autreschoses !!!

Utilisation:

Après avoir dézippé W32Dasm dans un répertoire, il vous faudra configurerla 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 : widdings 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 disassembleC'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 essayerpar exemple!

Après avoir désassemblé, vous pouvez sauvegarder ce fichier pour pouvoirle 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 fourniavec une aide super !!! décrivant avec précision les différentes commandes!

Page 5: Cours De Cracking

Pour finir cette brève description des menus, je vais vous décrire le menuRefs!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 leprogramme 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 toucheShift. Maintenant allez sur la dernière ligne à copier, et vous verrez quetoutes les lignes entre les 2 points que vous avez sélectionnés contiennentdes points rouges !!Cela signifie que vous pouvez maintenant copier-coller le texte qui est sélectionné!Ctrl+C = copie le texteCtrl+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 protectionspar serials !!

Théorie:

Dans de nombreux sharewares, vous rencontrez des protections par name / serialset 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 oeil 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 !!

Page 6: Cours De Cracking

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ébutsi vous avez oublié la fonction de jne...Que fait donc ce code ?Si le code n'est pas égal au bon code : TEST 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 validedonc 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 jamaisavec 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 quele 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 pouvezutiliser 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

Page 7: Cours De Cracking

é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: 85C075128D856CFFVous devez trouver un seul endroit correspondant à ces octets sinonfaites une recherche avec plus d'octets!!Une fois que vous avez trouvé, remplacez par: 33C075128D856CFFsauvegardez le fichier et c'est prêt!!

NOTE: si vous avez ouvert le fichier et qu'il est toujours ouvert parW32Dasm, vous ne pourrez pas 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 renommezl'extension en .AB par exemple! Désassemblez le fichier avec l'extension .abet une fois que vous savez où il faut patcher, vous ouvrez la copiedu 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 basede 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 pardes call ou sauts conditionnels !!Vous avez juste à modifier le programme pour qu'il saute en versionenregistré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 TESTen 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 oeil au début du cours vous avez

Page 8: Cours De Cracking

sûrement remarqué l'instruction: NOP (no operation)!!!Cette instruction ne fait rien du tout !! Chouette on va s'en servirpour 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 servireztoute 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 desérie. Nous allons voir comment faire quand un prog accepte le serialmais dès qu'on le relance, il nous dit version non enregistrée !!Et pour finir réactiver une fonction du prog accessible seulement enversion 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 putauthenticity 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ésassembleavec W32Dasm, on va dans String Data References et on trouve :

.... String Resource ID=00106: "Registration failed" String Resource ID=00107: "Thank you for support" ....

Page 9: Cours De Cracking

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 00413c93jne 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 maisc'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é ! :)

Page 10: Cours De Cracking

Mais, n'oublions pas de tester le proggy !! et on voit les 2 fonctionsdé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 004138e6par 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 programmepour qu'il accepte tous les serials à la con, et comment réactiverdes fonctions désactivées !Il existe des programmes BEAUCOUP plus durs à patcher et aussi encore plussimple que celui là !!

Note: si jamais après avoir désassemblé vous ne voyez aucune StringData 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 :)

Page 11: Cours De Cracking

//-------------------------- 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

Page 12: Cours De Cracking

if OpenDialog1.Execute then { affiche une "Open dialog box" } begin AssignFile(F, OpenDialog1.FileName);{$I-} Reset (F, 1); {$I+} If IOResult <> 0 then beginMessageDlg('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);begincloseend;

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é partout crackers digne de ce nom.Grâce à ce programme, la seule chose qui vous limite vraiment c'est vouset vos connaissances, on peut cracker des dongles (AutoCAD, 3DSMax),trouver des serials, faire des keygens (très utile pour tracer les routinesde registration) ...Bref, je vais vous citer ici les différentes commandes utiles et nécessairespour 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 .

Page 13: Cours De Cracking

Donc éditez votre fichier winice.dat avec Notepad par exemple, et voiciles 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 dansles 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 modifiepas ç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 avezsûrement remarqué les ";" , les points virgules mettent en commentaires !donc il faut les enlever sinon on ne pourra rien cracker car les bpxsur les API Windows seront impossibles (si vous comprenez pas ce que je raconte ;pca 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 directoryEXP=c:\windows\system\kernel32.dllEXP=c:\windows\system\user32.dllEXP=c:\windows\system\gdi32.dllEXP=c:\windows\system\comdlg32.dllEXP=c:\windows\system\shell32.dll

Page 14: Cours De Cracking

EXP=c:\windows\system\advapi32.dllEXP=c:\windows\system\Msvbvm50.dllEXP=c:\windows\system\Msvbvm60.dllEXP=c:\windows\system\shell232.dllEXP=c:\windows\system\comctl32.dllEXP=c:\windows\system\crtdll.dllEXP=c:\windows\system\version.dllEXP=c:\windows\system\netlib32.dllEXP=c:\windows\system\msshrui.dllEXP=c:\windows\system\msnet32.dllEXP=c:\windows\system\mspwl32.dllEXP=c:\windows\system\mpr.dll

Vous avez sûrement remarqué que j'ai ajouté 2 fichiers dll dans la listeci-dessus par rapport à avant:

EXP=c:\windows\system\Msvbvm50.dllEXP=c:\windows\system\Msvbvm60.dll

Rajoutez-les !! On en a besoin si on veut cracker les programmes en VisualBasic :-)

Pour ceux qui s'en branlent de ce que je raconte (il y en a toujours :/), voicile winice.dat que j'utilise actuellement, qui n'a aucune prétention si ce n'estde marcher ;p

;************ACiD BuRN's Winice.dat copier à partir d'ici************************

PENTIUM=ONNMI=ONECHOKEYS=OFFNOLEDS=OFFNOPAGE=OFFSIWVIDRANGE=ONTHREADP=ONLOWERCASE=OFFWDMEXPORTS=OFFMONITOR=0

PHYSMB=64SYM=1024HST=256TRA=8MACROS=32DRAWSIZE=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;"

Page 15: Cours De Cracking

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

Page 16: Cours De Cracking

; ***** Examples of export symbols that can be included for Windows 95 *****; Change the path to the appropriate drive and directoryEXP=c:\windows\system\kernel32.dllEXP=c:\windows\system\user32.dllEXP=c:\windows\system\gdi32.dllEXP=c:\windows\system\comdlg32.dllEXP=c:\windows\system\shell32.dllEXP=c:\windows\system\advapi32.dllEXP=c:\windows\system\Msvbvm50.dllEXP=c:\windows\system\Msvbvm60.dllEXP=c:\windows\system\shell232.dllEXP=c:\windows\system\comctl32.dllEXP=c:\windows\system\crtdll.dllEXP=c:\windows\system\version.dllEXP=c:\windows\system\netlib32.dllEXP=c:\windows\system\msshrui.dllEXP=c:\windows\system\msnet32.dllEXP=c:\windows\system\mspwl32.dllEXP=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 etmettez-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 exemplevoir la liste des bpx déjà posés!

Liste des bpx: BLEditer un bpx: BE numéro_du_bpxEffacer un bpx: BC numéro_du_bpxEffacer tous les bpx: BC *Désactiver un bpx: BD numéro_du_bpxDésactiver tout: BD *Activer un BPX: BE numero_du_bpxActiver tous les BPX: BE *

Il y a les: BPINT (breakpoint sur les interruptions comme INT3 ...)ex: BPINT 3

Page 17: Cours De Cracking

Il existe aussi les BPM et autres BPR (je vous reparle des BPR dans la partiesur le keygening)

Je ne vois pas de commande TRES utile tout de suite! On verra bien si j'aioublié qq chose d'important!Mais il existe des milliers de commandes dans Soft-ice! Le but premierdu Logiciel et de debugger gentiment ses propres programmes :)Ce que je fais aussi, mais quand je code un keygen en asm (souvent comme uncow-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 programmestelles 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 quiest 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.

Page 18: Cours De Cracking

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 BuRNOn appuie une fois sur F5 car on est dans le 'contrôle' du nomet 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 plusrien. On est maintenant dans le programme.On trace comme un fou avec F10 et au bout d'un moment on voit dansla zone Registre EAX=00003039. Intéressant car si on fait :? EAXon 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èsquelques F10, eax change !!!EAX a changé. Il est devenu : EAX=7D5F4on tape ? EAXon obtient: 0007D5F4 00005135314Tiens 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 maintenantenregistré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 tapableau clavier directement.. je vous invite donc à lire ce cours qui se trouve surma 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 pasutilisés! donc pour pouvoir Breaker:BPX hmemcpy <-- je me sers très souvent de celui-là !! On est sûr destopper dans Soft-ice au moins!Dans de nombreux programmes, la comparaison GOOD serial / BAD serial se faitde la façon suivante:

CMP EAX, EDXje good messagejmp 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)

Page 19: Cours De Cracking

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, maintenantpressez F5 le nombre de fois nécessaire pour quitter Soft-ice mais comptezles !! exemple: 12 foisEnsuite, 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 foisdonc vous pressez F5 11 fois !!Ensuite pressez F12 pour quitter les Dll tels que USER32, kernel32 une foisque vous êtes au bon endroit (vous verrez le nom de l'exe à la place dunom 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 à F8jz blablabla

Tracez ensuite avec F10 et vous devriez voir le fameux: CMP EAX, EDXdécrit plus haut ;))Note: en faisant: D eax et D edx sans entrer dans le call, on aurait eu lesserials aussi !!!Et le jz (jz = je) , c'est lui qui défini si c'est ok !! Remplacez-lepar 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 encoreun exemple sur un name / serial.Cette fois-ci, c'est sur un crackme programmé en Delphi :) doncon 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.

Page 20: Cours De Cracking

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=B92COCtapez d eax dans SI et vous voyez ACiD BuRNet un nombre: 104837121. Qu'est ce ? un serial?On va l'essayer!

Désactivez tous les breakpoints avec BD * :

nAME: ACiD BuRNcODE: 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 vaisvous 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 pourun programme donné, en fonction des noms, numéro de série dudisque dur ...Bref, on trace avec Soft-ice la génération du serial en mémoire eton reprogramme ceci, afin que l'on obtienne les codes valides pource 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 exemplevous 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 dansSoft-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

Page 21: Cours De Cracking

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 EDXadd esi, eax <== esi = esi + eaxinc edx <== caractère suivantcmp edx, ecx <== compare la longueur du nom avec le compteur en edxjbe 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

Page 22: Cours De Cracking

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], 07Inté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 BuRNsERiAL : 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 :))

Page 23: Cours De Cracking

*********************SOURCES DELPHI************************

procedure TForm1.Edit1Change(Sender: TObject);

var i,ascii,result: integer;

beginfor 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,eaxend;

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{

Page 24: Cours De Cracking

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 programmesen C++ par exemple :)Je ne vais pas vous saouler longtemps, mais écrire directement un exempled'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érationdu serial !!! Let's go:

Entrez votre nom : ACiD BuRN et serial: 112233Sous Soft-ice mettez les bpx suivants: bpx getdlgitemtexta etbpx getwindowtexta ....Ensuite pressez le bouton pour vérifiez le serial et vous êtes de retoursous Soft-ice!!On voit "Break due to BPX USER32!GETWINDOWTEXTA ...

Page 25: Cours De Cracking

Ok! Alors ne pressez pas F11 ni F12 encore sinon on ne pourra pas examinerles 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 enDword 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 006542500000000A ...........

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'adresseque 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 laroutine 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 lagénération.

Une partie qui bosse sur le nom:

Page 26: Cours De Cracking

: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

Page 27: Cours De Cracking

: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 keygenbien 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 vouspropose 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épendsde votre niveau en asm et de la registration !!Si ça fait 1000 lignes ! On fait copier-coller ;) et on programme en ASMsans trop se poser de questions !Bref, voici les sources:

Page 28: Cours De Cracking

********************** 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 + itemp = Asc(Mid$(Text1.Text, i, 1)) Xor i Xor aresult = result & Chr(temp)

Next i

Text2.Text = resultEnd IfEnd 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 !

Transformer un programme en son propre keygen

Muad'dib Keygen Crackme #1

- Afficher le bon serial à la place du msg d'erreur

Introduction:

Il faut faire un keygen, les keygens c'est marrant mais on va apprendre autre chose cette fois.On ne va pas coder un keygen (qui d'ailleurs est très simple à faire) mais forcer le crackmeà afficher le bon serial à la place du message: "try again , Blablabla.."

utils nécessaires:

- Soft-ice (it r0x)- éditeur hexadécimal

Let's kick some ass =)

Page 29: Cours De Cracking

Bon, déjà on lance ce con de crackme, et on entre son nom: ACiD BuRN et un serialà 2 francs: 0800Ensuite dans Soft-ice (ctrl+d) on tape: Bpx hmemcpyOn click sur Register et on arrive dans Soft-ice.. F12 pour sortir dans dlls et dèsqu'on est dans le crackme on commence à tracer.On arrive assez vite à une routine qui contrôle le type de nom entré (minuscules,majuscules, espaces, chiffres ...) mais il y a d'abord un check sur la longueur du nom:

025F:004010A3 83F804 CMP EAX,04 <-- compare la taille du nom à 4025F:004010A6 7304 JAE 004010AC <-- ok si supérieur ou égal à 4025F:004010A8 C9 LEAVE025F:004010A9 C21000 RET 0010

Apres ça, il y a le contrôle des caractères :

025F:004010AC BA00000000 MOV EDX,00000000025F:004010B1 8A8200314000 MOV AL,[EDX+00403100]025F:004010B7 3C00 CMP AL,00025F:004010B9 7426 JZ 004010E1025F:004010BB 3C20 CMP AL,20025F:004010BD 7408 JZ 004010C7025F:004010BF 3C41 CMP AL,41025F:004010C1 7C07 JL 004010CA025F:004010C3 3C5A CMP AL,5A025F:004010C5 7F03 JG 004010CA025F:004010C7 42 INC EDX025F:004010C8 EBE7 JMP 004010B1025F:004010CA 6A00 PUSH 00025F:004010CC 687D304000 PUSH 0040307D025F:004010D1 684D304000 PUSH 0040304D025F:004010D6 6A00 PUSH 00025F:004010D8 E8BD000000 CALL USER32!MessageBoxA

Cette merde check si notre nom a des minuscules, majuscules, espaces ...Si c'est pas ok, ça jump à 4010CA, et un message box nous dit de n'enter que des majusculeset des espaces...Merci, mais on avait compris ;)

Donc, on sort de Soft-ice, on met: ACID BURN comme nom, et 0800 tjs pour le serialet on y retourne. On trace et on tombe sur la comparaison finale:

025F:0040112D 68F6304000 PUSH 004030F6 <- d 4030f6 = fake serial025F:00401132 6800314000 PUSH 00403100 <- d 403100 = bon serial025F:00401137 E840000000 CALL KERNEL32!lstrcmp 025F:0040113C 83F800 CMP EAX,00025F:0040113F 7517 JNZ 00401158025F:00401141 6A00 PUSH 00

Page 30: Cours De Cracking

025F:00401143 68D3304000 PUSH 004030D3 <- d 4030D3 = Good (titre de la msg box)025F:00401148 6889304000 PUSH 00403089 <- d 403089 = Bon message qd tu as le serial025F:0040114D 6A00 PUSH 00025F:0040114F E846000000 CALL USER32!MessageBoxA025F:00401154 C9 LEAVE025F:00401155 C21000 RET 0010025F:00401158 6A00 PUSH 00025F:0040115A 68EA304000 PUSH 004030EA <- d 4030EA = Bad (titre de la msgbox)025F:0040115F 68DD304000 PUSH 004030DD <- d 4030DD = bad boy ;p pas le bon pass025F:00401164 6A00 PUSH 00025F:00401166 E82F000000 CALL USER32!MessageBoxA

En résumé, on voit une comparaison bon serial / mauvais serial exécutée par l'APIlstrcmp, qui compare des strings. On voit un CMP EAX,00 : si la comparaison est ok le serial est bon, donc EAX = 0 et on affiche le bon messagebox :)Sinon, ça saute à la mauvaise box !!

Ok donc pour nous, ici :

025F:0040112D 68F6304000 PUSH 004030F6 <- d 4030f6 = fake serial025F:00401132 6800314000 PUSH 00403100 <- d 403100 = bon serial

d 4030f6 nous donne: 0800d 403100 nous donne: XZP]P[LKW

Le bon serial ok, mais c'est pas ça qu'on veut :)On veut forcer le prog à montrer le bon serial à la place du message d'erreur :)Pour cela, on voit que juste avant la msg box Bad serial il y a 2 push :

le caption du titre de la title bar = push 4030EAle texte du message du msgbox = push 4030DD

Il push ces merdes, et ensuite il affiche le message à la con !Donc pour le faire afficher le bon serial tu prends l'adresse du push 'bon serial' et tu lacopies à la place du push 'message comme quoi tu as foiré' !!

025F:0040115A 68EA304000 PUSH 004030EA 025F:0040115F 68DD304000 PUSH 004030DD 025F:00401164 6A00 PUSH 00025F:00401166 E82F000000 CALL USER32!MessageBoxA

cela devient:

025F:0040115A 68EA304000 PUSH 004030EA 025F:0040115F 6800314000 PUSH 00403100 <-- push bon serial025F:00401164 6A00 PUSH 00

Page 31: Cours De Cracking

025F:00401166 E82F000000 CALL USER32!MessageBoxA

On a maintenant plus qu'à modifier physiquement notre crackme, et le bon pass apparaîtraà la place de l'erreur :) et voilà notre super keygen pour branleurs :)Hehe, c'est rapide, efficace, et on se fatigue pas :P

on cherche donc dans l'exe: 68EA30400068DD304000 on remplace dans l'exe par: 68EA3040006800314000

Tu saves le fichier, et tu lances, mets un serial en majuscules et goodie :))Le good serial apparaît, Facile ....

Remarques on a toujours le titre : erreur code dans la msg box, rien ne vous empêchede le changer en: Keygen ;)

*************************************************************** Reprogrammer la routine de Contrôle du serial ***************************************************************

Toujours sur le même crackme !!On va donc recoder le check du serial dans Soft-ice pour s'occuper,ça va prendre 10 secs, mais bon ;)C'est juste pour montrer que on peut faire bcp de choses en fait....

notre routine de base:

025F:0040112D 68F6304000 PUSH 004030F6 <- d 4030f6 = fake serial025F:00401132 6800314000 PUSH 00403100 <- d 403100 = bon serial025F:00401137 E840000000 CALL KERNEL32!lstrcmp 025F:0040113C 83F800 CMP EAX,00025F:0040113F 7517 JNZ 00401158025F:00401141 6A00 PUSH 00025F:00401143 68D3304000 PUSH 004030D3 <- d 4030D3 = Good (titre de la msg box)025F:00401148 6889304000 PUSH 00403089 <- d 403089 = Bon message qd tu as le serial025F:0040114D 6A00 PUSH 00025F:0040114F E846000000 CALL USER32!MessageBoxA025F:00401154 C9 LEAVE025F:00401155 C21000 RET 0010025F:00401158 6A00 PUSH 00025F:0040115A 68EA304000 PUSH 004030EA <- d 4030EA = Bad (titre de la msgbox)025F:0040115F 68DD304000 PUSH 004030DD <- d 4030DD = bad boy ;p pas le bon pass025F:00401164 6A00 PUSH 00025F:00401166 E82F000000 CALL USER32!MessageBoxA

Comparaison grâce à l'API lstrcmp.On va transcrire ça en :

Page 32: Cours De Cracking

025F:0040112D A1F6304000 MOV EAX,[004030F6]025F:00401132 8B1500314000 MOV EDX,[00403100]025F:00401138 3BC2 CMP EAX,EDX025F:0040113A 7405 JZ 00401141025F:0040113C EB1A JMP 00401158025F:0040113E 90 NOP025F:0040113F 90 NOP025F:00401140 90 NOP025F:00401141 6A00 PUSH 00025F:00401143 68D3304000 PUSH 004030D3025F:00401148 6889304000 PUSH 00403089025F:0040114D 6A00 PUSH 00025F:0040114F E846000000 CALL USER32!MessageBoxA025F:00401154 C9 LEAVE025F:00401155 C21000 RET 0010025F:00401158 6A00 PUSH 00025F:0040115A 68EA304000 PUSH 004030EA025F:0040115F 68DD304000 PUSH 004030DD025F:00401164 6A00 PUSH 00025F:00401166 E82F000000 CALL USER32!MessageBoxA

Ceci fait exactement la même chose, mais n'utilise pas d'API pour comparer.On met en EAX: l'adresse du serial entré, et en EDX le bon serial.On les compare via : CMP EAX, EDXEnsuite un saut conditionnel à la con et un Jump...Les nop n'étaient pas utiles, mais ça fais plus clean ;)Voilà, le prog contrôle si le serial est valide d'une autre manière, ça sert àrien, c'était juste pour montrer ce qu'on peut faire avec de l'imagination, heheOn peut bien s'amuser donc :]

Time Limits (limitation de 30 jours et autres merdes !!)

Comme vous l'avez sûrement remarqué, il existe des programmesqui ne sont pas enregistrables car il n'y pas moyen de s'enregistrer !!Ils sont en générale limités à 30 jours!!C'est ce qu'on appelle: Time limit protection !!! Comment cracker ça ?Il y a plusieurs façons !! Nous allons voir ça de suite !!

Méthode avec W32Dasm:

Vous avez un programme nomme X, qui après 30 jours ne marche plus :(Mais en revanche, il nous envoie une messagebox disant:"La période d'évaluation est terminée..." ou "Trial version expirée..."Bref ce genre de conneries !! Alors si vous avez ça, vous lancez W32Dasm et désassemblez le fichier à cracker.Vous cherchez cette phrase dans les String Data References et une foisque vous avez trouvé, double-clickez dessus afin d'aller à la placede cette phrase dans W32Dasm !!Et maintenant ?? Ben on étudie le code aux alentours !! Ca ne vas pas êtrebien dur !!

Généralement vous devriez trouver au dessus du message d'erreur des sautsconditionnels de type JL, JLE, JG, JGE .....

Page 33: Cours De Cracking

Par exemple:

CMP DWORD PTR EAX, 1E <-- 1Eh = 30 en décimal (30 jours!)JLE 00405840 <-- jump au programme si c'est égal ou inférieur à 30 jours

Ici on voit qu'il compare le nombre de jours écoulés avec 30!Tant que c'est inférieur ou égal à 30 jours le programme marchera !!Mais une fois dépassé les 30 jours !! Ca marche plus :(Donc pour cracker ça on force le programme à sauter quoi qu'il arrive en changeantle JLE en JMP !! et le programme sautera inconditionellement comme si de rien n'étais!Il croira tjs que l'on est encore dans la période des 30 jours heheh !!

Avec Soft-ice:

Tout d'abord regardons les API utilisées dans les time limites!! :(eq: win32API.hlp)Je ne traduirais pas, pour ne pas détériorer les infos données.

********************************************************************************************

* GetFileTime

The GetFileTime function retrieves the date and time that a file was created, last accessed, and last modified.

BOOL GetFileTime( HANDLE hFile, // identifies the file LPFILETIME lpCreationTime, // address of creation time LPFILETIME lpLastAccessTime, // address of last access time LPFILETIME lpLastWriteTime // address of last write time );

ReturnsIf the function succeeds, the return value is TRUE.

If the function fails, the return value is FALSE. To get extended error information, callGetLastError

********************************************************************************************

* GetLocalTime

GetLocalTime function retrieves the current local date and time.

VOID GetLocalTime( LPSYSTEMTIME lpSystemTime // address of system time structure );

Returns

Page 34: Cours De Cracking

This function does not return a value.

********************************************************************************************

* GetSystemTime

The GetSystemTime function retrieves the current system date and time. The system timeis expressed in Coordinated Universal Time (UTC).

VOID GetSystemTime( LPSYSTEMTIME lpSystemTime // address of system time structure );

ReturnsThis function does not return a value.

********************************************************************************************

* SystemTimeToFileTime

The SystemTimeToFileTime function converts a system time to a file time.

BOOL SystemTimeToFileTime( CONST SYSTEMTIME * lpst, // address of system time to convert LPFILETIME lpft // address of buffer for converted file time );

ReturnsIf the function succeeds, the return value is TRUE.

If the function fails, the return value is FALSE. To get extended error information,call GetLastError.

********************************************************************************************

Voilà !! Donc ça c'était les API les plus couramment utilisées dans les protectionspar time limites!Cependant, l'API la plus souvent utilisée est : GetlocaltimeDonc vous mettez un Bpx dessus et vous lancez le programme !Soft-ice break ! Pressez F12 pour arriver au bon endroit dans le programme et commencerà tracer !!Si vous voyez un saut de type: JL, JLE, JGE, JG vous savez ce qu'il vousreste à faire !!Je ne vais pas écrire des tonnes encore sur cette protection aussi stupide quesimple à cracker !!

Page 35: Cours De Cracking

Vous trouvez un exemple de Time limite mais dans la partie Visual Basic!!Comment cracker un programme VB avec W32Dasm original !! ;-)l33t hehe

Sinon, j'espère que vous voyez comment cracker ça maintenant ......

Nag et autres Splash screen (diverse méthodes...)

C'est la partie qui me fait le plus chier à écrire je pense !!Pourquoi ? Car j'aime pas les nags screen !!Je trouve ça ennuyeux ;)Mais on doit y passer alors commençons dès maintenant !!Qu'est-ce qu'un Nag screen ?Un nag screen, c'est une fenêtre qui vient vous dire que vousn'êtes pas enregistré et qu'il faut payer vite fait pour qu'elle disparaisse :)Bref, c'est vraiment ennuyant, on peut tomber sur un NAG avec un boutondésactivé qui se réactive après qq secondes par exemple !!Bref casse-couilles à souhait ;)

Avant de commencer avec les trucs un peu plus compliqués avec Soft-ice et tout,on va commencer par Simple !!

Cracker un nag screen avec seulement un éditeur hexadécimal.

Quoi ? Vous vous demandez quelle connerie je suis en train de raconter lol !!L'exemple que vais vous montrer est comment cracker le NAG screen de WinRAR 2.6quand la limite dans le temps à expirée !!Vous pourrez essayer cette technique sur ICQ99 afin de kicker les 8 secs au démarrage!!

Bref assez bavardé !! Let's start :

********************************** Cracker le nag de WinRAR 2.6b **********************************

Tu lances WinRAR, après avoir mis la date en avance, style : 2002.Là tu vois un nag screen avec 5 boutons de merdes !!Il y en a 1, avec Close...Tu clicks dessus et WinRAR marche normalement. Donc, on va émuler la pression sur ce bouton.

Piner Le nag :)~~~~~~~~~~~~~~

Donc, voici une méthode qui marche souvent, pour émuler la pression d'unbouton... Vous avez juste besoin d'un éditeur hexadécimal (moi j'utilise hex workshop).Donc, vous lancez WinRAR encore et regardez le caption du bouton : Closepuis ouvrez WinRAR avec un éditeur hexa et recherchez en hexa: 43006C006F007300650043006C006F0073006500 =

Page 36: Cours De Cracking

C l o s e

donc vous recherchez la valeur hexa de chaque Caractères, plus 00 entre chaque valeur.Vous devez arrivez ici :

4600 0E00 0100 FFFF 8000 4300 6C00 6F00 F.........C.l.o. <== C l o s e ici !!! heh7300 6500 0000 0000 0000 0150 0000 0000 s.e........P....9500 4300 4600 0E00 0900 FFFF 8000 2600 ..C.F.........&.4800 6500 6C00 7000 0000 0000 0700 0050 H.e.l.p........P0000 0000 0400 0400 8B00 4D00 FFFF FFFF ..........M.....8000 0000 0000 0000 0000 0250 0000 0000 ...........P....0900 1000 8200 3700 FFFF FFFF 8200 5000 ......7.......P.6C00 6500 6100 7300 6500 2000 6E00 6F00 l.e.a.s.e. .n.o.

Donc, voilà vous êtes à la bonne place, now pour émuler, vous avez juste à regardez leFFFF82 ou FFFFFFFF82 le plus proche et changer le 82 en 7E !!!

donc :

4600 0E00 0100 FFFF 8000 4300 6C00 6F00 F.........C.l.o. 7300 6500 0000 0000 0000 0150 0000 0000 s.e........P....9500 4300 4600 0E00 0900 FFFF 8000 2600 ..C.F.........&.4800 6500 6C00 7000 0000 0000 0700 0050 H.e.l.p........P0000 0000 0400 0400 8B00 4D00 FFFF FFFF ..........M.....8000 0000 0000 0000 0000 0250 0000 0000 ...........P....0900 1000 8200 3700 FFFF FFFF 8200 5000 ......7.......P. <== ici tu vois FFFFFFFF82 !!!6C00 6500 6100 7300 6500 2000 6E00 6F00 l.e.a.s.e. .n.o.

COOL !! Là tu es à la bonne place, donc tu remplaces le 82 par un 7Eet hop le nag a mouru ;)Donc :

0900 1000 8200 3700 FFFF FFFF 8200 5000 ......7.......P.

devient :

0900 1000 8200 3700 FFFF FFFF 7E00 5000 ......7.....~.P.

Tu saves ton fichier WinRAR, le relance et plus de nag du tout :)Si tu remets la date en arrière, toujours pas de nag, donc Voilà c'est terminé.Conseil: Ils auraient dû fermer le prog une fois le temps dépassé! Ca aurait forcé lecracker à jouer un peu plus et cracker le time limite !Pour le reste des protections, c'est tres simple ! Avec ce que vous avez dû lireavant d'arriver ici, vous ne devriez pas avoir de problèmes !

Page 37: Cours De Cracking

On va passer à un autre type de Nag Screen !! Les messagebox.C'est très chiant, mais quand on voit ça !! On est quand même content car ça se vireen 10 secondes ;)

Les messageboxes se reconnaissent grâce à leurs icônes déjà !Les icônes que l'on voit dans Windows avec comme signe: le point d'exclamation,la croix blanche sur rond rouge.... et un message l'accompagnant !!

Comment cracker ça ? Bien je vais montrer 2 façons!!

- Avec W32Dasm (cracker like a wanker):

Vous lancez votre programme et vous voyez le message qui nous dit:

"Version Shareware! please Register" ou un truc chiant du style !!Pour virer ça, vous ouvrez W32Dasm et désassemblez le fichier du programme!Vous faites un tour dans les String Data References à la recherche de cette phrase!Vous allez la trouver avec 98 % de chances !!Donc vous double-cliquez sur cette phrase et recherchez au dessus d'un saut conditionnelqui vous fait atterrir sur le nag ou au contraire le sauter !!ET vous le nopez ou forcez a sauter en fonction de ce que vous trouvez !!

ex:

JE 00406280.................

Possible String Data Reference BLABLA to: Please Register Now !...

XXXX:00406280 PUSH 00XXXX:00406282 PUSH 004062E0 ;"Register!"XXXX:00406287 PUSH 00406360 ;"Please Register Now!!.."XXXX:0040628C PUSH 00 XXXX:0040628E CALL [USER32!MessageBoxA]

....................

Ici, si ce "je" nous amène à tout les coups sur le message d'erreur, on le NOPet il ne sautera plus jamais !Ceci est un exemple mais ça ressemble à ça en gros.C'est pas très clean, et ça fait branleur mais bon :)Plus ça va vite et plus vous êtes content je présume ....

- Avec Soft-ice:

Avec Soft-ice on va tout simplement poser un BPX sur MessageBoxA!Donc Ctrl+D et tapez votre BPX!Lancez le programme et Soft-ice break! Pressez F12 et vous retournez sousWindows !! Là vous clickez sur le bouton OK du nag et vous vous retrouvez sousSoft-ice encore une fois !!

Page 38: Cours De Cracking

Juste au dessus de votre emplacement actuel vous devez voir le Call qui appellele messageBox !! On peut cracker comme un bourin en nopant ce call, mais ça fait pas très pro,le mieux c'est de foutre un RET juste après être entré dans le CALL..

Petit exemple théorique:

XXXX:00406280 PUSH 00 XXXX:00406282 PUSH 004062E0 ;"Register!"XXXX:00406287 PUSH 00406360 ;"Please Register Now!!.."XXXX:0040628C PUSH 00XXXX:0040628E CALL [USER32!MessageBoxA] <--- ici on fait F8

Après avoir fait le F8 on voit un truc comme ça :

025F:00401510 FF253C324000 JMP [USER32!MessageBoxA] <-- le F8 nous mène ici025F:00401516 FF2540324000 JMP [USER32!MoveWindow]025F:0040151C FF2544324000 JMP [USER32!DialogBoxParamA]........................

Après avoir fait le F8, on est donc sur un JMP qui va appeler le MessageboxA .Donc sur cette ligne vous faites:

A {enter}RET {Enter}{echap}

Le programme arrive et prends le RET et sort de cette routine en 2 temps 3 mouvements!et hop il continue sa route sans jamais afficher aucune connerie !Ensuite vous faites la modif dans l'exécutable lui-même et on en parle plus :]

Je vais expliquer Rapidement une méthode qui utilise un BPX qui est très rarementutilisé pour cracker les Nags, mais plutôt dans les names / serials !Mais c'est un plaisir de l'utiliser dans les programmes écrits en Delphi par exemple !Le BPX est : hmemcpy

Méthode théorique:

Vous mettez ce BPX et vous lancez le programme en Delphi à cracker!Soft-ice break! Vous pressez F5 le nombre de fois qu'il faut pour obtenir le NAG screenet vous comptez le nombre de F5 qu'il vous a fallut bien sûr!!On va dire: 14 fois F5 pour voir le nag !!Alors on relance le programme et on fera F5 le nombre de fois que vous avez trouvémoins 1 !! (14 - 1 = 13 ici)On presse 13 fois F5 ici !! Ensuite on presse F12 pour revenir dans l'exécutableet quitter ces dlls à la con :=)

Page 39: Cours De Cracking

Après avoir fait ça, vous tracez comme un dingue avec F10 et vous allez arriver sur une sériede CALL , MOV , CALL , MOV ....Ca se voit tout de suite, il y a quasiment que ça !!Et là vous mettez un BPX à l'emplacement où cette routine commence et vous tracez avecF10! Le NAG screen va apparaître en passant sur un call normalement !! Vous repérezquel CALL c'est et puis vous lui mettez un bpx une fois avoir désactivé tout les autres!Vous breakez dessus! Première façon bourin: on nope le call comme un goret ;)On a de la chance ça marche !! KeWl !!Alors on peut entrer dans le Call avec F8 et mettre un ret sur le Push ebp qui doits'y trouver!! (c'est pas tjs un Push ebp ;p)On presse F5 et si le nag est parti et que ça ne crash pas, c'était le bon endroit !!Si tout ça a amené à un méchant crash :-/ , il vous faut après avoir entré ce callchercher un autre call qui affiche le nag à l'intérieur !!et le noper !!Si le nag est avec timer, on doit trouver un CALL GETTICKCOUNT pas loin de celui-cinon plus !! Cette API est souvent utilisée pour ça ;)

On peut aussi utiliser L'API: Destroywindow qui nous amène dans Soft-ice après avoirtué le nag ! Là on presse F12 et on regarde les calls plus haut et on retrouvesouvent les calls et les movs de tout à l'heure qui sont si charmants, lol.Bref, cette technique, je ne l'ai jamais vu dans aucun cours en français ou bienUS, mais elle permet de cracker un nag Delphi en 2 mins sans se faire chier à tracercomme un dingue jusqu'à trouver LE CALL !!

Sinon, voici une liste d'API utilisées dans le cracking des nags screen:

pour tout ce qui est messagebox:

MessageBoxMessageBoxAMessageBoxExAMessageBeep

ou encore ceci pour afficher du texte!

SENDMESSAGEWSPRINTF

et pour les générations de fenêtre:

createwindowcreatewindowexashowwindow

Page 40: Cours De Cracking

Voilà, je pense que vous avez déjà de quoi cracker pas mal de nags screen à la con!La plus part du temps c'est : Posez le BPX, tracez, trouvez le CALL, killez le !et on ne reparle plus du NAG !!

Keyfile

Qu'est ce qu'un keyfile ?C'est un fichier licence que l'on place dans le répertoire courant du programmepour l'enregistrer !On a donc rien à entrer comme un name / serial!On n'utilise pas les mêmes API mais surtout l'API CreateFileA.Je vais montrer un exemple:

******************************** * termial Cilla's CrackMe 1.0 *********************************

Je vous préviens de suite, ce crackme contient une protection par Key file, quiest très simple, mais que je considère bien pour le sujet d'un cours général !Je ne vais pas vous faire un cours sur un keyfile qui est trop long et qui va vousperturber !!

Le crackme a besoin d'un fichier keyfile, ici il s'appelle TC1.key .

Je crée un fichier keyfile à la con contentant le texte: "ACiD BuRN 4 EVER Ph34rs "

Si on édite en hexa on obtient ceci:

00000000: 41 43 69 44 20 42 75 52 4E 20 34 20 45 56 45 52 00000010: 52 20 50 68 33 34 72 73 20 20 20 20 20 20 20 20

Lancez le crackme et on voit qu'il y a un bouton pour checker le keyfile !!Un open box apparaît si vous clickez dessus et vous dit de choisir un fichier, ok on va lefaire l'ami :)Tout d'abord mettez un BPX sur createfilea et quittez Soft-ice avec F5 !Ensuite il vous suffit de choisir le fichier et Soft-ice revient de plus belle !Pressez F11 et vous devriez voir le code suivant:

:0040461F CALL KERNEL32!CreateFileA :00404624 CMP EAX,-01 ; Est-ce que le fichier existe ? :00404627 JZ 00404652 ; si il n'existe pas ça saute :00404629 MOV [EBX],EAX :0040462B POP EDI :0040462C POP ESI :0040462D POP EBX :0040462E RET ; tout est ok! on sort d'ici!

Page 41: Cours De Cracking

On a notre fichier, donc le test est ok ! On continue à tracer avec F10 on passe le RETet on trouver un code du genre:

:00429D93 CALL 00402618 :00429D98 JMP 00429DB4 :00429D9A LEA EDX,[EBP-01] :00429D9D LEA EAX,[EBP-0150] :00429DA3 CALL 004044E8 :00429DA8 CALL 00402618 :00429DAD XOR EAX,EAX ; EAX = 0 :00429DAF MOV AL,[EBP-01] ; Prends le caractère du keyfile (dans ebp-1) :00429DB2 ADD EBX,EAX ; additionne la valeur à EBX :00429DB4 LEA EAX,[EBP-0150] :00429DBA CALL 00404494 :00429DBF CALL 00402618 :00429DC4 TEST AL,AL ; On a fait toutes les lettes ? :00429DC6 JZ 00429D9A ; non ? alors on saute sinon on continue :00429DC8 LEA EAX,[EBP-0150] :00429DCE CALL 00404458 :00429DD3 CALL 00402618 :00429DD8 CMP EBX,000020A9 ; La somme des caractères = 20A9h ? :00429DDE JNZ 00429DEE ; Si c'est égal alors le keyfile est valide

La somme de mon fichier fait: 794hCe n'est pas égal à 20A9h donc le keyfile n'est pas valide!!On va rectifier ça !! 20A9h - 794h = 1915hIl nous faut donc ajouter 1915h à notre keyfile! On va ajouter des FFh (255)

Je n'ai plus le keyfile sous la main, mais je pense que vous avez compris comment ça marche !Alors je vous laisse vous amuser !!

Sinon, le keyfile le plus petit possible est :

00000000: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000010: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000020: C9

Il n'y a aucun texte dans cette keyfile, on retrouve juste la somme nécessaire: 20A9hAlors amusez vous à faire votre propre keyfile et si vous n'avez pas compris commentfaire, essayez de compléter mon keyfile :)

Voilà, la partie keyfile fut brève !

Page 42: Cours De Cracking

Il existe un crackme un peu plus compliqué mais très intéressant à essayer:Cruehead Crackme 3 ! Il est toujours simple, mais plus fin à cracker ;)Vous devez l'essayer, et pourquoi par faire un keymaker !Il existe d'autres crackme utilisant les keyfiles! Alors vous pouvez vous entraînersi vous avez du mal!Note: N'essayer pas de cracker CuteFTP juste après avoir lu ce cours, si vous n'avez jamais cracké de keyfiles de votre vie! C'est un conseil ....

CD Check (les BPX, et techniques diverses...)

Alors là, c'est la partie cracking jeux!!Qu'est qu'un CD check ? Un CD check est la détection du CD dans le lecteur pour éviter aux petitspirates en herbes de copier les jeux sur leur disque durs pour y jouersans CD :)lol!! Il y a bcp de jeux protégés par CD check mais bon, les 3/4 on se pissede rire!!La protection actuelle qui calme les "petits" crackers est CDilla,cette protection est en effet d'un niveau élevé par rapport aux protectionsque l'on trouve dans: Quake 2, Formula 1, King Pin et bcp d'autres !!Mais, je vais vous montrer comment cracker les 2 avant-dernières protectionsde CDilla !! N'ayant aucun jeux originaux (hehe, no way ) je n'ai pas putester la toute dernière version encore, qui est soi-disant plus dure;)Je vais aussi vous parler des protections commerciales !Mais je ne vous décrirais que CD Lock et CDilla ! Il existe de nombreux courssur securom, et autres protections CD commerciales !J'écris pas un roman lol

Alors nous allons commencer par les protections TRES TRES simples !!

Les CD check de bases:

*** Avec W32Dasm: *****

Comme exemple on va prendre Formula 1:Il contrôle si il y a le CD du jeu et si ce n'est pas le cas il refuse de se lancer.Après avoir installé le jeu on le lance (après avoir retiré le CD !!!)Et un message apparaît "Formula 1 CD NOT Found". Il n'en faut pas pluspour le cracker.Prenez W32Dasm et désassemblez le fichier exécutable, en l'occurrenceF1win.exe.Cherchez dans String Data References (Menu "Refs") de W32Dasm et recherchezla phrase. On trouve ça quelques lignes avant le message d'erreur :

00409AC3 FF5234 call [edx+34]00409AC6 85C0 test eax, eax00409AC8 7D50 jge 00409B1A

Là il y a un test qui ne nous envoie pas au jeu si il ne trouve pas le CD,

Page 43: Cours De Cracking

donc on place des NOP et il n'y a plus aucun Test et le jeu se lancequoi qu'il arrive. Cela donne :

00409AC3 FF5234 call [edx+34]00409AC6 90 nop00409AC7 90 nop00409AC8 7D50 jge 00409B1A

Donc pour le cracker il faut rechercher avec un éditeur hexadécimalla chaîne FF 52 34 85 C0 7D 50 et la remplacer par FF 52 34 90 90 7D 50c'est tout.

2ème exemple : Quake 2 v3.14

Après avoir installé le jeu ou après avoir mis le patch 3.14,quand on lance Quake 2 sans le CD dans le lecteur, il marche jusqu'aumenu puis lorsqu'on lance une nouvelle partie boum! Le message"You must have the Quake 2 CD in ..."

On désassembles le fichier avec W32Dasm puis on cherche dans String Data References le message "You must have the Quake 2 CD in ..." Bcp de jeux utilisent cette connerie de message !! (ils sont rares de nos jourscependant!)

Vous marquez "Please insert the XXX CD" (vous cherchez cette phrase dans String Data References.)Après avoir trouvé cette phrase dans String Data References, clicker 2fois dessus, cela vous amènera au désassembler à la ligne du message.Remontez un peu avec la barre de défilement, vous trouverez juste audessus:

E82BFFFFFF call 0042F520803800 cmp byte ptr [eax], 00750F jne 0042F609

Là on voit un petit "750F" qui représente le "Jne" (celui dont je vousparlais au début), il représente un saut si ce n'est pas égal. Donc siil n'y a pas le CD dans le lecteur, ce n'est pas "égal au CD" donc leprogramme saute au message d'erreur et le jeu ne marche pas!On va noper ce con de saut !!

Le code devient:

E82BFFFFFF call 0042F520803800 cmp byte ptr [eax], 0090 nop90 nop

Et c'est partie !! Les CD checks de ce type!!: That's bullshits !

Donc pour cracker définitivement le jeu on cherche la chaîneHexadécimale suivante avec un éditeur Hexa du style HexWorkshop, Hedit. La chaîne : FF FF 80 38 00 75 0F et la remplacer par FF FF 80 38 0090 90.Fermez W32Dasm et lancez Quake 2. Bingo le jeu marche c'est cool!

Page 44: Cours De Cracking

Vous allez me dire !! Ca marche que sur les vieux jeux ça ;PPAlors comme autre Exemple: KingPin version Fr

****************** KingPin ******************

Cracking part:

Qd vous lancez le jeu avec un CD gravé, on voit les super (lol) messages:You must have the KingPin CD in the drive to play...

Hahah, j'adore ce genre de conneries!Lancez W32Dasm et désassemblez le jeu!

Allez dans les References et cherchez la phrase du jeux!Double click dessus et on ne voit rien de super! donc on re-double click dessus !Et cette fois-ci!! On trouve qq chose de bien :

* Referenced by a CALL at Address:|:0043D5F1 <== hoho :))|:00442030 56 push esi:00442031 E84AFFFFFF call 00441F80:00442036 8BF0 mov esi, eax:00442038 85F6 test esi, esi:0044203A 750E jne 0044204A

* Possible StringData Ref from Data Obj ->"You must have the KINGPIN CD in " ->"the drive to play." |:0044203C 68C8414500 push 004541C8 <== on arrive ici:00442041 50 push eax:00442042 E859D7FDFF call 0041F7A0:00442047 83C408 add esp, 00000008

Donc, nous voyons le message d'erreur et un petit jne juste avant !!Mais bon, remplacez un je en Jne et autres, ça fait branleur !!!Réfléchissons un peu ;)

On a vu :

* Referenced by a CALL at Address:|:0043D5F1

Donc avec W32Dasm on va regarder ce call !!Allez dans le menu "Goto" et clickez sur "goto code location" et entrez : 43D5F1Maintenant on arrive ici:

Page 45: Cours De Cracking

:0043D5E5 A184274900 mov eax, dword ptr [00492784]:0043D5EA 83C40C add esp, 0000000C:0043D5ED 85C0 test eax, eax:0043D5EF 7505 jne 0043D5F6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:|:0043D5D2(U)|:0043D5F1 E83A4A0000 call 00442030 <== get the fuck outta here!

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:|:0043D51F(U), :0043D532(C), :0043D55A(U), :0043D5BA(C), :0043D5D0(C)|:0043D5EF(C)

Hehehe, voilà !! C'est ce call de merde qui appelle la routine de CD check !On va le noper et il nous tanera plus !! Promis.

Clickez sur ce call, en bas de la fenêtre de W32Dasm, vous devez voir offset : 3D5F1Lancez votre éditeur hexa et allez à cet offset !On remplace E83A4A0000 par 9090909090.

Enregistrez le fichier et lancez le ;)

Choisissez new game, et WOW !! Le jeu marche *grin* !Piece of cake !!On vient de cracker King Pin ! Un jeux super récent mais avec une protection de merde :) (tant mieux hehe, vous allez voir CDilla, c'est autre choses)Voilà, c'est fini pour les CD checks de bases avec W32Dasm !

**** CD check avec Soft-ice *****

Voici un exemple Très simple de CD check !Mais cette fois-ci on utilise Soft-ice (my love)

Le but du crackme et de faire afficher le message de bon CD qd on a pas unseul CD dans le lecteur :)

On le lance sans CD, on click sur le bouton et une messagebox de merdearrive !! mouahahLes BPX les plus utilisés dans le CD checks sont: GETDRIVETYPEA et GETVOLUMEINFORMATIONA !!

Mettez un bpx sur GETDRIVETYPEA et clickez sur le bouton! Pressez F12 tant que l'onest pas à la bonne place !!

Vous devriez voir qq chose comme ça:

025F:00401032 83F805 CMP EAX,05 <--- c'est un CD ?025F:00401035 75DC JNZ 00401013025F:00401037 6A00 PUSH 00025F:00401039 6A00 PUSH 00

Page 46: Cours De Cracking

025F:0040103B 6A00 PUSH 00025F:0040103D 6A00 PUSH 00025F:0040103F 6A00 PUSH 00025F:00401041 6A20 PUSH 20025F:00401043 68F7214000 PUSH 004021F7025F:00401048 685A224000 PUSH 0040225A025F:0040104D E85E000000 CALL KERNEL32!GetVolumeInformationA025F:00401052 0BC0 OR EAX,EAX025F:00401054 74BD JZ 00401013 <-- JMP BAD CRACKER025F:00401056 6A00 PUSH 00025F:00401058 685F224000 PUSH 0040225F025F:0040105D 6A00 PUSH 00025F:0040105F 6A00 PUSH 00025F:00401061 685A224000 PUSH 0040225A

Ok, c'est trop simple, il compare la valeur d'EAX avec 5!Hmm pourquoi 5 ?Voici un petit tableau des différents type de lecteurs et leurs références:

La valeur dans EAX veux dire:

0 Lecteur indéterminé 1 Répertoire sur la racine n'existe pas 2 Disque removable 3 Disque dur 4 Remote Drive(Network) 5 CD ROM 6 RamDisk

Donc le crackme ici compare EAX avec 5 ! Donc il veut un CD ROM arffsinon il saute!!

025F:00401032 83F805 CMP EAX,05 025F:00401035 75DC JNZ 00401013 <-- on NOP ça

On nop ça ! Et plus jamais de problèmes avec ça hehehe !!On ouvre le crackme avec un éditeur hexa, on cherche 83F80575DC et on remplace par83F8059090.Après ce contrôle de type de disque, on voit un "CALL KERNEL32!GetVolumeInformationA"Hehe, une API souvent utilisée par les CD checks!

Ca ressemblais à ça:

025F:0040104D E85E000000 CALL KERNEL32!GetVolumeInformationA025F:00401052 0BC0 OR EAX,EAX025F:00401054 74BD JZ 00401013 <-- Jump to bad boy

Encore une fois ! On NOP le saut conditionnel et le CD is no more :)Ben voilà, c'est fini, je ne vais pas faire un roman non plus sur les CD checks ehehe

********************************************

Page 47: Cours De Cracking

** CD CHECKS: PROTECTIONS COMMERCIALES: **** **** CD LOCK: TOMB RAIDER 3 FR **********************************************

Vous êtes sûrement beaucoup à vouloir Tomb Raider III mais ce jeu est protégécontre la copie ! Enfin, en théorie !!!!Tout d'abord nous allons voir la protection. Un CD Vierge ne peut contenir que 650 Mode données et le CD original de Tomb Raider III contient 3 Go de données ?!Oui en fait il y a 4 fichiers qui font 600 Mo chacun : Awcs.afp ; Neir.afp ; Oket.afp etVfaw.afp . Pour Pouvoir le graver il faut d'abord copier tous les fichiers du CD sur le disque dur, sauf les 4 cités plus haut. Ensuite créer 4 fichiers avec le même nom avec uncaractère dedans pour que le fichier fasse 1 octet. Maintenant on grave le CD sans problèmemais le jeu ne marchera pas car il est encore protégé !!! Et c'est là qu'intervient lecracking!

Nous sommes en présence d'un CD Check (contrôle du CD) et le jeu nous affiche le message" Tomb Raider III CD ?" malgré la présence du CD Gravé.Si vous avez lu le premier cours, vous vous dites comme moi, on va le désassembler et cherchercette phrase dans String Data References. Le problème c'est que l'on ne trouve pas cette phrase,donc il suffit de réfléchir un tout petit peu.Il y a 4 fichiers qui ne servent à rien donc on va chercher le nom de l'un d'eux dansles String Data References. On voit d:\Awcs.afp , d:\Neir.afp , d:\Oket.afp et d:\Vfaw.afp.

Donc on double-click dessus et on retourne dans W32Dasm, juste au code source de cette référence,on remonte avec les barres de défilement et on trouve:

test edi, edijne 0048D2CE

* Possible string data reference from Obj ->"rb"

Push 004C7AD4

* Possible string data reference from Obj ->"d:\AWCS.AFP".......

Le Jne (Jump if not equal) fait le saut s'il ne trouve pas le fichier de 600 Mo donc on lechange en je (jump if equal) et le programme ne saute que si il trouve le fichier. Il peuttoujours chercher !!! Donc maintenant on ouvre le fichier Tomb3.exe avec un éditeur hexadécimal,on cherche la chaîne 85FF756568D4 et on la remplace par 85FF746568D4 .

Page 48: Cours De Cracking

Et on enregistre le fichier. Le jne 0048D2CE est devenu Je 0048D2CE.Maintenant on refait la même chose avec les autres fichiers.(d:\Neir.afp , d:\Oket.afp etd:\Vfaw.afp)Les 2 premiers seront casi-identiques mais on ne trouvera pas la même chose au fichier "D:\Vfaw.afp"C'est normal il n'y a rien à changer. Donc vous avez changé :

- pour "Neir.afp":0F85F9000000 par 0F84F9000000 ===> le 85 (jne) devient 84 (je)- pour "Oket.afp":0F85AD000000 par 0F84AD000000 ===> le 85 (jne) devient 84 (je)- rien pour "Vfaw.afp"

Normalement, vous avez tout changé avec l'éditeur Hexadécimal et Sauvegardez. Une fois cecifait vous pouvez lancer le jeu avec un CD gravé dans le lecteur !!!

Tomb Raider III is Now Cracked !!!

Voilà!!La Protection CD lock est assez stupide en fait !!Même très simple à cracker ! Vous la retrouverez dans Commandos par exemple aussi :)Pour le cours qui suit sur CDilla, il serait préférable d'aller jeter un oeuilà la partie unpacking qui suit ce cours si vous ne connaissez rien en unpacking et autres dumping !! Mais si vous êtes déjà à l'aise avec le PE, et que vous vous prenezpour un 133t Cr4x0R hehe, lisez !! Mais ne pleurez pas si vous ne comprenez rien !!!Voilà, let's go

**************************************************************************** CDilla : Safe disc ****************************************************************************

MidTown Madness version Française: Une autre approche sur CDilla

Outils nécessaires: * CD Original de Midtown Madness * Soft-ice 3.23 * Soft-ice Tool pour patcher Soft-ice (pour dumper les sections) * HexWorkshop * Frogsice (pour cacher Soft-ice) * ProcDump (comme PE Editor) * Exescope

Introduction:

Salut à tous, je sais qu'il y a déjà un cours sur Midtown Madness par black checkmais la méthode que j'utilise n'est pas la même que lui...

Page 49: Cours De Cracking

Je vais expliquer le plus de choses possible et en plus c'est le 1er cours surCDilla en français !!!Il serait préférable de lire le cours de black check avant, et d'avoir quelquesconnaissances sur le format PE...

A Mort CDilla:

Après avoir installé le jeu, éditez le PE du fichier ".icd" avec ProcDump.(lancez ProcDump, clickez sur PE Editor, allez où se trouve votre fichier ".icd")Le fichier est : Midtown.icd

Maintenant, vous devez voir ceci:

- Entry Point : 00166C10 - Image Base : 00400000

Ok, nous allons avoir besoin de l'OEP (Original Entry Point) plus tard doncnous allons le calculer dès maintenant.Pour cela on a besoin de l'Image base et de l'Entry point que l'on obtient avec ProcDump : 00400000 + 00166C10 = 566C10 (on les additionnes)

Maintenant, clicker sur le bouton "sections" pour voir toutes les sections du fichier.

On ne va avoir besoin que des valeurs Virtual Offset, Raw Size, et Raw Offset !

- pour la section ".text" :

Virtual Offset: 00001000 Raw Size: 18D78F Raw Offset: 600

- pour la section ".Rdata" :

Virtual Offset: 0018F000 Raw Size: 14C99 Raw Offset: 18DE00

- pour la section ".data" :

Virtual Offset: 001A4000 Raw Size: 3D8A4 Raw Offset: 1A2C00

Page 50: Cours De Cracking

- pour la section ".data1" :

Virtual Offset: 00314000 Raw Size: 20 Raw Offset: 1E0600

- pour la section ".rsrc" :

Virtual Offset: 00315000 Raw Size: CB3 Raw Offset: 1E0800

Nous allons donc dumper toutes les sections du fichier ".icd" excepté la section ".Rdata" car, c'est plus compliqué pour celle-ci !!

Il faut tout d'abord additionner l'Image base avec le Virtual Offset de toutes les sections:

.text : 400000 + 00001000 = 00401000

.rdata : 400000 + 0018F000 = 0058F000

.data : 400000 + 001A4000 = 005A4000

.data1 : 400000 + 00314000 = 00714000

.rsrc : 400000 + 00315000 = 00715000

Ok, maintenant nous allons dumper les sections...Pour cela, mettez un breakpoint sur EOP (566C10 pour ce jeu).Vous avez sûrement remarqué, que si vous lancez le jeu avec Soft-ice chargé,il vous envois chier, car il y a de l'anti Soft-ice.CDilla utilise meltice (createfilea) et l'int68h pour détecter Soft-ice.Le mieux, c'est d'utiliser Frogsice, pour le cacher. J'utilise la version 0.20b, maisil faut la patcher pour qu'elle cache complètement Soft-ice de la détection par int68h.Dans le cours de black check on voit qui faut rechercher dans le fichier: FrogSice.vxd

-60 80 7d 1d 43et le remplacer par :-C3 80 7d 1d 43

Voilà, maintenant, plus aucun problème avec la détection de Soft-ice, on va pouvoirs'occuper des choses sérieuses !!Lancez votre Frogsice (version patchée) et lancez le jeu.Pendant la vidéo, faites apparaître Soft-ice (ctrl+D) et mettez votre bpx sur l'OEP:Bpx 56CC10 pour ce jeu...

Pressez F5, le jeu continue de se lancer, et quittez-le.Maintenant relancez-le et Soft-ice breaks sur 56CC10. Si Soft-ice ne break pas, regardezsi vous avez bien mis votre bpx au bon endroit! (tapez bl et vous devez obtenir qq chose

Page 51: Cours De Cracking

comme ça #025F:56CC10)

Donc, Soft-ice break sur l'OEP, vous n'avez plus qu'à dumper les sections :)

Avant le dump, désactivez tous les bpx (bd *) car on veut pas de merdes dans nos sectionsdumpées ehe !!

Grâce à Sice Tool, vous avez modifié la commande pagein qui vous permettra de dumper... La commande pagein fonctionne donc comme ceci pour dumper:

pagein "l'adresse du début du dump" "longueur du dump" "nom du fichier"Donc dans Soft-ice, tapez:

pagein 401000 18D78F c:\text.binpagein 5A4000 3D8A4 c:\data.binpagein 714000 20 c:\data1.binpagein 715000 CB3 c:\rsrc.bin

Voilà, nous avons donc nos sections sur le disque dur !!!!

Passons aux choses sérieuses !!! : La Section Rdata :

Bon, pour dumper cette section, c'est pas aussi simple =)

Tout d'abord, nous devons trouver l'adresse réelle de la fonction de décryptage et pourcela nous allons tracer dans le call qui appelle dans la section rdata...Après que Soft-ice ai stoppé sur l'OEP, on arrive ici :

00566C10 PUSH EBP <-- on stoppe ici sur l'entry point00566C11 MOV EBP,ESP00566C13 PUSH FF00566C15 PUSH 005968D000566C1A PUSH 0056672400566C1F MOV EAX,FS:[00000000]00566C25 PUSH EAX00566C26 MOV FS:[00000000],ESP00566C2D ADD ESP, -5C00566C30 PUSH EBX00566C31 PUSH ESI00566C32 PUSH EDI00566C33 MOV [EBP-18],ESP00566C36 CALL [0058F14C] <-- voici notre call, on trace dedans (F8)

Dans le call , on arrive ici :

009A6485 pushad009A6486 push 00000031

Page 52: Cours De Cracking

009A6488 push 00000000 ---> 0 désigne les imports kernels, pour les users ça sera 1009A6490 call [9A64A6] ---> l'adresse réelle de la fonction (9A64A6)009A6496 add esp, 8009A6499 popad....... jmp [XXXXXXXX]

Tracez dans le call et vous allez voir que le jmp [XXXXXXXX] devient jmp [KERNEL32!GetVersion]Ok, c'est normal, on est sur le bon chemin :o)Nous allons bientôt programmer le Call fixer...Mais avant tout, nous devons connaître le nombre d'import de Kernels et users qu'il y a dansle jeu que l'on crack.Pour cela, plusieurs méthodes, on peut désassembler le fichier ".icd" avec W32Dasmet les compter ou bien tracer avec Soft-ice, mais j'ai utilisé un programme nommé : EXESCOPEpour savoir le nombre d'imports...Donc dans le fichier midtown.icd , j'ai :

- 127 imports pour kernel32- 42 import pour user32

Ok, nous avons besoin des ses valeurs en hexadécimal, car dans Soft-ice on n'utilise pas de décimal:

127 = 7Fh 42 = 2Ah

Ma partie préférée qd on crack CDilla: Programmer le call fixer.Nous n'avons pas l'accès en écriture dans la section Rdata, donc nous allons la déplacerdans la section rdata...Pour coder le call fixer, je commence sur l'entry point, donc il faut réactiver le bpxsur l'OEP, et relancer le jeu. Attendez que le jeu stoppe dans Soft-ice.

Maintenant on va déplacer notre rdata section à la place de la data section en mémoire.Pour faire ça, taper :

m "le virtual offset de la section RDATA + l'image base" l "la longueur de RDATA" "le virtual offset de la section DATA"

NOTE: Pour le virtual offset de la section data, utiliser un nombre plus grand, c'est mieux...

5A4000 est notre virtual offset, j'ai utilisé 5B0000 (Plus grand comme je vous ai dit)

Vous avez donc à taper:

m 58F000 l 14C99 5B0000

Maintenant, nous allons programmer le call fixer !!

Page 53: Cours De Cracking

Vous êtes donc à la ligne: 566C10 PUSH EBP

Ce que nous allons taper va ressembler à cela:

00 pushad01 push ebx02 push 004 call [XXXXXXXX]0A add esp,80D mov edx, XXXXXX 12 cmp eax,[edx] 14 je 2016 inc edx17 cmp edx, XXXXXX + XXXXX1D jne 121F int 03 20 mov [edx],ecx22 popad23 inc ebx24 cmp ebx, XX 2A jne 002C int 03

C'est partis !!!

Tapez dans Soft-ice: A "et la touche entrée"

et programmez :

566C10 pushad566C11 push ebx566C12 push 0566C14 call [009A64A6] <-- adresse de la fonction trouvé en traçant dans le call566C1A add esp,8566C1D mov edx, 5B0000 <-- adresse où nous avons copié notre section .rdata 566C22 cmp eax,[edx] 566C24 je 566C40566C26 inc edx566C27 cmp edx, 5B0000 + 14C99 <-- adresse où nous avons copié notre section .rdata + rdata size 566C3D jne 566C22566C3F int 03 <-- par sécurité, si il ne trouve rien, il stoppe ici566C40 mov [edx],ecx 566C42 popad566C43 inc ebx566C44 cmp ebx, 7F <-- Nombre d'API à réparer566C4A jne 566C10566C4C int 03

Mettez ebx à 0 (R ebx 0) , et votre eip à la ligne 0 (ligne 0 = 566C10 ici, donc: R EIP 566C10)tapez "i3here on" et pressez F5 pour exécuter le code, normalement on devrait stopper sur 566C4C .Remettez votre ebx à 0, changez la ligne 02 (56CC12 ici) en "push 1" et changez la ligne 24 en

Page 54: Cours De Cracking

'cmp ebx, user_import_number' (2A for us) et remettez votre eip à la ligne 0 (R EIP 566C10). Exécuter ça encore (F5). Normalement tout est ok, et on doit encore avoir stoppé sur 566C4C .Nous pouvons maintenant dumper la section rdata sans crainte car tout est décrypté :o)

pagein 5B0000 14C99 c:\rdata.bin

Hehe !! Maintenant on va reconstruire un fichier exécutable qui va être le fichier final.J'ai essayé ProcDump pour importer les sections, mais cette merde n'a rien changé GRR !Donc, je l'ai fait à la main comme un grand ;)Voilà comment faire :

En premier faites une copie du fichier ".icd" (Midtown.icd) et renommez-le en ce que vous voulezmais avec l'extension ".exe" (ex: fuckit.exe)

Ok, lancez HexWorkshop, ouvrez "Damnit.exe", ainsi que le fichier de notre première sectiondumpé :

C'était: c:\text.bin

On va avoir besoin du Raw offset de chaque section, on les trouves au début du cours maisje vais vous les remettre pour une meilleure compréhension:

for the ".text" section : Raw Offset: 600 size : 18D78F for the ".Rdata" section : Raw Offset: 18DE00 size : 14C99 for the ".data" section : Raw Offset: 1A2C00 size : 3D8A4for the ".data1" section : Raw Offset: 1E0600 size : 20 for the ".rsrc" section : Raw Offset: 1E0800 size : CB3

Ok, you got all shits here !! We want to do the 1st section ".text" so :

Dans HexWorkshop, pressez alt+f5, entrez le Raw offset de la section que vous voulez importerici : 600 et cliquez sur ok. Allez dans le menu Edit, et cliquez sur "select block"Entrez la longueur (size) de la section, ici : 18D78F...Regardez le fichier ouvert (text.bin) et pressez 'ctrl+a' pour tout sélectionner..copiez tout ça avec 'ctrl+c'.Retournez dans la fenêtre principale de l'exécutable dans HexWorkshop (damnit.exe), et collerce que vous venez de copier dans le presse papier, faites: 'ctrl+v' ou menu Edit et paste.Enregistrez votre fichier, cool !! Voilà, c'est fini pour la section '.text', elle est maintenantdécryptée!!

Ok, je vais vous montrer l'import d'une autre section et vous ferez les autres de la même façon!

2ème section : Rdata!

Page 55: Cours De Cracking

Vous pouvez fermer la fenêtre 'text.bin', et ouvrez le fichier: 'rdata.bin' avec HexWorkshop.Retournez dans la fenêtre de l'exécutable et pressez 'alt+f5', entrez le Raw offset de lasection rdata: 18DE00.Cliquer sur le menu Edit, et cliquer sur "select block" entrez la longueur (size) de lasection, ici : 14C99

Regardez la fenêtre de rdata.bin , pressez 'ctrl+a' pour sélectionner tout et copiez les bytes avec 'ctrl+c'... Retournez dans la fenêtre de l'exécutable (damnit.exe) dans HexWorkshop et collez avec'ctrl+v' ou avec le menu Edit..

Ok, je pense que vous avez compris maintenant, faites de même avec toutes les sections et enregistrez les modifications dans l'exécutable.

Vous pouvez quitter Frogsice car l'anti Soft-ice n'est plus dans notre nouvel exécutable !!Virez le CD original de Midtown Madness et lancez 'damnit.exe'.

WOW, le jeu marche, se lance très rapidement et sans cette merde de fenêtre qui nous ditd'attendre durant la vérification du CD.Le jeux marche superbement bien :o)

Mais pour faire une exécutable parfait, il faut reconstruire le PE en utilisant ProcDumpafin qu'il marche avec tous les OS.

Si vous lancez le jeu sur une autre version de Windows ça va planter :(Allez, on va réparer ça !!

- Lancez ProcDump (Merci G-RoM :)allez dans les Options et sélectionnez:

[X]Recompute Object Size[X]Optmize PE Structure

[X] Use actual import infoset cliquer sur OK

Cliquez sur Rebuild PE, et cherchez notre nouveau fichier (Damnit.exe pour nous)

ProcDump nous fais une valide import table et notre exécutable est PARFAIT :o)du moins, j'espère hehe !!

Voilà, je pense que ça suffira pour les protections CD !!On va passer à autre choses now !! hehehe

Visual Basic

Page 56: Cours De Cracking

Bon je vais vous montrez une paire de tuts sur le VB!!Comment le keygener, patcher, trouver les serials !! TOUT !!!!

Pourquoi? Parce qu'il n'y a pas beaucoup de tutorial sur le keygening de programmes VB donc j'ai voulu en faire ...

Tout abord:

************************************************ Configurer Smart Check ************************************************

Qu'est-ce que Smart Check ?C'est un programme qui permet de débugger les programmes écrits en VBet il est très utile en cracking!!Mais il doit être configuré correctement sinon ça marche pas !

Pour configurer il suffit juste de cocher quelques cases et après c'est partipour l'éclate lol !! :)

Voici comment configurer Smart Check:

Dans le menu Program Settings:

- Error Detection: cocher toutes les cases excepté "Report errors immediately".

- Advanced: cocher les 4 premières cases. Mais surtout ne pas cocher "Suppress system API and OLE calls" is not "ticked"

- Reporting: sélectionner toutes les cases excepté "Report MouseMove events from OCX controls".

Ensuite dans le menu View, il faut que "argument" soit sélectionné ainsi que "suppressed error".

Voilà, maintenant vous allez pourvoir lire la suite du cours !Mais pour vous aider, je vais vous décrire quelques fonctions VB que vous rencontrerez souventen Visual Basic !

Fonctions importantes:

* __vbasrtcmp(String:"XXXX",String:"YYYY")returns DWORD:0

Description:

__vbastrcmp est utilisé pour comparer des "Strings" comme "XXXX" et "YYYY" Si vous rencontrez ça, et que XXXX = votre faux numéro de série, il y a de fortes chancespour que ce qui se trouve dans YYYY soit le bon serial !!

Page 57: Cours De Cracking

* Mid(VARIANT:String:"ACiD BuRN", long:1, VARIANT:Integet:1)

Description:

Prends la lettre dans les "ACiD BuRN" à l'emplacement 1 en partant de la gauche!donc ici il prends "A" dans "ACiD BuRN .

* Asc(String:"A") returns Integer:65

Description:

Prends la valeur ascii de la lettre en DECIMAL(la valeur ascii de "A" en decimal = 65)

* __vbaVarCat(VARIANT:String:"12", VARIANT:String:"34") returns DWORD:63F974

Description:

__vbaVarCat est utilisé pour ajouter des strings ensemble, ce qui nous donne ici: 1234(12 + 34 = 1234 c'est ajout des strings! pas une addition des valeurs)

* __vbaVarTstEq(VARIANT:XXXX, VARIANT:YYYY) returns DWORD:0

Description:

__vbaVarTstEq est utilisé pour comparer des strings aussi !!Regardez pour __vbastrcomp , le principe est le même !

Il existe aussi: __vbaVarCmpEq

* Len(String:"ACiD BuRN") returns LONG:9

Description:

La fonction len sert à récupérer la longueur d'un string! Ici "ACiD BuRN" a pour longueur 9(9 lettres, l'espace compte aussi)

Les opérations de bases très souvent utilisées (keygen) :

* __vbaVarAdd(VARIANT:Integer:10, VARIANT:Integer:15) returns .... (25)

Description:

Page 58: Cours De Cracking

Additionne 10 et 15, cela donne: 25

* __vbaVarDiv(VARIANT:Integer:100, VARIANT:Long:2) returns..... (50)

Description:

Divise 100 par 2, cela donne: 50

* __vbaVarMul(VARIANT:String:"100", VARIANT:String:"2") returns ... (200)

Description:

Multiplie 100 par 2, cela donne: 200

* __vbaVarSub(VARIANT:String:"100", VARIANT:String:"2") returns ... (98)

Description:

Soustrait 2 à 100, cela donne: 98

* __vbaVarXor

Description:

Il marche sur le même principe.. il effectue un XOR entre les valeurs

* MsgBox(VARIANT:String:"She owns Me", Integer:0, VARIANT:String:"Love",VARIANT.....)

Description:

Sert à afficher une messagebox avec le message: "She owns Me" avec comme titre: "Love"L'API en VB pour les messages box n'est pas: MessageBoxA mais : rtcMsgBox

Méthode très utilisée pour trouver les serials:

Vous avez entré un numéro à la con, et le programme vous a envoyé chier avec un messagebox !Comment trouver le serial rapidement dans Beaucoup de cas ??!

Page 59: Cours De Cracking

Facile, il vous suffit d'aller à la ligne où on voit cette messageBox et de clicker dessus.Ensuite clicker sur: Show all events et là on voit BCP BCP plus d'informations qu'avant,on descends un peu et on trouve qq chose comme ça:

__vbasrtcmp(String:"112233",String:"Oui_mec_c'est_le_serial")returns DWORD:0

On voit très bien que le programme compare "112233" avec le bon serial!Vous prenez ce que vous trouvez à la place de "Oui_mec_c'est_le_serial"!exemple: "AC4VA4EV"

Relancez le programme et entrez ça comme serial : AC4VA4EVBoom Registered!!

Easy, isn't it ?

Pour des choses plus complexes, lisez la suite!

***************** VB PATCHING: *****************

EscapeRC v1.0.1

Description : une VB5 Time_Limit!

tools utilisés : - W32Dasm89 (version de base non patchée pour le VB) - hexeditor!

Comme vous pouvez le voir, j'utilise W32Dasm pour du VB !! et même pas Soft-iceou Smart Check !Comme c'est la version non patchée de W32Dasm, on aura aucunes String Data References!! VB oblige :pMais bon!! on a les imports ;) et on va s'en servir hehe!

Donc, lancez le programme après avoir avancé la date du PC en 2001 par exemple..Boom, on voit une messagebox qui nous dit: Trial period is over, blablabla

Ok, mais les progs en VB n'utilisent pas l'API : messageboxa.Mais qqchose de similaire: rtcmsgbox

Donc en VB, pour les messagebox, on utilise : Bpx rtcmsgbox (pour vb6 : bpx msvbvm60!rtcmsgbox)On peut très bien utiliser Soft-ice, mais on veux aussi innover un peu !! et se servirde W32Dasm ;)

Lancez W32Dasm, et ouvrez le fichier avec ! (EscapeRC.exe)...Allez dans les imports et cherchez : rtcmsgboxClickez 2 fois car la première ne contient rien de bien important :)Vous verrez ceci:

Page 60: Cours De Cracking

* Reference To: MSVBVM50.rtcMsgBox, Ord:0253h Remontez et vous voyez :

* Referenced by a (U)nconditional or (C)onditional Jump at Address: <== Referenced at |:0041FA39(C) 41FA39|:0041FB84 B904000280 mov ecx, 80020004:0041FB89 B80A000000 mov eax, 0000000A:0041FB8E 894DAC mov dword ptr [ebp-54], ecx:0041FB91 894DBC mov dword ptr [ebp-44], ecx:0041FB94 894DCC mov dword ptr [ebp-34], ecx:0041FB97 8D5594 lea edx, dword ptr [ebp-6C]:0041FB9A 8D4DD4 lea ecx, dword ptr [ebp-2C]:0041FB9D 8945A4 mov dword ptr [ebp-5C], eax:0041FBA0 8945B4 mov dword ptr [ebp-4C], eax:0041FBA3 8945C4 mov dword ptr [ebp-3C], eax:0041FBA6 C7459C205A4000 mov [ebp-64], 00405A20:0041FBAD C7459408000000 mov [ebp-6C], 00000008

* Reference To: MSVBVM50.__vbaVarDup, Ord:0000h |:0041FBB4 FF158CD34200 Call dword ptr [0042D38C]:0041FBBA 8D55A4 lea edx, dword ptr [ebp-5C]:0041FBBD 8D45B4 lea eax, dword ptr [ebp-4C]:0041FBC0 52 push edx:0041FBC1 8D4DC4 lea ecx, dword ptr [ebp-3C]:0041FBC4 50 push eax:0041FBC5 51 push ecx:0041FBC6 8D55D4 lea edx, dword ptr [ebp-2C]:0041FBC9 6A00 push 00000000:0041FBCB 52 push edx

* Reference To: MSVBVM50.rtcMsgBox, Ord:0253h <=== vous arrivez ici après le click

------------------------------------------------------------------------------------

Donc vous avez vu : Referenced at 0041FA39Dans W32Dasm, menu goto, et choisissez Code location et entrez : 0041FA39

Vous arriverez ici:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:|:0041FA24(C)

:0041FA34 66837DEC1F cmp word ptr [ebp-14], 001F <== compare avec 1F (31 en décimal):0041FA39 0F8D45010000 jnl 0041FB84 <== un saut conditionnel :) :0041FA3F 6830394000 push 00403930

* Reference To: MSVBVM50.__vbaNew, Ord:0000h

Page 61: Cours De Cracking

|:0041FA44 FF15E8D24200 Call dword ptr [0042D2E8]:0041FA4A 50 push eax:0041FA4B 6810A04200 push 0042A010

On n'a donc qu'à patcher ce truc :)Pour être sûr de ne pas avoir d'ennuis, j'ai patché en:

:0041FA34 66837DEC00 cmp word ptr [ebp-14], 00:0041FA39 0F8445010000 je 0041FB84

Editez le fichier avec votre éditeur hexa:- cherchez : 66837DEC1F et remplacez par : 66837DEC00.- cherchez : 0F8D45010000 et remplacez par : 0F8445010000

WOW !! Plus de prob de temps :pp facile .........Voilà, vous avez une idée de comment patcher les progs en VB, avec W32Dasm :)

VB Patching: Avec Smart Check:

Aujourd'hui je vais vous apprendre comment cracker des prog VB avec 3 nagset un timelimit!!Je suis sur que vous allez dire "putain c'est dur!"Hehehe !! J'étais en train de tracer avec SI quand j'ai eu une idée...Je vais vous expliquer en quoi ça consiste...

1) Tools requis : - Smart-Check 6 - Hex editor - un cerveau =)

2) Comment cracker les nags !!

Bon pour cela on utilisera SC !Chargez Oyc avec SC et exécutez-le. Clickez sur le nag, attendezque le bouton OK soit activé et ensuite quittez cette app...Dans SC double clickez sur : frmOYCMain_load et regardez jusqu'àce que vous trouviez le ".show" ... dans SC vous verrez:

+ frmStart_Load+ frmStart.Show........................frmShareware_Load

Page 62: Cours De Cracking

frmShareware.Show

Donc, dans ce cas la chose importante est frmstart.showA droite de SC vous voyez l'offset où il est situé et le fichier.Pour ce nag, nous voyons qu'il est dans OYC.EXE @ 000FDA4DOk!Je suppose que vous pensez que c'est ce que je voulais vous montrer !!!

Maintenant j'utilise mon cerveau pour virer le nag, parce que je saisque le nag peut être appelé par un call, donc je pense pourquoi n'irionsnous pas à cet offset et regarder le premier call près de là?

Prenez votre HEXEDITEUR et allez à l'offset 000FDA4D.Ok, maintenant vous savez que ce call commence avec : E8h et salongueur est de 5 octets...Après avoir fait une recherche de ce E8h vous trouvez:E8986FF0FF :)

Remplacez-le par des NOP (90)... ce qui vous donne:9090909090

Sauvez (faites un backup on ne sait jamais) et réexécutez le programme...Comme par magie le premier Nag a été viré!!!!!!!Bien!! heheMaintenant on va passer au suivant!Vous voyez sur la figure ci-dessus qu'il y a un autre ".show"Procédez de la même façon et vous virerez ainsi le timer et le nag!!Je ne vais pas vous montrer la valeur à remplacer parce que c'estexactement la même que dans le premier nag. Et puis c'est biend'avoir des ex. d'application :)

Ok... bon maintenant le dernier nag mais ce sera moins facile que lesautres...Dans SC, double click sur : "mnuFExit_click" (vous le trouverezà la fin du rapport de SC)Ensuite double click sur "frmOYCMain_Unload" et descendez jusqu'àce que vous voyez: "frmEnd.Show". Regardez à droite et prenezl'offset : 1001A1Ok, maintenant vous vous dites, on va faire la même chose qu'avec les deux autres,et ça va être ok!Eh bien non! Ca ne marchera pas!Ok... j'ai réfléchi un peu et je me suis remémoré que vous pouvezchercher un jump pour virer le nag, et dans les apps VB, je jumptoujours comme ça: 0F85 or 0F84 =)Donc utilisez votre hexéditeur et allez à l'offset : 1001A1.Faites une recherche de "OF" vers le haut. Et nous trouvons:0F849A000000 ... remplacez-le par 0F859A000000 (je => jne) et sauvegardez!

Maintenant, exécutez à nouveau!!Plus de nag! plus de timelimit!Parfait!

3) Notes:

J'ai écris ce tut pour montrer comment on peut patcher les apps VB et queparfois un cerveau est plus utile que le traçage avec SI (j'ai bien dit : parfois).

Page 63: Cours De Cracking

Donc, cette façon de cracker les nags VB ne marche pas à tous les coups, mais j'airéussi à cracker plusieurs apps VB comme ça donc faites pas chier! :)Si vous voyez que l'offset est dans un DLL genre MSVBVM50 ou MSVBVM60, faitesjuste une copie et placez-le dans le répertoire du programme et patchez-le.De cette manière, le prog utilisera la DLL qui est dans son répertoire et pascelle du WINDOWS\SYSTEM.Vous n'aurez comme ça pas de problème avec d'autres applications qui utilisentles DLL... !!!

************************************ Dawai 's VB CD check crackme ************************************

Infos données avec le crackme:

--------------------------------------------------------

This is a VB CD-check crackme. Patching is allowed, but it would be cooler if you could tell me what CD the crackme looks for :)

Dawai

----------------------------------------------------------

I)Qu'est-ce que contrôle ce con de crackme ?

tool: Smart Check ( Que vous avez bien configuré d'après mon cours )

Si vous lancez ce crackme, vous allez voir écrit: WelcomeQuand on click sur le bouton check, si ce n'est pas le bon CD, on obtient le super message: Unregisteredhmmm.. ok

Lancez Smart Check et ouvrez le crackme avec ! Clickez sur le bouton et fermez le crackme,vous devez voir: + _clickDouble clickez dessus pour voir ce qui se passe la dessous hehe!

On voit une liste de:

GetdrivetypeA (API utilisée pour déterminer le type de disque et renvoyer 5 si c'est un CD)Cette API est utilisée pour cracker les CD check sur les jeux ...

Sur mon PC, j'ai vu ça:

GetdrivetypeA(blabla) UINT: 2..

Page 64: Cours De Cracking

GetdrivetypeA(blabla) UINT: 1..GetdrivetypeA(blabla) UINT: 3..GetdrivetypeA(blabla) UINT: 5..

On veut cracker un CD check, donc il cherche pour un CD, alors clickez sur celui qui renvoie: 5

Maintenant dans Smart Check clickez sur "show all events".

Ensuite commencez à scroller vers le bas avec les flèches et regardez dans la fenêtre dedroite!

Descendez tant que vous ne verrez pas qq chose qui commence comme ça:

W..Wi..Win..Win9..Win98..Win98 S..Win98 SE..

Hmm ! On dirait qu'il vérifie le label de CD hehe.Mort de rire, descendons un peu pour voir cela de plus près:

__vbaStrCmp(String:"Win98 SE", String:") returns DWORD: FFFFFFFF

Kewl! Il compare vraiment le label! Je n'avais pas mis de CD donc il compare avec rienici !

Cher ami dawai, ton VB CD check crackme vérifie le label du CD ROM !Si c'est: Win98 SE Alors c'est correct (Windows 98 Second Edition)

Mais de toutes façon, je me sert tjs de mes jeux sans CD! Alors je veux pas avoir de CDdans le lecteur !Sux0r :)

II) How to Patch it:

Patcher un prog en Visual Basic est plutôt simple quand on sait comment faire...

Donc clickez sur: __vbaStrCmp(String:"Win98 SE", String:") returns DWORD: FFFFFFFF

Page 65: Cours De Cracking

prenez l'offset dans la fenêtre de droite, on voit: CRACKME2!0000CB68

Lancez W32Dasm, et clickez sur le menu goto et prenez goto code location...Additionnez 400000 a l'offset et on obtient l'emplacement dans W32Dasm ! (400000 = image base)400000 + CB68 = 40CB68Entrez ça dans Goto Code location

On arrive ici :

* Reference To: MSVBVM60.__vbaStrCmp, Ord:0000h |:0040CB68 E89346FFFF Call 00401200 <--- ici!:0040CB6D 8BF0 mov esi, eax:0040CB6F 8D4584 lea eax, dword ptr [ebp-7C]:0040CB72 F7DE neg esi:0040CB74 50 push eax:0040CB75 8D4588 lea eax, dword ptr [ebp-78]:0040CB78 1BF6 sbb esi, esi:0040CB7A 50 push eax:0040CB7B 46 inc esi:0040CB7C 8D458C lea eax, dword ptr [ebp-74]:0040CB7F F7DE neg esi:0040CB81 23B534FFFFFF and esi, dword ptr [ebp+FFFFFF34]:0040CB87 50 push eax:0040CB88 6A03 push 00000003

* Reference To: MSVBVM60.__vbaFreeStrList, Ord:0000h |:0040CB8A E87746FFFF Call 00401206:0040CB8F 83C410 add esp, 00000010:0040CB92 663BF3 cmp si, bx:0040CB95 751F jne 0040CBB6 <-- hmm :) intéressant!:0040CB97 6A02 push 00000002:0040CB99 5E pop esi

Comme on peut le voir, on voit une petite comparaison et juste en dessous un saut conditionnel!

Changez-le jne en jmp !

:0040CB95 751F jne 0040CBB6

devient

:0040CB95 EB1F jmp 0040CBB6

Faites les modification dans le fichier et sauvegardez!Relancez le crackme et clickez sur le bouton! jezuz :) Ca marche hehREGISTEREDOh my god , c'était simple :)

*****************************************************************************************

Page 66: Cours De Cracking

** Pour finir avec le VB: comment réactiver un Bouton, rendre une fenêtre invisible... *******************************************************************************************

Boutons:

Pour un bouton on cherche qq chose comme ça dans Smart Check:

Command1.Enabled <-- False (Boolean)Clickez dessus et regardez dans la fenêtre de droite sous Smart Check pour récupérerl'offset, on l'ajoute à l'image base comme j'ai décrit plus haut et on va dansW32Dasm !On retrouve quelque chose comme ça :

6A00 push 0000000050 push eax8945E4 mov dword ptr [ebp-1C], eaxFF928C000000 call dword ptr [edx+0000008C]

On voit le Push 00 (false) et on veut réactiver le bouton, donc il faut mettre en (True)c'est pas push 01 :P , mais push FFDonc on remplace ça en:

6AFF push FFFFFFFF50 push eax8945E4 mov dword ptr [ebp-1C], eaxFF928C000000 call dword ptr [edx+0000008C]

On sauvegarde le fichier et hop-la, le bouton est enabled !Notes: des fois on trouve pas de: Command1.EnabledPas encore étudié ce problème yet !Donc on prends the customizer pour ça et on en parle plus :)

Cette méthode marche pour activer les : boutons donc, les menus, check box, labelset autres ... :

Command1.Enabled <-- False (Boolean)Text1.Enabled <-- False (Boolean)Label1.Visible <-- False (Boolean).....

Ca marche aussi pour cracker un nag screen!

On click sur le form1.visible .... on prends l'offset et on se rend sur les lieux:)On examine le code! on doit voir un: Push FFFFFFFFF (enabled) donc visibleOn le remplace par un Push 0000000 (disabled) donc invisible ...

Et hop-la, finis les problèmes de nags screen :)Bon assez sur le patching en VB sinon on va pas finir heheUn peu de serial fishing à présent et ensuite du keygening ;)

Page 67: Cours De Cracking

************************************************************************** Serial Fishing **************************************************************************

******************************** MIZ CRACKME 2 ********************************

Quelles sont les protections? Il y a 2 protections dans ce crackme :

1) anti Smart Check 2) Serial

1)Comment supprimer la protection anti Smart Check ?

La protection anti SC est placée au début du crackme et quand le crackme est exécuté, il vérifie la présence de SC avec un timer! Après avec regardé avec SI si l'anti SC était basé sur la vérification de "NMSCWM50" (l'ID de la fenêtre de SC), j'ai regardéle crackme avec un hexéditeur pour cette chaîne et je l'ai trouvée.Mais si vous ne cherchez que NMSCWM50, vous ne trouverez rien parce que c'est un programme VB qui utilise le format WIDE donc: w.i.d.e. .c.h.a.r.a.c.t.e.r. .f.o.r.m.a.t Regardez cette chaîne: 4E004D00530043004D005700350030 en hexCool! Vous l'avez trouvée! Remplacez par des 0 par exemple et sauvez. Maintenant la protection anti SC est éliminée! On peut donc exécuter SC dessus!

2) Trouver le serial !

Exécutez SC et le prog. Entrez un serial: 123456 et pressez "Check Now" puis sortez du programme. Retournez dans SC et vous verrez un timer et après:

label3_Click

Mais il n'y a rien de bien ici...Mais quand j'ai vu GetVolumeInformationA , j'ai pensé que le serial dépend sûrement du PC ! On verra ça après ...

Nous allons essayer de le trouver avec SI parce qu'il n'y rien de bien avec SC! On va utiliser bpx __vbastrcomp parce que on le retrouve couramment dans les prog VB!ctrl + D et tapez bpx __vbastrcomp. F5 pour retourner au programme et tapez: 123456comme serial.Cliquez sur check et on est de retour dans SI Cool!!!Pressez F12 pour sortir du call __vbastrcomp !Vous devriez voir ESP en couleur et c'est bon signe!Maintenant tapez dd esp (pour afficher la memoire en esp),vous voyez: aaaaaaaa bbbbbbbb cccccccc dddddddd

Page 68: Cours De Cracking

Essayez de faire d aaaaaaaa , mais vous ne voyez rien d'intéressant alors essayez d bbbbbbbb , et vous obtenez une phrase qui n'est pas votre serial et vous voyez __vbar8str. Hey !! C'est break points ? On va essayer!!ctrl+D et tapez bc * pour supprimer tous les bpx. Tapez __vbar8str puis pressez F5.Entrez 123456 comme serial et clickez sur check ! Cool on est dans SI!!! Tapez WF pour afficher la fenêtre concernant la pile à virgule flottante. Vous voyez:

ST0 empty ST4 empty ST1 empty ST5 empty ST2 empty ST6 empty ST3 empty ST7 empty

Commencez à tracer avec F12 pour aller dans la fonction:__vbaR8str ! Vous devriez voir: ST0 123456 !! Cool, continuez avec F10 et ST0 devient : 892935893 !!! <== qu'est ce que c'est? Essayons!! bd * pour désactiver tous les bpx et entrez ce nombre! Et la message box apparaît: Mail the solution to : ... Cool crackme Cracked !!!

Mais attendez, nous voyons dans SC que ça dépendait du PC avec GetVolumeInformationA !! Ok, je vais essayer ce nombre sur mon second PC et ça ne marche pas!!! J'avais donc raison, ce nombre dépend de la machine !! Donc ce nombre ne fonctionnera pas chez vous, essayez de le trouver c'est un bon moyen de savoir si vous avez tout compris!!!

Avant de passer au keygen pure et dure (plus compliqué que le premier exemple),je vais vous montrer 2 façons de récupérer les serials pour les programmes enVB 5 ou 6 :)En effet, il existe une API très souvent utilisée dans les contrôles des serials!--> __vbastrcomp Nous allons voir cela de plus près !

******************************** MIZ CRACKME 3 ********************************

Protections : 1) Code 2) Anti SmartCheck Il existe un bonne BPX pour les app VB c'est __vbastrcomp! Donc on va essayer celui-ci dans Soft-ice!

Tapez ctrl+D puis BPX __vbastrcomp F5

nAME: ACiD BuRN cODE: 123456

Page 69: Cours De Cracking

Entrez serial nom et cliquez sur Check !

Nous sommes de retour dans SI grâce à la BPX! Cool!Pressez F12 pour sortir du call,vous devriez voir EBP en couleur! c'est bon signe! tapez maintenant:dd esp (on examine la pile)

Vous devriez voir: aaaaaaaa bbbbbbbb cccccccc dddddddd

Essayez de faire: d aaaaaaaa , et vous ne devriez pas voir des choses intéressantes.donc essayez ça:d bbbbbbbb , et vous obtenez dans mon cas: Oy!iYt^LK

Ca ressemble à un code! On va l'essayer...

nAME: ACiD BuRN cODE: Oy!iYt^LK

et ça marche !!!!!!!!

Après les BPX sur les fonctions couramment utilisées en VB, voici une autre méthodesimple et rapide pour trouver un serial en VB:

************************ HDMorph ************************

Il change l'icône du disque dur... c'est pas vraiment utile mais c'est pas ReGGed!! On va s'amuse un peu avec!! Tout d'abord, c'est une bonne idée lorsque vous voulez cracker des programmes VB de chercher:

S 0 L ffffffff 56,57,8b,7c,24,10,8b,74,24,0c,8b,4c,24,14,33,c0,f3,66,a7

NOTE: le mieux étant de le mettre dans le WINICE.DAT. Alt F4 étant rarement utilisé, vous pouvez l'utiliser comme bon vous semble: 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 vous évitera de tout retaper... Redémarrez le PC pour que les changements prennent effet!

Quand c'est fait on peut commencer à cracker le programme!

Lancez-le et allez dans register. Entrer nAME: ACiD BuRN sERIAL: 123456

ctrl+D Soft-ice arrive et tapez bpx hmemcpy. F5

Page 70: Cours De Cracking

Click sur Ok et nous sommes de retour dans SI! Bien!...

Maintenant tapez F11 et F12 jusqu'à ce que vous voyez MSVBVM50 en bas de la fenêtrede SI.Nous somme au bon endroit... ALT F4 pour rechercher l'emplacement de comparaison!!Vous devriez voir:"search pattern found at XXX:XXXXXXXX".Chez moi les XXX:XXXXXX sont25F:7B1DD9EA.Placez un BPX sur cette adresse et enlevez le bpx hmemcpy (BD 0)F11 et nous sommes arrêtés à cause de 25F:7B1DD9EA .C'est là où il y a la comparaison, on voit:

: 56 push esi : 57 push edi : 8B7C2410 mov edi, [esp + 10] ; Move real serial into edi : 8B7C240C mov esi, [esp + 0C] ; Move fake serial into esi : 8B4C2414 mov ecx, [esp + 14]

Tapez F10 pour passer "mov edi, [esp + 10]" et tapez d edi pour voir le bon serial ! pour ACiD BuRN nous voyons: 1.3.0.2.6.8.6.3.0.5.4.4.3.2.0.7.9.2.1.6.3.8.1.3.1.2.1.4.0.4 Parce que c'est un programme VB nous avons des espaces (nul) entre chaque chiffre.Donc le bon code est :130268630544320792163813121404On vérifie:nAME: ACiD BuRNcODE: 130268630544320792163813121404

Pressez OK mais rien ne nous dit que c'est le bon serial... Redémarrez....Allez dans ABOUT et vous voyez : Registered to: ACiD BuRN No comment ;)

******************************************************** VB KEYGENING: ********************************************************

********************************************** Eternal Bliss 's Camouflage Crackme **********************************************

Protections : - anti SmartCheck - serial / name

1) anti SmartCheck (SC):

Il y a plusieurs façons de détecter si SC est activé. Je vais vous donner la plus courante:

Le programme regarde la barre des titres de SC et il trouve: "NuMega SmartCheck"

Page 71: Cours De Cracking

Puis se ferme tout seul! Merde!

La deuxième façon est de regarder l'ID de le fenêtre de SC: NMSCVM50 Et si il le trouve alors il se ferme aussi tout seul!

Comment l'éviter? Si vous voulez cracker la plupart des applications avec un anti SC, c'est préférable depatcher directement l'exécutable SC. Pour cela, utilisez un hexéditeur et cherchez NuMega SmartCheck. Ensuite changez-le en ce que vous voulez!

Pour patcher l'ID de la fenêtre, c'est plus difficile parce que vous ne le voyez pasavec un hexéditeur! Vous pouvez utiliser le programme de CyberBlade (un ami): UPK.

Mais je ne l'ai pas et je vais vous dire comment j'ai fait!

Tout d'abord, j'ai mis un BPX sur l'API avant le MessageBox qui dit "you are not registered blabla...". Ensuite, vous devrez charger le crackme dans SC et l'exécuter!!! On retourne dans Soft-ice et vous allez rechercher: s 0 l ffffffff 'NMSC' (je n'ai pas recherché NMSCWM50... soyez sûr que vous trouverez le bon) tapez S jusqu'à ce que vous trouviez NMSCVM50. La première fois que vous le verrez, réécrivez par dessus des 00000000. Hehe, le crackme continue son exécution sous SC!!

2) Comment l'enregistrer?

Clicker sur Register et entrez un nom et un serial au hasard genre 123456 et cliquez sur "Check It", vous verrez : Wrong Try again à l'emplacement de votre nom... Donc ce n'est pas le bon =)!!

Ok, quittez le crackme et retournez dans SC. D'abord, sauvez votre projet, avec File/Save as... Parce que je pense que vous ne voudrez pas refaire cette première partie du tut plusieurs fois!

Vous verrez command5_click, double click and regardez cette chose intéressante: Maintenant allez sous SC et regardez votre nom, vous verrez:

--------------Start of SC cut--------------------------------

Mid(varian:byReF String:"ACiD BuRN",long1,VARIANT:Integer:1) Asc(string:"A")returns Integer:65 Trim(VARIANT:Integer:34) Mid(varian:byReF String:"ACiD BuRN",long2,VARIANT:Integer:1) Asc(string:"C")returns Integer:67 Trim(VARIANT:Integer:32) Mid(varian:byReF String:"ACiD BuRN",long3,VARIANT:Integer:1) Asc(string:"i")returns Integer:105 Trim(VARIANT:Integer:10) Mid(varian:byReF String:"ACiD BuRN",long4,VARIANT:Integer:1) Asc(string:"D")returns Integer:68 Trim(VARIANT:Integer:39) Mid(varian:byReF String:"ACiD BuRN",long5,VARIANT:Integer:1)

Page 72: Cours De Cracking

Asc(string:" ")returns Integer:32 Trim(VARIANT:Integer:67) Mid(varian:byReF String:"ACiD BuRN",long6,VARIANT:Integer:1) Asc(string:"B")returns Integer:66 Trim(VARIANT:Integer:33) Mid(varian:byReF String:"ACiD BuRN",long7,VARIANT:Integer:1) Asc(string:"u")returns Integer:117 Trim(VARIANT:Integer:22) Mid(varian:byReF String:"ACiD BuRN",long8,VARIANT:Integer:1) Asc(string:"R")returns Integer:82 Trim(VARIANT:Integer:49) Mid(varian:byReF String:"ACiD BuRN",long8,VARIANT:Integer:1) Asc(string:"N")returns Integer:78 Trim(VARIANT:Integer:45)

------------------End of Smartcheck cut----------------------

Regardez maintenant le code : avez-vous trouvé un truc cool?

Ici:

Mid(varian:byReF String:"ACiD BuRN",long1,VARIANT:Integer:1) <= 1er caractère Asc(string:"A")returns Integer:65 <=== Valeur ASCII -> décimal Trim(VARIANT:Integer:34) <=== la valeur de serial??

Pourquoi ne pas essayer toutes ces valeurs comme un serial? Donc prenez toutes les valeurs pour chaque lettre et ça donne:

Essayons: name : ACiD BuRN serial : 343210396733224945

Clickez sur "Check It" et ça marche!!!!! Bon on l'a cracké!!! Maintenant je vais vous expliquer comment le keygener.

3) Keygen it

Bon... Comment a-t-il trouvé cette putain de valeur?!!! Hehe!! Laissez-moi voir... Pourquoi pas un XOR?

Asc(string:"A")returns Integer:65 <== 1st ascii value Trim(VARIANT:Integer:34) <== 1st good key Asc(string:"C")returns Integer:67 <== 2nd ascii value Trim(VARIANT:Integer:32) <== 2nd good key ..... Si nous faisons 65 XOR 34 (à l'aide la calculatrice Windows en mode scientifique)

Nous trouvons: 99

hehe !!

Page 73: Cours De Cracking

Si nous trouvons la même valeur avec 67 XOR 32 alors on a de quoi faire un keygen! Regardez!! 67 XoR 32 = 99 ! Cool!! On l'a fait!!

Parce que si nous faisons 67 XOR 99=32 =) La bonne valeur de la clé! Donc pour faire un bon serial de votre nom vous devrez prendre la valeur ASCII de chaque lettre et le XOR 99. Sauvegarder cette valeur et ajouter à côté le prochain résultat pour chaque lettre de votre nom!!

Comment le coder? Voici le code source VB5:

4) Source du Keygen:

--------------Start of the source-------------

Private Sub Command1_Click() For i = 1 To Len(Text1.Text) code = Asc(Mid$(Text1.Text, i, 1)) Xor 99 Text2.Text = Text2.Text & code Next i End Sub

----------------End of the source-------------

Pour le tester, créez un nouveau projet avec un bouton et 2 textbox .Double clickez sur le bouton et copiez le code! hehe !!

Fini!

Crackme Cracked!! =)

C'était un keygen très simple à faire !! Mais il y en a des pires !!!Vous verrez ça bien assez tôt !! Croyez moi :)

*************************** Keygen de Lan-Box 1.01 ***************************

type: Visual Basic 6 appniveau: très faciletools demandés: Smart Check 6, VB pour coder le keygenURL: http://members.tripod.com/LAN-BOX

Lancez Smart Check, et lancez le programme avec :)Clickez sur le bouton Info et ensuite sur Register!

Entrez votre name : ACiD BuRNet votre serial : 112233

Clickez sur le bouton pour contrôler le serial et cet enculé nous sort bad serial blablabla...Heh, fermez lan-box et faites une research de texte sur: ACiD

Nous allons atterrir là où l'algo commence!!

Page 74: Cours De Cracking

Regardez un peu et vous verrez qu'il prends les valeurs ascii de chaque lettresdu nom entré...Clickez sur la ligne:

asc(String:"A") returns Integer:65

Pour voir ce que fait ce putain de programme, on click sur : "Show all event" dans le menuView..

Ensuite on voit ceci:

asc(String:"A") returns Integer:65 <== on voit le programme prendre la valeur ascii de la première lettre (1ere lettre: "A" provenant d'ACiD BuRN)

Ensuite il ajoute aux autres...

En 1er, il ajoute "65" a "0" car il n'y avait pas de lettre avant!On voit ça dans Smart Check avec la ligne suivante:

__vbavaradd(VARIANT:Empty,VARIANT:Integer:65)

Ceci ajoute 65 à 0 (empty veut dire : pas encore de valeur donc vide)

Si on regarde plus bas, on voit la même chose avec la lettre d'après "C" (C de ACiD BuRN)

Asc(String("C") returns Integer: 67 <== prends la valeur ascii de la lettre où nous somme actuellement, ici on a "C"Ensuite ajoute cette valeur au résultat de l'ancienne addition!

__vbavaradd(VARIANT:65,VARIANT:Integer:67)

Résultat:

_vbavarmove(VARIANT:integer:132,VARIANT:Integer:65)Le résultat est: 132 et la valeur: 65 est l'ancienne valeur. Donc il efface la valeur qu'il avaitmis de côté et la remplace par la nouvelle valeur: 132..

Bien il fait ceci avec chaque valeur ascii, et cette boucle prends les valeurs ascii du nomet les additionnes entre elle!

Cela donne ceci:

--------------------------------A = 65 + 0C = 67 + 65 = 132i = 132 + 105 = 237D = 237 + 68 = 305space = 305 + 32 = 337B = 337 + 66 = 403u = 403 + 117 = 520R = 520 + 82 = 602

Page 75: Cours De Cracking

N = 602 + 78 = 680---------------------------------

Donc la valeur finale de ces opérations est 680 en décimal ....

Maintenant descendez tant que vous n'aurez pas atteint la fin de la boucle surles valeurs ascii, c'est là où vous verrez la valeur: "680" :)

Heh, maintenant on regarde un peu plus et si on descend encore, on voit:

__vbavarmul(VARIANT:680,VARIANT:232354) : multiplie le résultat des valeurs ascii avec 232354le résultat est : 158000720

__vbavarmul(VARIANT:158000720,VARIANT:653435) : multiplie le résultat de la premièremultiplication avec 653435le résultat est: 103243200473200

__vbavardiv(VARIANT:1.03243e014,VARIANT:23446534) : divise le résultat de la 2nd multiplication avec 23446534 (note: 1.03243e014 est la même chose que 103243200473200 C'est pour cela qu'il est bon de faire les calculs pour vérifier les valeurs :)

Le résultat est: 4403345.947558817 (on vois cette valeur dans Smart Check)

et finalement on trouve:

__vbavarmove(VARIANT:Double:4.40335e+006,VARIANT:Integer:680)

Cela déplace le résultat final (bon serial) où la valeur "680" a été écrite ! Il l'ecrase donc!Donc la première fois, j'ai cru que c'était le bon serial!! Mais c'était pas le bon !J'ai entré: 4403345.947558817 , putain c'est pas le bon !Mauvaise message box de merde!

Si on descend encore un peu, on voit la valeur: 4403345,94755882Essayons-le: Ca marche :)

Donc, je me demandais comment 4403345.947558817 est devenu 4403345,94755882 ..J'ai commencé à programmer le keygen pour voir comment je pourrais réparer le problème ...Je l'ai programmé en VB5 (c'est tjs bien les keygens en VB, sur des programmes VB caron utilise les mêmes opérations et fonction que le programme lui-même)

Donc j'ai généré un serial avec le nom: ACiD BuRN et il m'a donné: 4403345,94755882Cooooool ! Je sais pas pkoi ça marche, sûrement à cause des fonctions VB :)D'où l'intérêt encore une fois du keygen en VB!Bref, ça marche, je suis fatigué et je vais pas me poser des questions 30 ans !

Explication global de l'algo:

--------------------------ALGO---------------------------------

Page 76: Cours De Cracking

1st : additionne toutes les valeurs ascii du nom2nd : multiplie la valeur (de la 1ere partie de l'algo) avec 2323543rd : multiplie la valeur (de la 2eme partie de l'algo) avec 6534354th : et divise la valeur (de la 3eme partie de l'algo) avec 23446534

---------------------END OF ALGO-------------------------------

Le résultat en 4 est le serial valide !!!!!!!!

3) BONUS SOURCE : le keygen en VB

-----------------------------START OF SOURCE-----------------

For i = 1 To Len(Text1.Text)temp = Asc(Mid(Text1.Text, i, 1))final = final + tempNext ifinal = final * 232354final = final * 653435final = final / 23446534Text2.Text = final

-----------------------------END OF SOURCE--------------------

Dernier Exemple:

********************The Power 1.0 fr ********************

Après Le keygen d'un programme en name / serial !! Voici celuisur un serial only!

on a besoin de: - Smart Check 6 (doit être bien configuré) - Visual Basic : pour programmer le keygen (un autre langage fera l'affaire aussi) - le programme : http://www.ifrance.com/vbandjava - un cerveau ;)

Lancez Smart Check et ouvrez le programme avec !!On voit apparaître : "the power est un shareware...."C'est juste un nag screen, on s'en tape!On click sur OK, et on voit maintenant une INPUT BOX avec le texte suivant:

"Le numéro de votre disque (celui à partir duquel vous avez lancé the power)est : (il vous donne le numéro)Si vous souhaitez vous enregistrez, notez ce numéro et blablablabla"

Page 77: Cours De Cracking

Donc on voit que le programme nous demande de noter ce numéro basé sur notredisque dur! et de l'envoyer si on veut s'enregistrer !! ok ok !!Donc ce programme nécessite un keygen car le serial valid pour votre PC ne marcherapas sur les autres ordis !

Donc entrez un serial à la con: 112233 et clickez sur OK!On a le sale msg d'erreur *grin* : "Vous vous êtes trompé(e) blablabla" (pas pour très longtempslol )

Donc on ferme le programme et on retourne sous Smart Check pour étudier tout ça !on va examiner l'algo :)

Dans Smart Check, double clickez sur : Form1_loadDonc on va d'abord chercher qq chose qui se sert de notre disque dur,(l'API la plus utilisée est GetvolumeinformationA) rappelez-vous des CD checks!

Regardez donc un peu plus bas et on trouve:

GetVolumeInformationA(LPSTR:00413BA4....)2 lignes plus bas on voit : Right(VARIANT:Double:8.92936e+008,long:8)

Terrible ! Ca a l'air sympathique tout ça ! Clickez dessus et regardez la valeur dans la fenêtrede droite!!On voit : 892935893 <== c'est notre numéro de disque dur

donc "Right(VARIANT:Double:8.92936e+008,long:8)" est égal à :"Right(VARIANT:Double:892935893,long:8)"

Cela veut dire qu'il prends les valeurs à partir de la droite avec une longeur de: 8les 8 valeurs a partir de la droite de 892935893 sont 92935893 .Ne serait-ce pas le serial que l'on voit dans la boite de dialogue au début ?mais si ! Tout à fait :)

Vous n'aurez pas les mêmes valeurs chez vous car ça dépend du disque dur !!

Environ 2 lignes plus bas on trouve:

Len(String:"92935893")returns LONG:8

Click dessus et dans le menu View, faites: show all events...

Maintenant on voit qqchose comme ceci :

Mid$(String:"92935893",long:1,VARIANT:Integer:1)....String("9") --> Double (9)Double (9) --> Integer (9)

......

Mid$(String:"92935893",long:2,VARIANT:Integer:1)

Page 78: Cours De Cracking

....String("2") --> Double (2)Double (11) --> Integer (11)

......

Mid$(String:"92935893",long:3,VARIANT:Integer:1)....String("9") --> Double (9)Double (20) --> Integer (20)

......

Mid$(String:"92935893",long:4,VARIANT:Integer:1)....String("3") --> Double (3)Double (23) --> Integer (23)

......

Mid$(String:"92935893",long:5,VARIANT:Integer:1)....String("5") --> Double (5)Double (28) --> Integer (28)

......

Mid$(String:"92935893",long:6,VARIANT:Integer:1)....String("8") --> Double (8)Double (36) --> Integer (36)

......

Mid$(String:"92935893",long:7,VARIANT:Integer:1)....String("9") --> Double (9)Double (45) --> Integer (45)

......

Mid$(String:"92935893",long:8,VARIANT:Integer:1)....String("3") --> Double (3)Double (48) --> Integer (48)

......

Hmm!! Vous devez vous demander ce que ce truc fait !!!et comment les valeurs sont calculées.

Laissez-moi vous éclaircir:

Il prends les valeurs une par une du serial (la version modifiée de celui du disque dur)et les ajoutes au résultat de l'addition d'avant !Voici l'exemple, c'est plus clair:

Page 79: Cours De Cracking

0 + 9 = 9 (0 car 9 est le 1er nombre donc rien à ajouter encore!) 9 + 2 = 1111 + 9 = 2020 + 3 = 2323 + 5 = 2828 + 8 = 3636 + 9 = 4545 + 3 = 48

Donc vous voyez comment ces valeurs sont calculées!! Pas très compliqué, il faut juste réfléchir!

Bref, ensuite on voit:

Mid$(String:"92935893",long:8,VARIANT:Integer:1)....String("3") --> Double (3)Double (48) --> Integer (48)

et il y a :

Hex(VARIANT:integer:19952)__vbastrVarMove(VARIANT:String:"4DF0") .........

Donc il prends la valeur hexa de 19952 (4DF0)

et si on descend plus bas, on voit la comparaison:

__vbaStrCmp(String:"4DF0",String:"112233") returns DWORD: FFFFFFFF

C'est celui qui est le plus utilisé pour comparer!!Ici il compare: 4DF0 avec 112233 112233 = faux serial , celui qu'on a entré4DF0 = le serial en hexadécimal qu'on a vu !! C'est le serial valide.

Mais le problème est : d'où vient ce putain de 19952 ?!

Regardons encore ce que nous avons vu avec Smart Check:

Mid$(String:"92935893",long:8,VARIANT:Integer:1)....Double (48) --> Integer (48)Hex(VARIANT:integer:19952)__vbastrVarMove(VARIANT:String:"4DF0") ....

Hmm, si on ajoute 48 à 19952, on obtient: 20000Hoho !! On dirait que le programme soustrait la valeur calculée à partirdu serial provenant du disque dur à 20000 .

48 = valeur venant du disque dur20000 = constante

20000 - 48 = 19952

Et après ça, il convertit le résultat en hexadécimal:19952(d) = 4DF0(h)

Et on obtient le bon serial: 4DF0

Page 80: Cours De Cracking

C'est le code valide !!! donc si on faisait un petit keygen:

--------------------------------------------------------------------------------The keygen:

Pour cela on utilise les API Windows pour récupérer le numéro de sériedu disque dur..et ensuite on fait le reste des calculs !Je vais montrer la partie calculation car celle qui récupère le numéro du disque n'est pas très importante, mais très longue :/Voici les sources en VB:

-----------------------------little cut of source---------------------------------

'ici il y a les sources pour récupérer les numéros du disque normalement

serial = Right(Format$(lngVolumeSerialNumber), 8)

Label1.Caption = "The value from your hard drive is: " + serialFor i = 1 To Len(serial)temp = temp + Val(Mid(serial, i, 1))Next i

Text1.Text = "Your personal unlocking code is :" + Hex(20000 - temp)

-------------------------end of little cut of source-------------------------------

Et voilà !! C'est terminé pour les keygens des programmes en VB!!Mais je vous invite à lire les nombreux autres cours que j'ai écrità ce sujet !!May the Force be with you ;p

JAVA Reverse Engineering

Cracker du java peut être extrêmement facile à condition d'avoir un décompilateurJe vais donc vous montrer comme quoi reverser du java, ça peut être très simple !Il existe des protections java beaucoup plus dure bien sûr, mais c'est juste uneapproche sur le reversing du java !!

On a besoin de:- JAD (java decompiler)- rien de plus :)

URLS: www.lawrencegoetz.com/ (Trucs à cracker) http://www.acidburn2000.com (le décompilateur java)

Page 81: Cours De Cracking

Dans ce cours nous allons cracker 3 choses: Goetz's Banner V 2.0 , Goetz's Marquee 1.1,et ManKind java crackme !

Let's kick some ass !Dézippez l'archive de Goetz's Banner V 2.0 dans un répertoire quelquonque, vous devez voirdes fichiers de type .class et html entre autres!Lancez the fichier d'exemple exemple.html), et vouz verrez l'effet de bannière sur ce petit truc en java ! Mais un Putain de UNREGISTERED à la con pointe son nez hehe Doh!Donc, les fichiers java sont de type: .class . Après avoir récupéré le décompilateur javasur mon site, et l'avoir placé dans le répertoire où vous venez de dézipper ces appletsdéplacez le fichier .class sur le décompilateur (jad.exe) pour qu'il le décompile!!Mais, il est préférable de faire un fichier .Bat , pour définir le chemin de destinationdu fichier décompilé, car il peut se retrouver dans le répertoire de Windows par exemple!Bref, une fois que vous l'avez (les fichiers décompilés portent l'extension ".jad"),éditez-le avec un éditeur de textes, et vous devriez voir qq chose comme ça:

--------------------------------------gbanner.JAD------------------------------------------

// Decompiled by Jad v1.5.7. Copyright 1997-99 Pavel Kouznetsov.// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.html// Decompiler options: packimports(3) // Source File Name: gbanner.java

import java.applet.Applet;import java.applet.AppletContext;import java.awt.*;import java.io.*;import java.net.MalformedURLException;import java.net.URL;import java.util.Vector;

public class gbanner extends Applet implements Runnable{

public boolean mouseEnter(Event event, int i, int j) { if(info[place] != null && displaying) getAppletContext().showStatus(info[place]); mouseInside = true; return true; }

public void stop() {

Page 82: Cours De Cracking

running = false; if(animate != null) { animate.stop(); animate = null; } }

public gbanner() { m_background = "white"; test_it = ""; drawn = true; zoom = true; pausable = true; m_target = "_self"; }

public boolean mouseExit(Event event, int i, int j) { mouseInside = false; getAppletContext().showStatus(""); return true; }

public void paint(Graphics g) { if(drawable) { g.drawImage(offImage, 0, 0, this); place = loadImage; } drawn = true; }

public String[][] getParameterInfo() { String as[][] = { { "image", "String", "lineN where N is the line number" }, { "background", "String", "Background color" }, { "URL", "String", "URLN where N is the URL for the image N." }, { "target", "String", "Target of URL" }, { "info", "String", "infoN where N is the infomation for the image N." }, { "pause", "String", "pauseN where N is the pause time for the image N." }, { "zoom", "String", "Zoom the images or not." }, { "shuffle", "String", "Shuffle the images or not." }, { "pauseable", "String", "Pause the applet when the mouse is in it." }, {

Page 83: Cours De Cracking

"one", "String", "Display only one image. Good for use with shuffle to display one random image." } }; return as; }

public void destroy() { running = false; if(animate != null) { animate.stop(); animate = null; } }

public int[] shuffle() { Vector vector = new Vector(); int ai[] = new int[amount]; for(int j = 0; j < amount; j++) vector.addElement(new Integer(j));

for(int k = 0; k < amount; k++) { int i = (int)(Math.random() * (double)(amount - k)); Integer integer = (Integer)vector.elementAt(i); ai[k] = integer.intValue(); vector.removeElementAt(i); }

return ai; }

public void update(Graphics g) { paint(g); }

public void start() { place = 0; if(offImage == null) { offImage = createImage(d.width, d.height); offGraphics = offImage.getGraphics(); } try { myInfo = new URL(getDocumentBase(), "gboption.ini"); } catch(MalformedURLException _ex) { good = false; } if(myInfo != null) try { input = myInfo.openStream(); dataInput = new DataInputStream(input);

Page 84: Cours De Cracking

test_it = dataInput.readLine(); dataInput.close(); } catch(IOException _ex) { } if(test_it.equals("InFeb")) good = true; running = true; if(animate == null) { animate = new Thread(this); animate.start(); } }

public String getAppletInfo() { return "Title: Goetz's Banner\r\n" + "Author: Lawrence Goetz\r\n" + "E-mail: [email protected]\r\n" + "Web: http://www.lawrencegoetz.com/\r\n" + "Copyright Lawrence Goetz 1998"; }

public boolean mouseDown(Event event, int i, int j) { if(locations[place] != null && displaying) getAppletContext().showDocument(locations[place], m_target); return true; }

public void run() { int i = 20; int ai[] = null; if(shuffle) ai = shuffle(); int j1 = 0; if(!shuffle) loadImage = j1; setMyColor(offGraphics, "blue"); offGraphics.fillRect(0, 5, 110, 20); setMyColor(offGraphics, "yellow"); offGraphics.drawString("Loading Image", 5, 20); drawable = true; repaint(); try { Thread.sleep(100L); } catch(InterruptedException _ex) { } Thread.yield(); images = new Image[amount]; while(running) { while(!drawn) try { Thread.sleep(10L); } catch(InterruptedException _ex) { }

if(shuffle)

Page 85: Cours De Cracking

loadImage = ai[j1]; if(!shuffle) loadImage = j1; images[loadImage] = getImage(getDocumentBase(), getParameter("image" + Integer.toString(loadImage + 1))); MediaTracker mediatracker = new MediaTracker(this); mediatracker.addImage(images[loadImage], 0); try { mediatracker.waitForID(0); } catch(InterruptedException _ex) { } drawn = false; drawable = false; if(!zoom) i = 1; image_w = images[loadImage].getWidth(this); image_h = images[loadImage].getHeight(this); int j = image_w / i; int k = image_h / i; int l = d.width / 2 - j / 2; int i1 = d.height / 2 - k / 2; setMyColor(offGraphics, m_background); offGraphics.fillRect(0, 0, d.width, d.height); if(i != 1) offGraphics.drawImage(images[loadImage], l, i1, j, k, this); else if(i == 1) offGraphics.drawImage(images[loadImage], l, i1, this); if(!good) { setMyColor(offGraphics, "blue"); offGraphics.fillRect(0, 5, 200, 100); setMyColor(offGraphics, "yellow"); offGraphics.drawString("UNREGISTERED VERSION!!!", 5, 25); offGraphics.drawString("Please Register this applet.", 5, 50); offGraphics.drawString("Registration is only $5.", 5, 80); } drawable = true; try { Thread.sleep(50L); } catch(InterruptedException _ex) { } if(i > 1) i -= 2; if(i <= 0) i = 1; else if(i == 1) i = 20; repaint(); displaying = true; if(i == 20) { if(pause[loadImage] > 0) try { Thread.sleep(pause[loadImage] * 1000);

Page 86: Cours De Cracking

} catch(InterruptedException _ex) { } while(pausable && mouseInside) try { Thread.sleep(100L); } catch(InterruptedException _ex) { }

while(one && running) { drawable = true; repaint(); try { Thread.sleep(100L); } catch(InterruptedException _ex) { } }

if(++j1 == images.length) { j1 = 0; if(shuffle) ai = shuffle(); } } Thread.yield(); }

}

public void init() { int i = 1; String s4 = "image" + Integer.toString(i); for(String s = getParameter(s4); s != null; s = getParameter(s4)) { amount++; i++; s4 = "image" + Integer.toString(i); }

locations = new URL[amount]; for(int j = 0; j < amount; j++) { String s1 = getParameter("URL" + Integer.toString(j + 1)); if(s1 != null) { try { locations[j] = new URL(getDocumentBase(), s1); } catch(MalformedURLException _ex) { } } else { String s2 = getParameter("URL"); try { locations[j] = new URL(getDocumentBase(), s2);

Page 87: Cours De Cracking

} catch(MalformedURLException _ex) { } } }

String s3 = getParameter("target"); if(s3 != null && !s3.equals("")) m_target = s3; info = new String[amount]; for(int k = 0; k < amount; k++) { info[k] = getParameter("info" + Integer.toString(k + 1)); if(info[k] == null) info[k] = getParameter("info"); }

pause = new int[amount]; for(int l = 0; l < amount; l++) { String s6 = getParameter("pause" + Integer.toString(l + 1)); if(s6 != null && !s6.equals("")) { pause[l] = Integer.parseInt(s6); } else { String s7 = getParameter("pause"); if(s7 != null && !s7.equals("")) pause[l] = Integer.parseInt(s7); } }

String s5 = getParameter("background"); if(s5 != null) m_background = s5; s3 = getParameter("zoom"); if(s3 != null && s3.equalsIgnoreCase("false")) zoom = false; s3 = getParameter("pauseable"); if(s3 != null && s3.equalsIgnoreCase("false")) pausable = false; s3 = getParameter("shuffle"); if(s3 != null && s3.equalsIgnoreCase("true")) shuffle = true; s3 = getParameter("one"); if(s3 != null && s3.equalsIgnoreCase("true")) one = true; d = size(); place = 0; offImage = createImage(d.width, d.height); offGraphics = offImage.getGraphics(); resize(d.width, d.height); }

public void setMyColor(Graphics g, String s) { if(s.equals("white")) { g.setColor(Color.white); return; }

Page 88: Cours De Cracking

if(s.equals("black")) { g.setColor(Color.black); return; } if(s.equals("light gray")) { g.setColor(Color.lightGray); return; } if(s.equals("gray")) { g.setColor(Color.gray); return; } if(s.equals("dark gray")) { g.setColor(Color.darkGray); return; } if(s.equals("red")) { g.setColor(Color.red); return; } if(s.equals("pink")) { g.setColor(Color.pink); return; } if(s.equals("orange")) { g.setColor(Color.orange); return; } if(s.equals("yellow")) { g.setColor(Color.yellow); return; } if(s.equals("green")) { g.setColor(Color.green); return; } if(s.equals("magenta")) { g.setColor(Color.magenta); return; } if(s.equals("cyan")) { g.setColor(Color.cyan); return; } if(s.equals("blue")) g.setColor(Color.blue); }

private String m_background; private final String PARAM_imageN = "image";

Page 89: Cours De Cracking

private final String PARAM_background = "background"; private final String PARAM_URLN = "URL"; private final String PARAM_infoN = "info"; private final String PARAM_pauseN = "pause"; private final String PARAM_zoom = "zoom"; private final String PARAM_shuffle = "shuffle"; private final String PARAM_target = "target"; private final String PARAM_pausable = "pauseable"; private final String PARAM_one = "one"; private Dimension d; private boolean running; private Image images[]; private int place; private Image offImage; private Graphics offGraphics; private boolean good; private URL locations[]; private URL myInfo; private String test_it; private final String option = "InFeb"; private InputStream input; private DataInputStream dataInput; private Thread animate; private boolean drawable; private boolean drawn; private MediaTracker imageTracker; private int image_w; private int image_h; private String info[]; private int pause[]; private int amount; private boolean zoom; private boolean shuffle; private boolean pausable; private String m_target; private int loadImage; private boolean displaying; private boolean mouseInside; private boolean one;}

-------------------------------------------End of jad file---------------------------------

Ok balaise huh ?Donc pour les prochains fichier, je ne vous montrerai que les parties importantes!Donc, vous avez jeté un oeil à la source ci-dessus, et vous avez (j'espère ;p) repéré laprotection ! Un petit keyfile à la mord-moi-le-noeud :p *grin*Donc, on cherche qq chose qui ressemble à un contrôle de fichiers:

try { myInfo = new URL(getDocumentBase(), "gboption.ini"); <--- eheheh! Nom du keyfile } catch(MalformedURLException _ex) { good = false;

Page 90: Cours De Cracking

} if(myInfo != null) try { input = myInfo.openStream(); dataInput = new DataInputStream(input); test_it = dataInput.readLine(); dataInput.close(); } catch(IOException _ex) { } if(test_it.equals("InFeb")) <--- hmm ! on dirait qu'il compare le texte dans du fichier good = true; <--- si le texte = InFeb donc c'est OK running = true; // sinon Get the fuck outta here!! if(animate == null)

w0w , ça craint! Créez un fichier nommé gboption.ini et mettez 'InFeb' dedans!!(sans les ' ' bien sûr), enregistrez ce fichier, copiez-le dans le répertoire de l'applet et lancez le fichier exemple.hml!Kewl !! Voilà le Putain D'UNREGISTERED texte a mouru lol :)Facile non ??

Part2: Goetz's Marquee V 1.1

Toujours la même chose! Keyfile based protectionDécompilez le fichier class et ouvrez-le avec notepad par exemple !

Je vous montre les parties importantes seulement, car c'est exactement la même merde!

-------------------------------------cut from gmarquee.jad-------------------------------- public void start() { if(offImage == null) { offImage = createImage(d.width, d.height); offGraphics = offImage.getGraphics(); } if(f == null) { f = new Font("Helvetica", 0, m_font); fm = offGraphics.getFontMetrics(f); } try { myInfo = new URL(getDocumentBase(), "gmoption.ini"); <---- hehe :p } catch(MalformedURLException _ex) { good = false; } if(myInfo != null)

Page 91: Cours De Cracking

try { input = myInfo.openStream(); dataInput = new DataInputStream(input); test_it = dataInput.readLine(); dataInput.close(); } catch(IOException _ex) { } if(test_it.equals("Eggplant")) <--- si le cracker a mit Eggplant jmp goodboy good = true; // sinon: jmp GET the fuck outta here :p if(!good) try { reg = new register(300, 200, "Please Register Goetz's Marquee", "http://www.lawrencegoetz.com/programs/nettools.htm", this); } catch(Exception _ex) { System.err.println("You are missing the file register.class"); return; } if(animate == null)

-----------------------------End of quotes from marquee.jad---------------------------------

Encore, créez un fichier nommé gmoption.ini et mettez 'Eggplant' dedans !(sans les ' ' ). Enregistrez les fichiers, et lancez le fichier d'exemple!Et voilà, plus de méchant Texte hehe !

C'est maintenant enregistré et vous pouvez apprécier ce petit applet java :p

Ok, assez avec ces conneries de keyfile à la mord-moi-le-noeud, regardons ce petit crackmecodé par notre ami MandKind en java!Il n'y a aucun fichier html fournis pour tester le serial, mais on n'en a pas besoin hehe!!

Ph43R !!

Comme d'hab, décompilez le fichier class, et ouvrez-le avec notepad !!On peut voir cette merde:

---------------------------------Start of CrackMe.jad--------------------------------------

public CrackMe() { }

Page 92: Cours De Cracking

public static void main(String args[]) { if(args.length != 1) { System.out.println("Usage: java CrackMe Registration Code"); System.exit(0); } System.out.println(""); System.out.println(""); System.out.println("Welcome to ManKind's Java CrackMe 0.1"); System.out.println("====================================="); System.out.println("This is an Alpha Test of ManKind's Java CrackMe, please do send your comments, suggestions, opinions, feedbacks and support words to me!"); System.out.println(""); System.out.println(""); int i = Integer.valueOf(args[0]).intValue(); if(i == 0x7f42b) System.out.println("Congratulations, you succeeded in cracking this!"); if(i != 0x7f42b) System.out.println("Sorry, invalid registration code. Please try again!"); System.out.println(""); System.out.println(""); System.out.println("This program is Copyright \251 1999 ManKind"); System.out.println("Service for Mankind"); System.out.println("[email protected]"); System.exit(0); }}

---------------------------------End of CrackMe.jad-------------------------------------------

Hehe, ça a l'air marrant!Nous voyons:

" int i = Integer.valueOf(args[0]).intValue(); if(i == 0x7f42b) System.out.println("Congratulations, you succeeded in cracking this!"); if(i != 0x7f42b) System.out.println("Sorry, invalid registration code. Please try again!"); System.out.println(""); "

En Visual Basic, ça donnerait ceci:

IF serial= $7f42b thenmsgbox "Congratulations, you succeeded in cracking this!"Elsemsgbox "Sorry, invalid registration code. Please try again!"End if

Page 93: Cours De Cracking

"0x7f42b" est en hexadécimal (0x nous le montre) mais nous voulons le bon serial donc onle convertit en décimal! Si vous avez Soft-ice chargé:

Ctrl+d? 7b42b

on voit donc: 521259

FACILE non ??

Bon, je n'ai plus d'autre fichier protégé en java, donc je m'en vais finir ce tut :-(

J'espère que le reversion du java est plus claire maintenant pour vous !!C'est quelque chose de très simple les 3/4 du temps :Bien sûr, c'est grâce au décompilateur !!

Manual Unpacking (comment unpacker, les tools, méthodes...)

Qu'est-ce que le manual unpacking ??Vous avez sûrement remarqué que certaine fois quand on désassemble un fichier,on ne trouve plus de String Data References !!!Car c'est que le fichier est crypté ou compressé !!Merde alors.... Ben il existe des unpackers me direz vous, mais c'est pasmarrant quand ça fait tout tout seul !! :-oDonc, je vais tenter de vous expliquer comment, et avec quoi décrypter les fichiers...Je vais vous montrer quelques exemples comme : ASPACK , ARMADILLO , UPX , NEOLITE ....(Note: lisez aussi le cours sur CDilla dans la section CD check)Tout d'abord qq infos sur le format PE !!

Schéma pour vous donner une idée de la bestiole ;) :(from PE.txt)

+-------------------+ | DOS-stub | +-------------------+ | file-header | +-------------------+ | optional header | |- - - - - - - - - -| | | | data directories | | | +-------------------+ | | | section headers | | | +-------------------+ | | | section 1 | | |

Page 94: Cours De Cracking

+-------------------+ | | | section 2 | | | +-------------------+ | | | ... | | | +-------------------+ | | | section n | | | +-------------------+

Je vais pas m'attarder trop sur le format lui-même, mais je vais vous donner quelquesinfos sur les sections et autres caractéristiques !!Vous avez sûrement remarqué que dans ProcDump (unpacker), il y a un PE editor (éditeurde PE) très très utile, vous le verrez plus tard...Que se passe-t-il si on édite un fichier ??On peut récupérer l'entry point, l'image base, les caractéristiques des sections ...

A propos des caractéristiques:

0x20...... : Cela Veut dire executable0x40...... : Cela Veut dire Readable (lisable)0x80...... : Cela Veut dire Writeable (écriture possible)

exemple 0x60.. -> exécutable + lisable

0x......20 : Cela Veut dire contains Code0x......40 : Cela Veut dire Initialized data0x......80 : Cela Veut dire Unitialized data

(pris d'une doc sur le PE)

Voilà, je ne vais pas faire un cours sur le PE, car mes connaissances sont plutôt limitéesà ce sujet! Je cherche donc de la doc sur le PE en français !!!J'ai vraiment pas le goût de traduire les Docs disponibles en anglais !Si quelqu'un sait où trouver ça, merci de me mailer ;-)Bon assez de blablabla, on va commencer par un cours sur ASPACK:

********************************** ASPACK **********************************

Ce tut est pour apprendre à unpacker ! Vous apprendrez les bases !!Mais je vais prendre une application, freeware, compactée avec Aspack(on s'en fout de toutes façons! hehe !!)Je ne vous montrerais que comment on retrouve les String Data Referencesdans l'app donc pas de table d'import, car ce tut a pour but de mettreà l'aise avec l'unpacking !! (pour des imports table: lisez le tut sur CDilla)Vous pourrez donc patcher le programme comme si il était normal :)

Page 95: Cours De Cracking

On a besoin de:

- Soft-ice 3.x or 4

- ProcDump 1.5 (seulement pour dumper)

Première partie: le loader!

Vous devrez utiliser le loader de SI pour décompacter, donc exécutez-le!et choisissez l'exe que vous voulez!Pour nous, ce sera : Konix.exe.Ok, exécutez-le avec le loader mais le problème c'est que cetteapplication ne veut pas s'interrompre... :(Hehe, no problem!, exécutez ProcDump et utilisez un éditeur PE!Editez la section du Code de l'exécutable.(PE editor: choisissez le fichier, sections, CODE et bouton droit "EDIT SECTION")

Ok, vous voyez dans section caracteristic : C0000040

Ok, changez-le en : E0000020

Pour des questions à propos de ce geste, lisez les infos plus haut sur lescaractéristiques des sections !!

Maintenant, exécutez le Loader de SI et ça marche! :))Super, ça a marché hehe

Deuxième partie: Tracer et dumper le fichier de la mémoire vers le disque!

Ok, donc vous avez tout juste arrêté l'exécution dans SI, vous voyez naturellementles INVALID mais ça ne pose pas de problème. Tracez avec F10 et vousarrivez ici:

XXXXXXXX PUSHAD <-- intéressant...

XXXXXXXX CALL 45A006

XXXXXXXX POP EBP

XXXXXXXX SUB EBP,43D93E

............

XXXXXXXX CALL 0045A051

XXXXXXXX CALL 0045A2B2

Page 96: Cours De Cracking

XXXXXXXX CALL 0045A350

............

XXXXXXXX POPAD <-- Très intéressant ça !!!

XXXXXXXX JMP EAX <-- Arrêtez de tracer ici !! ça saute vers le programme decrypter!

.......

Donc... quand vous décompactez vous voyez un POPAD et un JMP, regardez celuiqui jump vers un registre comme EAX, ECX, EDX...Mais le plus souvent c'est EAX!Ok, donc quand vous êtes au niveau du JMP EAX, regardez la valeur de EAX etécrivez-la sur un bout de papier: pour moi c'était: 43F0A0.Vous l'utiliserez sous peu croyez moi!! hehePour savoir si vous êtes à la bonne place, essayez de tracer avec F10 unefois et regardez si il jump vers la vraie entrée du programme.Pour nous, il l'a fait, alors c'est ok!

Maintenant, sortez de SI et réexécutez l'EXE avec le loader de SI.Et tracez jusqu'au JMP.Maintenant, tapez :

A {enter} <== pour assembler le code

JMP EIP {enter} <== c'est pour faire une boucle infinie sans avoir à dumper n'importe quoi

{escape}

F5

Maintenant le programme est en train de faire une boucle infinie en mémoireet on peut le dumper!!!Ok, exécutez ProcDump et vous voyez dans la liste les tâches en cours.Clickez sur celle contenant Konix.exe. Maintenant bouton droit et choisissezFULL DUMP. Savez le nouveau EXE avec le nom que vous voulez.ex: KonixDumped.exe

Maintenant, cliquez avec le bouton droit comme tout à l'heure maischoisissez KILL TASK au lieu de FULL DUMP sinon le programmecontinuerait sa boucle infinie!

Page 97: Cours De Cracking

Troisième partie: Fixer le point d'entrée du programme!

Ok, regardez le nouvel EXE que l'on vient de dumper et vous voyezque sa taille est plus grande que celle du fichier crypté... bien! :)Mais attendez! Si vous l'exécutez le prog va crasher comme un chien! :(

Ok... vous vous souvenez, vous avez noté le OEP (Original Entry Point) surun papier, cette valeur que vous avez trouvé dans EAX.Dans ce cas, c'était 43F0A0. Ok, exécutez ProcDump PE Editor et changezle point d'entrée en 0x0003F0A0. (OEP - the image base : 43F0A0-400000=3F0A0)

Quand je disais que ce nombre allait nous aider!! hehe

Maintenant, fermez ProcDump, et le programme compacté/cryptéCA MARCHE!!!!!!!!!!!!!!!!!!!!

Désassemblez-le !! Et oui on voit les String Data References !!! Coolon peut donc patcher et tout et tout :)

Voilà pour Aspack!! Maintenant que vous êtes déjà plus familier avec l'unpacking,on continue avec un cours sur Armadillo!! Protection commerciale avec anti debugging =)Nous allons voir comment kicker cette merde de l'exe :)

************************************************************************** Unpacker un exécutable protégé par Armadillo v1.76 ***************************************************************************

Tout d'abord voici une description d'Armadillo trouvée sur leur site officiel:

-------------------------------------------------------------------------------------------

Armadillo is a powerful software protection system. It wraps around your program like anarmored shell, defending your work from pirates and program crackers with state-of-the-art encryption, data compression, and other security features. It also allows you to add a complete software protection and registration-key system to your existing programs in five minutes or less, with no changes to your program's code! And it works with any langagethat produces a 32-bit Windows EXE file.

.....

Page 98: Cours De Cracking

Armadillo modifies your program's EXE file, using a key you select and state-of-the-art compression and encryption tools to foil any attack relying on a decompiler -- all they can decompile is the code for the Armadillo decompressor itself, not your program. Your program is decrypted in memory when it is run, after Armadillo is satisfied that it's safe to do so and that the user has a valid license (more on licenses below). This, along with some advanced snoop-detection functions, prevents most patch/bypass attacks -- it would require far more knowledge (and a great deal more work) to patch your program while it's encrypted.

-------------------------------------------------------------------------------------------

Ca a l'air cool ;P (du moins ça avait l'air heheheh)

0) Introduction:

Bon, en passant sur le site officiel où on peut downloader la version sharewared'Armadillo, j'ai vu toutes les options possibles de ce petit truc et je me suisdis que j'allais voir ça d'un peu plus près...Donc, après l'avoir installé, j'ai pris calc.exe et je l'ai crypté avec les options pardéfauts, pour voir un peu la bête ;p

1) Lancer l'exécutable avec Soft-ice chargé:

Comme vous pouvez vous en douter, les exécutables protégés disposent d'un anti Soft-iceIl y a en fait 3 détections :

- la première est très connue meltice.(Createfila \\.\SICE, \\.\NTICE and \\.\SIWDEBUG)- la seconde est connue sous le nom de:IsDebuggerPresent. On trouve l'appel à l'API getprocaddress.- et pour finir, c'est un petit int 3h :p

Comment bypasser toutes ces conneries ??

Il va falloir lancer l'exécutable avec le loader de Soft-ice. Donc charger le fichieravec le loader, et lancer le calc.exe.Soft-ice doit revenir et vous devez sûrement voir des petits: INVALIDA ce moment là, mettez votre BPX Createfilea. Pressez F5 3 fois et vous arrivez sur leschecks, qui ressemblent à ça:

Page 99: Cours De Cracking

025F:10003895 FF1520A00010 CALL [KERNEL32!CreateFileA]025F:1000389B 83F8FF CMP EAX,-01025F:1000389E 7409 JZ 100038A9 <-- ici changez-le en jmp 100038A9025F:100038A0 50 PUSH EAX025F:100038A1 FF1538A00010 CALL [KERNEL32!CloseHandle]025F:100038A7 EB0B JMP 100038B4025F:100038A9 FF1544A00010 CALL [KERNEL32!GetLastError]025F:100038AF 83F802 CMP EAX,02025F:100038B2 7404 JZ 100038B8025F:100038B4 C645FF01 MOV BYTE PTR [EBP-01],01025F:100038B8 8B4604 MOV EAX,[ESI+04]

Il faut changer le JZ 100038A9 en JMP 100038A9Pour cela il suffit de se positionner à la ligne du JZ, et ensuite tapez sous Soft-ice:A "presser entrée"JMP 100038A9 "presser entrée""presser échap"

Et voilà, la ligne est devenue un jump, maintenant on trace avec F10, et on exécute leCALL [KERNEL32!GetLastError] , après l'avoir passé on voit un CMP EAX,2.En gros il faut que EAX = 2 pour que tout soit OK, sinon c'est pas bon..Regardez dans EAX, vous verrez EAX = 2 donc c'est bon.Pressez F5, on retrouve la même chose, comparaison EAX,2 , c'est toujours bon donctout est OK.On presse une dernière fois F5 pour le dernier check, mais cette fois au moment duCMP EAX,2 on voit EAX = 32. Ce n'est donc pas bon, il faut mettre EAX à 2.Pour cela dans Soft-ice , tapez: R EAX 2Et voilà EAX passe à 2, la comparaison EAX à 2 est donc bonne, tout est OK.

Une fois ceci fait, on va s'occuper du 2ème check de Soft-ice. Il se sert deGetProcAddress, donc mettez un breakpoint dessus et pressez F5.Il suffit de presser une fois F12 pour sortir du call, et vous devez rencontrer quelque chose comme ça:

025F:XXXXXXXX XXXXXXXXXXXX CALL [KERNEL32!GetProcAddress]025F:100038ED 3BC3 CMP EAX,EBX025F:100038EF 740A JZ 100038FB <--- faites un R FL Z025F:100038F1 FFD0 CALL EAX025F:100038F3 85C0 TEST EAX,EAX025F:100038F5 7404 JZ 100038FB025F:100038F7 C645FF01 MOV BYTE PTR [EBP-01],01025F:100038FB 56 PUSH ESI025F:100038FC FF1548A00010 CALL [KERNEL32!FreeLibrary]

Vous voyez sûrement CMP EAX,EBX et le saut conditionnel juste après. Ici il fautinverser le Zero Flag et le programme va pourvoir s'exécuter normalement...Pour inverser le Zero Flag, il suffit de taper: R FL Z sous Soft-ice une foisque vous êtes à la bonne ligne.

Page 100: Cours De Cracking

A partir de maintenant, il suffit de tracer avec F10, comme un fou, et nousallons voir le fameux int3h arriver ;)Mais avant, étant donné que la version que j'ai utilisé de Armadillo n'est pasenregistrée (pas encore ;p ) , nous allons voir une messagebox qui nous le rappelleDonc cliquez sur le bouton OK, et continuez à tracer.. Ce nag screen est très simple à cracker, il suffit de mettre un ret dans le call et c'est fini, mais nous allons virer tous cette merde du fichier exécutable, doncen s'en tape !Mais, je ne peux m'empêcher de faire un petite remarque:

-------Remarque:-----------------------------------------------------------------------------

Comme vous l'avez sûrement remarqué, il est possible de protéger l'exe avec unname / serial au démarrage, ce qui peut être assez chiant à virer, car nous voulonsexécuter le programme en mémoire...Je vous racontes ça, car le fichier que nous sommes en train d'étudier ne comportepas de name / serial , j'ai packé le fichier avec les options de bases, mais en voulantcracker le nag screen, je me suis trompé de call, je suis entré dans le mauvais et j'ai mis un RET, sur un push EDI, il me semble, bref la première instruction.Ensuite, je suis sortis automatiquement du call (RET) et j'ai tracé avec F10.Tout à coup, une dialog box est apparue me demandant un name / serial !!What the fuck ? C'est quoi ce bordel, cet Armadillo me semble bizarre, mais vraiment!!Il semblerait que quoi que l'on fasse, l'exe contient la vérification nom et code.Il me semble bizarre, mais j'en conclus que ca doit âtre hyper simple à virer, juste un callà modifier, pour ne pas afficher ça, et on se retrouverais avec un exe crypté debase...Je n'ai pas eu le temps de bien regarder, mais ça peut être intéressant.Tout me pousse à dire que ces protections dites commerciales sont vraiment stupides...

-------Fin des Remarques:---------------------------------------------------------------------

Bref, revenons à nos moutons, heheOn continue donc de tracer avec F10 sans réfléchir, il faut juste contrôler le code,on cherche un "int3".Après avoir tracé, on trouve ceci:

Page 101: Cours De Cracking

025F:00402241 2401 AND AL,01025F:00402243 8885B8FEFFFF MOV [EBP-0148],AL025F:00402249 BA6D447546 MOV EDX,4675446D025F:0040224E 8995B0FEFFFF MOV [EBP-0150],EDX025F:00402254 C785C4FEFFFF260C3604MOV DWORD PTR [EBP-013C],04360C26025F:0040225E 895DFC MOV [EBP-04],EBX025F:00402261 8B85C4FEFFFF MOV EAX,[EBP-013C]025F:00402267 3385B0FEFFFF XOR EAX,[EBP-0150]025F:0040226D 8BE8 MOV EBP,EAX025F:0040226F B804000000 MOV EAX,00000004025F:00402274 CC INT 3 <----- le chtit025F:00402275 3115148D4000 XOR [00408D14],EDX025F:0040227B A180804000 MOV EAX,[00408080]025F:00402280 310584804000 XOR [00408084],EAX025F:00402286 834DFCFF OR DWORD PTR [EBP-04],-01025F:0040228A EB18 JMP 004022A4

La protection est vraiment semblable à la 1.73. Les Gars de chez Armadillo se sontpas trop foulés pour une protection sois-disant Très fiable.Bref, vous avez sûrement remarqué le "MOV EAX, 00000004".Pour passer ce contrôle, il suffit de se mettre à la ligne du MOV.Dans Soft-ice, tapez:A "entrée"JMP 0 "entrée""échap"

Voilà, nous venons de remplacer le mov eax,4 en un jmp 0.Ceci va provoquer une exception et le programme va croire que le débugger (Soft-ice)n'est pas chargé, donc ce qui va s'occuper de l'exception et le programme se lance!!Nous avons donc calc.exe chargé, on peut s'en servir normalement.

2) Virer complètement Armadillo de l'exécutable protégé:

A) Récupérer et dumper ce dont nous avons besoin:

C'est cette partie qui m'a posée le plus de probs, car j'avais une erreur au momentde reconstruire un exécutable valide ;(J'ai recommencé plusieurs fois, et voilà comment je me suis pris.

(Ayant demandé de l'aide sur le forum de l'ATP team, j'ai donc lus leur cours, maméthode semble être celle qu'utilise Alsindor, mais Artex utilise une approchedifférente, donc je vous recommande de lire leur superbe cours sur MP3Wizard V1.2 parPsyché, Artex et Alsindor... J'ai trouvé mon erreur de toute façon, je n'utilisaispas la bonne taille de section ".text". (Leur cours est basé sur Armadillo 1.0 je crois)

Donc, vous avez votre programme qui est lancé, si vous regardez dans le répertoire

Page 102: Cours De Cracking

courant (où a été lancé le fichier exe, on trouve un fichier temporaire)Copiez ce fichier, il va nous servir.Ensuite, lancez ProcDump et regarder dans la liste des process, vous devez voirle fichier calc.exe, mais aussi le temporaire.Faites un click droit dessus (on veut dumper le fichier TEMP !! pas l'exe) et faitesun dump full.Nous avons donc un fichier exécutable sur le disque, c'est le dump, et nousavons encore le fichier temp récupéré dans le répertoire où a été lancé le programmecrypté.

B) Faire un exécutable qui marche, et qui n'ai plus de Armadillo ;)

Si vous renommer le fichier temporaire en exécutable et que vous l'exécutez, il va crasher!C'est normal car dans la première Section, on se rend compte qu'elle est pleine de "XX".Hmm, si on lance le fichier dumpé, il ne marche pas non plus et crash comme un goret ;)

GogogadgetauProcDump lol, vous l'avez compris, lancez ProcDump et servez-vous du PE editorpour éditer le fichier dump, vous devez voir les sections du fichier. Il faut regarderla première !

Pour ma part, j'avais ceci:

- pour la section ".text" :

Virtual Offset: 00001000 Raw Size: 11A0E Raw Offset: 1000

Ok, gardez ces chiffres en tête nous allons y revenir!!Avec ProcDump, click droit sur la section "text" et faites saves to file pour dumperle fichier dur le disque ! (exemple: text.bin). Car cette section est complètement décryptée tandis que le fichier temporaire contient des XX. En effet Armadillo ré-"écrit" la sectionà la volée ..Une fois le fichier dumpé sur le disque, ouvrez votre fichier exe (le fichier Temp renomé)avec un éditeur hexadécimal, j'utilise HexWorkshop pour cela. Ouvrez également la sectionque vous avez dumpé.

Maintenant dans HexWorkshop, pressez alt+f5, entrez le Raw offset de la section que vous voulez importer. Ici : 1000 et cliquez sur ok. Allez dans le menu Edit, et cliquezsur "select block" entrez la longeur (size) de la section , ici : 11A0E...

Page 103: Cours De Cracking

Regardez le fichier ouvert (text.bin) et pressez 'ctrl+a' pour tout sélectionner,copiez tout ça avec 'ctrl+c'.Retournez dans la fenêtre principale de l'exécutable dans HexWorkshop (celui que vous avez renommé l'ex-fichier temporaire donc), et collez ce que vous venez de copier dans le presse papier, faites: 'ctrl+v' ou menu Edit et paste.Enregistrez votre fichier, et vous avez maintenant une section '.text' valable qui necontient donc plus de "XX" hehe...Lancez votre exécutable et oh !! Miracle cela marche !!

Mais pour être sûr que le fichier marche bien, on peut reconstruire le PE avec ProcDump,cela ne coûte rien de toutes manière :

- Lancez ProcDump (Merci G-RoM :)Allez dans les Options et sélectionnez:

[X]Recompute Object Size[X]Optmize PE Structure

[X] Use actual import infoset cliquer sur OK

Cliquez sur Rebuild PE, et cherchez notre nouveau fichier (calc_finis.exe pour nous)

ProcDump nous fais une valide import table et notre exécutable est désormais plus sûr ;o)

Voilà !! J'ai d'ailleurs programmé un unpacker avec un pote pour ArmadilloIl sera disponible sur mon site d'ici quelque temps !! (qd j'aurais le goût lol)

Notes supplémentaires sur les PACKERS:

Pour unpacker neolite, c'est vraiment très ressemblant avec Aspack !!Donc tracez et cherchez pour un JMP EAX (si mes souvenirs sont bons !!!)Bref rien de bien dur, ca s'unpack les doigts dans le nez ;-Dhihihihihi! donc pour UPX !!

UPX utilise un JUMP fixe (JUMP 401000) , il suffit de le trouver et de dumper,je ne vais pas écrire des cours sur tout les packers lol !!Il existe déjà pas mal de cours sur l'unpacking sur le net si vraiment cela ne voussuffisait pas!!

Checksum

Imaginez que vous venez de cracker une messagebox en mémoire ou autre merdes et que après avoir modifié le programme en hexa, le fichier ne se lance plusdu tout, mais quitte directe !! Ou encore qu'il vous dise: "CRC ERROR blablablaa"

Page 104: Cours De Cracking

Et là vous dites!! Merde!!!!! C'est quoi ce bordel! Je peux même pas patcher ;(Alors soit vous utilisez un mem patcher (patch qui ne patch qu'en mémoire donc le programmeest tjs intacte, mais a besoin d'être lancé avec ça) soit vous réfléchissez :)

Ca peut très bien être plusieurs choses en fait !!

On va commencer par le checksum !C'est quoi ? En fait, le programme fait une somme des valeurs ascii du programme et les comparesà une constante par exemple!Et tant que c'est égal à cette constante, le programme se lance sans broncher!Mais vous, vous venez de patcher avec des NOP, je, JMP ou autres !!et ces instructions n'ont pas le même poids !

exemple à 2 francs:

Il y avait un:

JE XXXXXXXXXX

et vous l'avez remplacé par un JNE (BEURK, mais ça sera plus simple pour kicker lechecksum).

On dira que ça ressemblait à ça en hexa:

7428 (pour le "je") == 74h + 28h = 9Ch = 156

donc 156 en décimal !! et vous avez patché en JNE:

7528 (pour le "jne") == 75h + 28 h = 9Dh = 157

157 est différent de 156 donc en additionnant tout les octets un à un, le programme trouveraune différence et ne se lancera PAS :)Comment contourner ça ?

Ben, moi je modifierais ça en :

7527 = 75h + 27h = 9Ch = 156

On s'en fou de la valeur après le jne car il ne sautera pas!!et le résultat est donc égal à 156 et il croit que tout est OK :PBref c'est tout con mais ça marche très bien !Si par bonheur le programme vous annonce que le fichier avait été modifié, pas la peinede jouer avec les octets comme ça mais désassemblez le fichier plutôt et regardezdans les String Data References le message qu'il nous donnait et crackez moi ça siou plait ;p

Il peut y avoir aussi un CRC, c'est plus compliqué et je ne vais pas expliquer le fonctionnementde celui-ci ;)Il utilise une table qui est la suivante pour les programmes en Win32:

Page 105: Cours De Cracking

CRC-32 Table

00h 00000000 77073096 EE0E612C 990951BA

04h 076DC419 706AF48F E963A535 9E6495A3

08h 0EDB8832 79DCB8A4 E0D5E91E 97D2D988

0Ch 09B64C2B 7EB17CBD E7B82D07 90BF1D91

10h 1DB71064 6AB020F2 F3B97148 84BE41DE

14h 1ADAD47D 6DDDE4EB F4D4B551 83D385C7

18h 136C9856 646BA8C0 FD62F97A 8A65C9EC

1Ch 14015C4F 63066CD9 FA0F3D63 8D080DF5

20h 3B6E20C8 4C69105E D56041E4 A2677172

24h 3C03E4D1 4B04D447 D20D85FD A50AB56B

28h 35B5A8FA 42B2986C DBBBC9D6 ACBCF940

2Ch 32D86CE3 45DF5C75 DCD60DCF ABD13D59

30h 26D930AC 51DE003A C8D75180 BFD06116

34h 21B4F4B5 56B3C423 CFBA9599 B8BDA50F

38h 2802B89E 5F058808 C60CD9B2 B10BE924

3Ch 2F6F7C87 58684C11 C1611DAB B6662D3D

40h 76DC4190 01DB7106 98D220BC EFD5102A

44h 71B18589 06B6B51F 9FBFE4A5 E8B8D433

48h 7807C9A2 0F00F934 9609A88E E10E9818

4Ch 7F6A0DBB 086D3D2D 91646C97 E6635C01

50h 6B6B51F4 1C6C6162 856530D8 F262004E

54h 6C0695ED 1B01A57B 8208F4C1 F50FC457

Page 106: Cours De Cracking

58h 65B0D9C6 12B7E950 8BBEB8EA FCB9887C

5Ch 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65

60h 4DB26158 3AB551CE A3BC0074 D4BB30E2

64h 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB

68h 4369E96A 346ED9FC AD678846 DA60B8D0

6Ch 44042D73 33031DE5 AA0A4C5F DD0D7CC9

70h 5005713C 270241AA BE0B1010 C90C2086

74h 5768B525 206F85B3 B966D409 CE61E49F

78h 5EDEF90E 29D9C998 B0D09822 C7D7A8B4

7Ch 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD

80h EDB88320 9ABFB3B6 03B6E20C 74B1D29A

84h EAD54739 9DD277AF 04DB2615 73DC1683

88h E3630B12 94643B84 0D6D6A3E 7A6A5AA8

8Ch E40ECF0B 9309FF9D 0A00AE27 7D079EB1

90h F00F9344 8708A3D2 1E01F268 6906C2FE

94h F762575D 806567CB 196C3671 6E6B06E7

98h FED41B76 89D32BE0 10DA7A5A 67DD4ACC

9Ch F9B9DF6F 8EBEEFF9 17B7BE43 60B08ED5

A0h D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252

A4h D1BB67F1 A6BC5767 3FB506DD 48B2364B

A8h D80D2BDA AF0A1B4C 36034AF6 41047A60

ACh DF60EFC3 A867DF55 316E8EEF 4669BE79

B0h CB61B38C BC66831A 256FD2A0 5268E236

B4h CC0C7795 BB0B4703 220216B9 5505262F

B8h C5BA3BBE B2BD0B28 2BB45A92 5CB36A04

Page 107: Cours De Cracking

BCh C2D7FFA7 B5D0CF31 2CD99E8B 5BDEAE1D

C0h 9B64C2B0 EC63F226 756AA39C 026D930A

C4h 9C0906A9 EB0E363F 72076785 05005713

C8h 95BF4A82 E2B87A14 7BB12BAE 0CB61B38

CCh 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21

D0h 86D3D2D4 F1D4E242 68DDB3F8 1FDA836E

D4h 81BE16CD F6B9265B 6FB077E1 18B74777

D8h 88085AE6 FF0F6A70 66063BCA 11010B5C

DCh 8F659EFF F862AE69 616BFFD3 166CCF45

E0h A00AE278 D70DD2EE 4E048354 3903B3C2

E4h A7672661 D06016F7 4969474D 3E6E77DB

E8h AED16A4A D9D65ADC 40DF0B66 37D83BF0

ECh A9BCAE53 DEBB9EC5 47B2CF7F 30B5FFE9

F0h BDBDF21C CABAC28A 53B39330 24B4A3A6

F4h BAD03605 CDD70693 54DE5729 23D967BF

F8h B3667A2E C4614AB8 5D681B02 2A6F2B94

FCh B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D

Voici un exemple trouvé sur comment utiliser cette table!Je ne vais pas expliquer, je donne ça juste pour ceux qui en veulent tjs plus !Car il existe déjà un super tut sur les CRC ! En anglais mais très cool qd même:*CRC and how to Reverse it* by Anarchriz/DREAD (www.dread.cjb.net <-- pas trop sûr)Mais vous trouverez un lien vers ce site sur ma page sans problème si ce n'est pas la bonne.

// les sources********************************************************************************************

{-------------------------------------------------------------

Page 108: Cours De Cracking

This unit is freeware. I found it somewhere on CIS, I think. Peter Tiemann -------------------------------------------------------------}Unit Crc32;

interface

uses Dialogs, SysUtils, WinTypes, WinProcs;

function UpdateCRC32(InitCRC: LongInt; Buffer: Pointer; BufferLength: WORD): LongInt;function ComputeFileCRC32(const FileName: string): LongInt;

implementation

type CRCTable = Array[0..255] of LongInt;

const BufferLength = 16384; CRC32Table: CRCTable = ( $000000000, $077073096, $0ee0e612c, $0990951ba, $0076dc419, $0706af48f, $0e963a535, $09e6495a3, $00edb8832, $079dcb8a4, $0e0d5e91e, $097d2d988, $009b64c2b, $07eb17cbd, $0e7b82d07, $090bf1d91,

$01db71064, $06ab020f2, $0f3b97148, $084be41de, $01adad47d, $06ddde4eb, $0f4d4b551, $083d385c7, $0136c9856, $0646ba8c0, $0fd62f97a, $08a65c9ec, $014015c4f, $063066cd9, $0fa0f3d63, $08d080df5,

$03b6e20c8, $04c69105e, $0d56041e4, $0a2677172, $03c03e4d1, $04b04d447, $0d20d85fd, $0a50ab56b, $035b5a8fa, $042b2986c, $0dbbbc9d6, $0acbcf940, $032d86ce3, $045df5c75, $0dcd60dcf, $0abd13d59,

$026d930ac, $051de003a, $0c8d75180, $0bfd06116, $021b4f4b5, $056b3c423, $0cfba9599, $0b8bda50f, $02802b89e, $05f058808, $0c60cd9b2, $0b10be924, $02f6f7c87, $058684c11, $0c1611dab, $0b6662d3d,

$076dc4190, $001db7106, $098d220bc, $0efd5102a, $071b18589, $006b6b51f, $09fbfe4a5, $0e8b8d433, $07807c9a2, $00f00f934, $09609a88e, $0e10e9818, $07f6a0dbb, $0086d3d2d, $091646c97, $0e6635c01,

$06b6b51f4, $01c6c6162, $0856530d8, $0f262004e, $06c0695ed, $01b01a57b, $08208f4c1, $0f50fc457, $065b0d9c6, $012b7e950, $08bbeb8ea, $0fcb9887c, $062dd1ddf, $015da2d49, $08cd37cf3, $0fbd44c65,

$04db26158, $03ab551ce, $0a3bc0074, $0d4bb30e2, $04adfa541, $03dd895d7, $0a4d1c46d, $0d3d6f4fb, $04369e96a, $0346ed9fc, $0ad678846, $0da60b8d0, $044042d73, $033031de5, $0aa0a4c5f, $0dd0d7cc9,

$05005713c, $0270241aa, $0be0b1010, $0c90c2086,

Page 109: Cours De Cracking

$05768b525, $0206f85b3, $0b966d409, $0ce61e49f, $05edef90e, $029d9c998, $0b0d09822, $0c7d7a8b4, $059b33d17, $02eb40d81, $0b7bd5c3b, $0c0ba6cad,

$0edb88320, $09abfb3b6, $003b6e20c, $074b1d29a, $0ead54739, $09dd277af, $004db2615, $073dc1683, $0e3630b12, $094643b84, $00d6d6a3e, $07a6a5aa8, $0e40ecf0b, $09309ff9d, $00a00ae27, $07d079eb1,

$0f00f9344, $08708a3d2, $01e01f268, $06906c2fe, $0f762575d, $0806567cb, $0196c3671, $06e6b06e7, $0fed41b76, $089d32be0, $010da7a5a, $067dd4acc, $0f9b9df6f, $08ebeeff9, $017b7be43, $060b08ed5,

$0d6d6a3e8, $0a1d1937e, $038d8c2c4, $04fdff252, $0d1bb67f1, $0a6bc5767, $03fb506dd, $048b2364b, $0d80d2bda, $0af0a1b4c, $036034af6, $041047a60, $0df60efc3, $0a867df55, $0316e8eef, $04669be79,

$0cb61b38c, $0bc66831a, $0256fd2a0, $05268e236, $0cc0c7795, $0bb0b4703, $0220216b9, $05505262f, $0c5ba3bbe, $0b2bd0b28, $02bb45a92, $05cb36a04, $0c2d7ffa7, $0b5d0cf31, $02cd99e8b, $05bdeae1d,

$09b64c2b0, $0ec63f226, $0756aa39c, $0026d930a, $09c0906a9, $0eb0e363f, $072076785, $005005713, $095bf4a82, $0e2b87a14, $07bb12bae, $00cb61b38, $092d28e9b, $0e5d5be0d, $07cdcefb7, $00bdbdf21,

$086d3d2d4, $0f1d4e242, $068ddb3f8, $01fda836e, $081be16cd, $0f6b9265b, $06fb077e1, $018b74777, $088085ae6, $0ff0f6a70, $066063bca, $011010b5c, $08f659eff, $0f862ae69, $0616bffd3, $0166ccf45,

$0a00ae278, $0d70dd2ee, $04e048354, $03903b3c2, $0a7672661, $0d06016f7, $04969474d, $03e6e77db, $0aed16a4a, $0d9d65adc, $040df0b66, $037d83bf0, $0a9bcae53, $0debb9ec5, $047b2cf7f, $030b5ffe9,

$0bdbdf21c, $0cabac28a, $053b39330, $024b4a3a6, $0bad03605, $0cdd70693, $054de5729, $023d967bf, $0b3667a2e, $0c4614ab8, $05d681b02, $02a6f2b94, $0b40bbe37, $0c30c8ea1, $05a05df1b, $02d02ef8d);

var Buffer: Array[1..BufferLength] of Byte;

{$ifndef WIN32}type DWORD = longint;{$endif}

function UpdateCRC32(InitCRC: LongInt; Buffer: Pointer; BufferLength: WORD): LongInt;var crc: LongInt; index: integer; i: integer;begin crc := InitCRC; for i := 0 to BufferLength-1 do

Page 110: Cours De Cracking

begin index := (crc xor Integer(Pointer(DWORD(Buffer)+i)^)) and $000000FF; crc := ((crc shr 8) and $00FFFFFF) xor CRC32Table[index]; end; Result := crc;end;

function ComputeFileCRC32(const FileName : string): LongInt;var InputFile: File; Crc32: LongInt; ResultLength: Integer; BufPtr: Pointer;begin BufPtr := @Buffer; Assign(InputFile, FileName); Reset(InputFile, 1); Crc32 := $FFFFFFFF; { 32 bit crc starts with all bits on } Repeat BlockRead(InputFile, Buffer, BufferLength, ResultLength); Crc32 := UpdateCrc32(Crc32, BufPtr, ResultLength); Until Eof(InputFile); Close(InputFile); Crc32 := Not(Crc32); { Finish 32 bit crc by inverting all bits } Result := CRC32;end;

end.

// fin des sources********************************************************************************************

Cette source est freeware, c'est juste pour vous montrer un exemple d'utilisation!Elle ne vient pas de moi non plus comme vous avez pu le voir...

Ce qui peut nous faire chier aussi est le Test du nombre de NOP!!En effet il est possible qu'un programme se scan à la recherche de NOPs trop répétitifdonc une façon "d'effacer" est de mettre des INC et des DEC !!exemple:

7428 --> 9090 (le nop de base)7428 --> 4041 (INC , DEC)

Cela ne fait rien de mal et ça a effacé le saut !! et on a pas utilisé de nops :)Mais il faut tjs incrémenter autant de fois que vous décrémentez !!Si on avait eu 5 bits à patcher : 4041404190Un seul nop passera si le programme cherche au minimum 2 ou 3 nops consécutifs!

Voilà, je ne sais plus trop quoi ajouter sur la partie des checksums!!

Anti Soft-ice

Page 111: Cours De Cracking

Bon, je ne vais pas m'attarder sur ce chapitre non plus !! car il existedéjà un SUPERBE tool pour cacher Soft-ice! FrogsICE par +Frog's Print !On trouve dedans de la Doc sur les méthodes de détection donc, je ne sauraisque vous incitez à télécharger ce magnifique programme !!Désolé si je ne détaille pas des masses cette partie, mais ça fait déjà 4 jours queje suis malade et ça va pas super :'(

Je vais juste vous présenter les détections les plus courantes :

* Melt ice:

La méthode utilisée pour détecter Soft-ice est la suivante:il utilise l'API createfilea "afin de détecter le VXD" !Désolé, je ne sais pas trop comment expliquer:il peut détecter Soft-ice avec: SICE, SIWVID pour win9x et NTICE pour winNT

BOOL IsSoftIce95Loaded(){ HANDLE hFile; hFile = CreateFile( "\\\\.\\SICE", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if( hFile != INVALID_HANDLE_VALUE ) { CloseHandle(hFile); return TRUE; } return FALSE;}

// Pris de la doc de Frogsice

Voici 1 exemple en Delphi de comment programmer ca:

**********************************************************************************************procedure DetectICE;var ACiD:Thandle; s,s2:string;

begin

s:='\' + '\' + '.' + '\' + 'S' + 'I' + 'C' + 'E'; s2:='\\.\SICE'; if s <> s2 then begin ShowMessage('NO PATCH'); ExitProcess(0); end ; ACiD:=CreateFileA(PChar(s2),GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

Page 112: Cours De Cracking

if ACiD <> INVALID_HANDLE_VALUE then begin ShowMessage('Kick Soft-ice and come back ! =)'); ExitProcess(0); end ;

s:='\' + '\' + '.' + '\' + 'N' + 'T' + 'I' + 'C' + 'E'; s2:='\\.\NTICE'; if s <> s2 then begin ShowMessage('NO PATCH'); ExitProcess(0); end ; ACiD:=CreateFileA(PChar(s2),GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); if( ACiD <> INVALID_HANDLE_VALUE ) then begin ShowMessage('Kick Soft-ice and come back ! =)'); ExitProcess(0); end;

end;

**********************************************************************************************

Voilà, vous voyez ça ressemble bcp à ce qu'on a plus haut !!Donc comment cracker ça maintenant ?

Très simple, vous mettez un bpx createfilea.Vous lancez le programme protégé et vous devez arriver sous Soft-ice!!F12 une fois et vous devez trouver qq chose qui ressemble à ça:

XXXXXXXX FF1520A00010 CALL [KERNEL32!CreateFileA]XXXXXXXX 83F8FF CMP EAX,-01 <- si EAX= -1 Soft-ice n'est pas chargéXXXXXXXX 7409 JZ 100038A9 <-- ça saute vers le programme :)

Donc si on veut le lancer quoi qu'il arrive, on remplace le "JZ" en "JMP" et on n'en parleplus :)

Encore une fois, allez voir la doc de frogsICE qui vous donne des info complémentaires.Je ne suis pas là pour "pomper" les autres donc, je ne le mettrai pas ici :P

* détection par INT 68h:

mov ah,43h int 68h cmp ax,0F386h jz Soft_ice_est_la_:P

Voilà à quoi ressemble le monstre ;P

Un petit exemple de programmation en Delphi :

*****************************************************************************************

Page 113: Cours De Cracking

procedure INT68;label Ure_Good_Guy;label I_Got_You;

Begin

asmmov ah,43hint 68hcmp ax,0f386hjz I_Got_Youjmp Ure_Good_Guy

end;

I_Got_You:showmessage('Soft-ice est chargé!!');

Ure_Good_Guy:// Gentil lol pas de Soft-ice (ou je me suis fait cracker *g*)

end;

end.

******************************************************************************************

Il existe différentes façons de cracker ça:

On ne peut pas mettre de Bpint sur 68, voici une façon de contourner:

BPX exec_int if ax==68

Il existe d'autres façons, mais je ne m'en rappelle plus actuellement :'(Je dois retrouver mes notes, donc cette partie sera remise à jour plus tard (lol on diraitKrosoft ;)

Donc après avoir breaker sous Soft-ice grâce à ce BPX, on va trouver un code qui ressembleà ça:

XXXXXXXX mov ah,43hXXXXXXXX int 68hXXXXXXXX cmp ax,0f386hXXXXXxXX je XXXXXXXX <--- saute au mauvais endroit (BAD CRACKER SICE LOADED)XXXXXXXX jmp XXXXXXXX <-- Gentil cracker !! on se sert pas de Soft-ice lol

Ben vous pouvez noper le je par exemple et il sautera tjs au bon endroit !!sans jamais se douter que Soft-ice est chargé :]

* détection par Int 3 (cherche la signature de boundcheck dans Soft-ice)

Page 114: Cours De Cracking

mov ebp, 04243484Bh ; 'BCHK' mov ax, 04h int 3 cmp al,4 jnz Soft_ice_est_la_:P

On retrouve une détection par int3 dans Armadillo aussi :

025F:00402243 8885B8FEFFFF MOV [EBP-0148],AL025F:00402249 BA6D447546 MOV EDX,4675446D025F:0040224E 8995B0FEFFFF MOV [EBP-0150],EDX025F:00402254 C785C4FEFFFF260C3604MOV DWORD PTR [EBP-013C],04360C26025F:0040225E 895DFC MOV [EBP-04],EBX025F:00402261 8B85C4FEFFFF MOV EAX,[EBP-013C]025F:00402267 3385B0FEFFFF XOR EAX,[EBP-0150]025F:0040226D 8BE8 MOV EBP,EAX025F:0040226F B804000000 MOV EAX,00000004025F:00402274 CC INT 3 <----- le chti INT :p025F:00402275 3115148D4000 XOR [00408D14],EDX025F:0040227B A180804000 MOV EAX,[00408080]025F:00402280 310584804000 XOR [00408084],EAX025F:00402286 834DFCFF OR DWORD PTR [EBP-04],-01025F:0040228A EB18 JMP 004022A4

On se met sur le "MOV EAX, 00000004"Pour passer ce contrôle, il suffit de se mettre à la ligne du MOV.Dans Soft-ice, tapez:A "entrée"JMP 0 "entrée""échap"

C'était juste un exemple....

Pour en revenir à notre code de base pour la détection par int 3, il suffit ausside jouer avec le saut conditionnel pour résoudre tout nos probs :]Pas besoin de vous faire un dessin je pense!

Voilà, je vous ai décrit (très vite) les 3 détections de Soft-ice que je rencontredans les programmes!Elles sont très courantes!Je vous conseille donc encore une fois d'aller lire la documentation fournie avec FrogsICEafin d'en apprendre plus!! Je suis pas là pour faire du copier / coller lol

Frog's Print

Ici se termine la partie anti Soft-ice...

Divers :

Page 115: Cours De Cracking

********************************************************************* Changer l'image d'un programme en Delphi par exemple *********************************************************************

Cette partie est juste à but éducatif!!J'ai pris mon dernier crackme en Delphi qui contient une image de fond!Et je me suis dit, comment faire pour modifier cette image si on a pas les sourceset sans utiliser de compilateur, décompilateur ou autres éditeurs de ressources !

Voici la méthode!

tool nécessaire: Editeur hexadécimal: HexWorkshop

Ouvrez le fichier dont vous vous voulez changer l'image de fond avec votre éditeurhexa.L'image est soit au format BMP ou JPEG!Le genre le plus couramment utilisé est le jpeg car il prends moins de placeet dans mon crackme, j'ai mis un JPEG aussi ...Bref ouvrez un fichier jpg avec votre éditeur hexadécimal pour regardez par quoi il commenceet par quoi il finit!

Exemple d'un fichier JPEG édité en mode hexadécimal:

FFD8 FFE0 0010 4A46 4946 0001 0100 0001 ......JFIF......0001 0000 FFDB 0043 0005 0304 0404 0305 .......C........0404 0405 0505 0607 0C08 0707 0707 0F0B ................0B09 0C11 0F12 1211 0F11 1113 161C 1713 ................141A 1511 1118 2118 1A1D 1D1F 1F1F 1317 ......!.........

......

Si on ouvre plusieurs fichiers jpeg on se rends compte que le début est tjs le même!Ils commencent tjs par : FFD8 FFE0 0010 4A46 4946

Si on regarde la fin d'un fichier JPEG on voit ceci:

777F A758 0937 097F A99F 81E5 3FFF D900 w..X.7......?..

On voit que ça finis par FFD9 (le 00 n'est pas très important)

Donc on se dit, si on cherchait ces infos dans le fichier où est l'imageà changer!!Alors on fait une recherche des octets suivant: FFD8 FFE0 0010 4A46 4946et on trouve ca a l'offset: 64C2Aon le note sur un papier au cas ou !! et on cherche: FFD9 et on trouve çaà l'offset: 70A65

Page 116: Cours De Cracking

70A66 - 64C2A = BE3Ch = 48700 en décimal

C'est la longueur de l'image!! Donc celle qu'on veut insérer doit être inférieureà cette taille !!Je cherche sur mon disque dur un de mes logos et je l'ouvre avec mon éditeur hexa !(en JPEG aussi l'image à insérer)Ensuite je sélectionne tout les octets de l'image avec HexWorkshop (Ctrl+A) et je fais uncopier: ctrl + C ... ( après avoir fait sélectionner tout, je vois en bas le nombre d'octetsde l'image à insérer -> sel: 4f2fh )Je me remet à la fenêtre HexWorkshop qui s'occupe de mon crackme et je vais àl'offset où l'image commence: 64C2AEt là dans le menu edit, select block, j'entre la longueur de l'image entrée en hexa !Il sélectionne dans l'ancienne image la place que va prendre la nouvelle image!Ensuite on fait coller (Ctrl+V) et si il vous pose un question répondez oui!! ou OKl'image est plus petite donc il reste un morceau de l'ancienne mais on s'en fous pas mal car ce qu'on vient de coller contient le code qui dit que l'image est finie: FFD9On sauvegarde notre fichier, et on relance! Youpi!! on a maintenant une nouvelle image dans mon crackme !! hehe c'est marrant et trèssimple à faire !!

Vous pouvez faire ça avec des images GIF, BMP ou autres !!

Just for knowledge purpose ;]

Greetings :

Group greetings: ID - ECLiPSE - CiA - ODT - EXEC - PWA - PC - UCF- CORE - CC - Nova2000 - PDM

Also greetingz to: (no specific order)

Victoria , R!SC , ^INFeRNo^ , AB4DS , Cyber Blade , Klefz , Volatility ,TORN@DO , T4D , Jeff , [Virus] , JaNe , Appbusta , Duelist , tKC , BuLLeT ,Lucifer48 , MiZ , DnNuke , Bjanes , Skymarshall , afkayas , elmopio ,SiFLyiNG , Fire Worx , CrackZ , neural_en , WarezPup , _y , SiONIDE ,SKORPIEN , Lazarus , Eternal_Bliss , Magic Raphoun , DEZM , Bisoux ,Carpathia , K17 , theMc , noos , Xmen , TeeJi , JB007 , Arobas , T0AD , ytc ,Kwai_lo , Killer_3K , TaMaMBoLo , gizmo , Gota , ExtaBrain , Alpine ,WarezPup , zoltan , [yAtes] , TarGon , Icecream , Punkguy2 , Sortof ,TRDdonjuan , Lord Soth , Judged , G-Rom , Quantico , Christal , psike , Leo0n ,Albator , +Spath , +Frog's Print , toutim , Pulsar , Night , psike , Uno , F|SH ,Lixus , LosT , RD-116 , Ben0 , Whizkid , [MandKind] , alpine , Alsindor ,

Page 117: Cours De Cracking

Stone , Elraizer , reverser+ , Iczelion , nody , Asphalt , Rhythm ,rudeboy , X-Calibre , Cirus , shaoni......"Mettez votre nom là! :P" ...

J'ai sûrement oublié des tonnes de noms, désolé ;)

Conclusion :

Et voilà ainsi se termine ce *petit* cours de cracking ;)J'espère avoir été assez précis dans mes explications ainsi que mes exempleset que ce cours vous a apporté quelque chose ...Ce tut n'a aucune prétention si ce n'est d'exister, les commentaires et appréciationssont donc les bienvenues...Certaines parties n'ont pas été développées car, je ne veux pas écrire un coursde 1000 pages quand même.J'ai été assez malade ces derniers temps, alors si il y a des petites erreurs,ou oublis, merci de m'avertir !Pour toutes remarques, critiques, encouragements: [email protected]

Bonne année et bon bugs :P

TUTORIAL DEDICATED TO: Victoria (You rule baby and you own me :P )

"Mess with the best, die like the rest..."

MAIL ME CRACKS REQUESTS

AND I

^ | | @#####@ (### ###)-. .(### ###) \ / (### ###) ) (=- .@#####@|_--" /\ \_|l|_/ (\(=-\ |l| / \ \.___|l|___/ /\ |_| /(=-\._________/\ \ / \._________/ # ---- # # __ # \########/

SHOOT YOU

Page 118: Cours De Cracking

Tutorial par ACiD BuRN [Immortal Descendants ]

"Je crois que je vais aller dormir now :)"

Copyright 1999 ACiD BuRN and the Immortal Descendants (c) All rights reversed :)ACiD BuRN's home page