Vous êtes sur la page 1sur 53

Tutorial de Cracking

(1 Mon objectif :
ime

Partie)

tout vous expliquer de A Z pour que vous puissiez comprendre comment fonctionne le Cracking. Il va falloir que vous lisiez bien tout attentivement de faon bien comprendre le cours...

Qu'est ce qu'un crack ? Un crack, est un ch'tit programme qui va modifier certains octets certains emplacements du fichier cible de faon jouer votre jeux prfr sans CD par exemple. Mais bon, passons aux choses srieuses, pour le crack qui suit, certaines fonctions ne seront pas expliques du fait de leurs complxites pour les dbutants. (tout les bons cracker l'ont ts un jour ;)

Pour faire votre premier crack, on a choisi un programme super fastoche cracker pour vous montrer un truc super classique, le saut conditionnel ;)) Comme son nom l'indique, un saut conditionnel, est un passage du programme en assembleur qui fait que, si une condition est remplie ou non, un " saut "vers la suite du programme d'effectue ou non. Par exemple, une barre de dfilement s'active a condition que vous cliquiez avec le bouton de gauche de la souris...Ainsi, le bouton droit n'aura aucun effet...

Voici le prog choisi; Start Clean v1.2 (cliquez ici) Ce programme sert supprimer les raccourcis qui ne menent nul part dans le menu Dmarrer. Tout d'abord, il faut un logiciel, qui s'appelle un dsassembleur. Comme son nom l'indique, il sert dsassembler un fichier de faon le rendre lisible et plus tard comprhensible. Pour ma part, j'utilise WinDasm 8.9 facile trouver sur le net :) Il faut aussi se qu'on appelle un diteur hxadcimal. Comme son nom l'indique aussi, il sert faire apparaitre un fichier sous forme hxadcimal pour pouvoir remplacer un octet par un autre, de faon a pouvoir quand mme executer le prog aprs modification(s) prcise(s). Mon prfer est HexWorks 3.X, mais il y a ausi WinHex 10.2 ...N'importe quel diteur hexadecimal fera l'affaire :) Enfin, il vous faudra dans tous les cas (enfin presque) un cerveau rveill et en tat de marche ;)
Bon, passons au crack D'abord, lancez StartClean. Au dmarrage, une fentre s'affiche pour pouvoir s'enregistrer. Mais le blm c'est que vouz avez peut tre pas que ca faire d'envoyer des tunes, d'ou le crack ;)

Donc, pour pouvoir voir le programme de faon lisible, il faut l'ouvrir avec un dsassembleur :) Avant tout, faite une copie de StartClean.exe Lancez WinDasm... Comme c'est le premier lancement de WinDasm, il faut choisir la fonte par default que l'on va utiliser...Faites : Disassembler =>Font... => Select Font =>... Et pour sauvegarder la fonte choisie, faite : Disassembler => Font => Save Default Font. Allez cherchez ensuite la copie du fichier executable STARTCLN.EXE de la faon suivante : Disassembler => Open File to Disassemble...; double-cliquer sur la copie de startcln.exe
Ouch ! Ben ouais, c'est ca l'assembleur ;) Ce sont de petites instructions qui s'enchanent pour former un tout, un programme.

L'assembleur est le language de programmation le plus bas. Quand vous programmez que se soit en Delphi ou en C, tout est traduit en assembleur pour que votre prog soit comprhensible par l' ordinateur, car ne l'oublions pas l'assembleur, c'est le language machine par exellence. Ses avantages rsident dans le fait qu'il est tout de suite compris par la machine, ainsi, un programme, mme crit en C sera excut moins rapidement que s'il avait t fait en assembleur ( de quelques diximes de secondes, mais bon... ). Ok, vous devez peut-tre vous dire " bordl c'est quoi ce truc, je quitte a et je retourne tlcharger des cracks tous faits!" Si c'est ce que vous vous dites, alors quittez ce tutorial, et vous serez oblig d'attendre sur le net que les cracks sortent, et surtout, vous ratterez le plus important, la satisfaction personnelle et le monde superbe qu'est l'assembleur. Par contre si vous vous dites " bordl c'est quoi ce truc, c'est chelou mais j'ai quand mme envie de savoir comment on s'y prend pour cracker" ; alors la suite de ce tutorial est pour vous ;)) Bon, ce qui apparait l'cran, s'appelle un listing. C'est l dessus que l'ont va tudier.

Rcapitulons. En dmarrant Start Clean, une option nous propose de vous enregistrer. Allez-y et entrez un truc bidon puis faite Ok. Si a marche, c'est que vous avez un mga-bol du fait qu'il y des

possibilites quasiment infines ! Sinon le prog vous affiche " Incorrect code !". Un saut conditionnel est donc prsent :)) Dans la bote de dialogue en question o l'on doit entrer son code et-tout, il y a deux cellules de saisie. Celle du nom et celle du code ;) L'une s'appelle "name", et l'autre "code" C'est ce moment l que l'on va faire un ch'tit peut d'assembleur... Revenez a WinDasm. Avant de lancer une recherche sur un mot, on va se placer directement l'entre du prog, car ce qu'il y a avant on s'en fou un peut ;) Pour ca, faites: Goto => Goto Code Start...

Lancez ensuite une recherche automatique sur le mot "name"; ( ne rentrez pas les gullemets ), car il fait partie de la bote de dialogue se chargeant de la saisie du code. On pourrait aussi rechercher " code "... Pour faire cette recherche, faites: Search => Find Text..

Et l, vous allez forcement tomber sur quelque chose. Cependant, il se peut qu'il y ait plusieurs fois ce mot dans le programme...donc, par mesure de prudence, faites "Suivant" Vous verrez alors que vous arrivez a d'autre endroit du programme...Alors, que choisir ?? Revenez au debut du code ( Goto => Goto Code Start.. ou bien clic sur le bouton avec une lampe marqu Cd Start en dessous dans la barre de bouton de w32dasm). Refaite une recherche et arretez vous a la seconde occurance de " name " (qui doit etre trouve a la ligne 473 comme indiqu dans la photo d'cran ci-dessous). On se trouve alors un endroit particulirement interressant. Mais alors pourquoi cet endroit est t-il si interessant me direz-vous ??? Parce que si l'on observe bien cette petite partie (ce qu'il y a avant et apres...), on remarque que l'indication "*Reference To: ADVAPI32. RegCreateKey, Ord: 00C6h "est affiche. Cette indication de fonction indique que Start Clean va inscrire un truc dans la base de registre de Windows, sans doute votre nom et code...a condition que votre code soit bon :). En franais pour ceux qui sont allergiques l'anglais RegCreateKey veux dire Crer une clef dans le registre (Reg pour Register). Voyons voir ce listing...

L'instruction que l'on recherche est un saut conditionnel. En assembleur, ca se traduit par : JNE, JNZ... qui sont des sauts appel de "non egalit"... JE, JZ.... qui sont des saut qui s'effectue en cas d'"egalit"... Egalit signifie ici "deux valeur identique"... Lorsque que le programme va comparez votre code avec le vrai, il va indiquez si il sont "egaux" ou non... Si le saut est de forme JE, alors on dira que "le saut se fait si les codes sont gaux". Si le saut est de la forme JNE, alors on diras que "le saut se fait si les codes ne sont pas egaux"... Il existe un type de saut appel inconditionnel, c'est a dire que le saut s'effectue sans conditions... Ce saut s'ecrit JMP en assembleur, mais cela ne nous serviras pas pour ce tutorial... Donc, pour revenir a StartClean, il va falloir qu'on trouve tout les sauts qu'il y a dans le bout de code ci dessus, puis qu'on analyse ou est-ce qu'il nous font sauter... On est chanceux, ici il n'y a qu'un seul saut qui est a l'adresse 004011EB, et qui est

situ juste apres un test (Un TEST est l'instruction qui determine si une valeur est egale a zero...). On a donc :

L'instruction JNE 00401271 signifie : "Sauter a l'adresse 00401271 si la valeur teste n'est pas egale a zero." Il y a fort a parier que la valeur testee soit le numero de serie que vous avez rentrer au pif. Il faut bien comprendre que souvent, un numero de serie est considere comme valide lorsque la valeur du test est egale a zero. Autrement, dans le cas ou le test n'est pas egale a zero, alors ce numero est reconnu comme incorrecte... C'est un peu comme le courant electrique : 0=ouvert et 1=fermer...Compris ? Donc, "Sauter a l'adresse 00401271 si la valeur teste n'est pas egale a zero." siginfie que si le code est mauvais, on va "sauter" tout ce qu'il y a entre l'adresse 004011EB (l'endroit d'o l'on saute) et l'adresse 00401271 (l'endroit ou le saut nous amene...). Regardez sur le listing...concrtement, le saut va passer au dessus de toutes la partie du programme qui inscrit notre nom et notre code dans la base de registre... Par contre, si le code est bon, le saut ne s'effectue pas et le programme va continuer son listing en passant par " * Reference To: ADVAPI32.RegCreateKey " et " * Reference To: ADVAPI32.RegCloseKey " qui represente la procdure de cration de votre code perso dans la base de registre de Windows 9x. Cette tape est importante comprendre et si vous ne l'avez pas comprise relisez la plus attentivement...

Donc, il va falloir que l'on modifie le saut jne 00401271 Dans ce cas de figure, il faut faire ce que l'on appelle "nopper" une valeur :) Mais avant, un p'tit cour sur l'hxadcimal s'impose :))
L 'hxadcimal

D'abord oubliez la faon dons vous avez appris compter. Parce qu' en hxa, on compte le la faon suivante :

123456789ABCDEF Par exemple 15 en dcimal s' ecrit F en hxadcimal. Mais pouquoi dit'on hxadcimal ? Tout simplement parce qu' aprs les neufs premier chiffres il y six lettres, 6 d'o hxa, comme un hxagone a six cots ;) Sinon pour ce qui est des conversions tout, nous verons ca dans un autre tutorial ;)

Que veut dire nopper une valeur ? Nopper une valeur, veut dire que l'on va remplacer une valeur par un 90 en hxadcimal, ce qui correspond un no opperation .L'instruction nop en assembleur est un peu bizarre, puisqu'elle ne sert rien. Sauf dans certains cas pour faire perdre du temps CPU en encombrant ses entres/sorties.

Voici une petite liste qui vous indique la valeur Hexadecimale de quelque instruction Assembleur.

Il existe encore beaucoup d'autres instruction, mais qui sont peu interessantes a notre stade ;) Regardez la valeur " 0F8580000000 " se trouvant la gauche du "jne" dans le listing. C'est en fait sa valeur en assembleur convertie en hxadcimal. 0F85 c'est JNE et 80000000 c'est le bloc memoire ou l'on saute... Un bloc mmoire, si vous ne savez pas, c'est un peut comme un petit carr de mmoire lctronique qui va contenir une information. Par exemple si vous collez un post-it avec crit dessus " achte du pain pour ce soir "sur un porte, et ben la porte c'est le bloc mmoire et le post-it l'information ;)
Comment nopper le saut conditionnel ? Il suffit d' ouvrir le fichier STARTCLN.EXE avec votre diteur hxadecimal, de lancer une recherche automatique sur la valeur " 0F 85 80 00 00 00 " (qui represente le JNE 00401271 en hexadecimal)... Une fois cette valeur trouve, vous la remplacer par " 90 90 90 90 90 90 " , puis vous enregistrer les modifications (n'oubliez pas de faire une sauvegarde du fichier d'origine au pralable, au cas ou vous vous tromperiez...(on ne sait jamais).

/* NB: Message de pifoman : Si votre diteur hxadcimal vous dit qu'il ne peut enregistrer les modifications enlevez l'attribut lecture seule de STARTCLN.EXE.Si cela ne suffit pas fermez le dsassembleur w32dasm 8.93. */

Maintenant, lancer le programme ainsi modifie... Quoi ? La boite de dialogue d'enregistrement est toujours prsente ? Normal puisque le programme n'a pas encore enregistrer votre code dans la base de registre de Windows 9x. il faut donc cliquer sur " REGISTER " et rentrer un nom, un code bidon, puis cliquer sur Ok. Et l ca marche! Car le saut "jne" n'existe plus, donc le prog continue tranquilement sont listing en passant par les " * Reference To: ADVAPI32.RegCreateKeyExA " et " * Reference To: ADVAPI32. RegCloseKey ". Le prog est donc complet et illimit. Vous pourrez aussi observer qu'il inscrit un code personnel qu'il s'est auto-gnrer dans la base de registre de Windows9x ;)) Miracle ? Non, assembleur ;)))

PS:

j'dit pas ca pour vous dcouragez, mais pour un cracker consquant, un tel raisonnement, observations et crack comprit dans ce type de scurit ne prend que deux trois minutes et encore... Alors entrainez vous bien et vous verrez, c'est pas si compliquer que a en l'air ;)
Petites astuces pour bien commencer cracker :) - Lire pleins de tutoriaux fait sur de petit progs et les comprendre - Ne pas se prendre la tte et laisser son esprit logique tourner seul, ca donne plus d'endurance - Faire une pause de 5 minutes minimum toutes les heures, quand on commence cracker, c'est mieux - Faire ses devoirs avant ;) , car cracker, surtout pour la premire fois prend du temps - S'acheter un petit bouquin sur l'assembleur. Pour moi la rference, c'est " L' assembleur " de Bernard Fabrot, ditions Marabout, env: 8 Euros :) et "L'assembleur une dcouverte pas pas" aux ditions Marabout de Philippe Mercier (10 ) en franais et bien expliqu [ISBN 2-501-01176-7]. - Ne pas s'auto proclamer bon crackeur parce qu'on cracker 1 ou 2 progs - Avoir un bon cran, car pour le listing, c'est primordial - Ne pas rester tout le temps dans le dsassembleur et naviguer de faon quilibr entre ce dernier et l'editeur hxa (N'hsitez pas faire pleins d'essais) - Dsassemblez un fichier d'origine et le mme ficher mais cracker pour comparer et comprendre les modifications qui ont ts faites

Tutorial de Cracking
(2
ime

Partie)

Dans cette seconde partie de notre tutorial, nous allons aborder diffrents raisonnement pour cracker, toujours avec StartClean...(le pauvre :( ). Dans cette partie du cours, je m'adresse particulierement aux Newbies qui ont deja essayer de cracker un truc mais qui ont pas russi, sans comprendre pourquoi...

Imaginez le contenu d'un programme : Il y a des menus, un titre en haut de la fentre, une barre d'tat, des boites de dialogues.... Tous ces elements contiennent du texte (menu "Fichier", "Erreur 806...") Eh ben, WinDasm permet de retrouver ce texte a l'interieur de l'executable ! C'est ce que nous avons deja fait dans la premiere partie du cours (souvenez vous de la recherche sur le mot "name"), sauf que maintenant, je vais expliquer un raisonnement que beaucoup de newbies ont mais qui est erron...

Lorsque l'on rentre un code au pif, on tombe sur la boite de dialog "Incorrect Code"... Reflechissons donc deux secondes : ce message ne s'affiche qu'a condition que le code soit faux... Donc, si on arrive a retrouver ce message, on pourrait faire en sorte qu'il ne s'affiche plus (en "noppant" un saut conditionnel par exemple...) Essayons ce raisonement dans WinDasm...: Lancer Windasm. Desassembler le fichier StartClean. (cf cours de crack 1) Faites Refs => String Data References.... L, vous devriez avoir une petite fenetre comme celle ci :

Bon, balladez vous dedans jusqu'a ce que vous trouviez la phrase "Incorrect Code"... Double cliquez sur cette phrase : vous tes amen a l'endroit precis ou on y fait rfrence ! Cependant, de la mme manire qu'il y avait plusieurs fois le mot "name" dans le 1er cours, verifiez que "Incorrect Code" n'est pas repet plusieurs fois dans le programme...(double cliquez plusieurs fois dessus) Par chance, il n'y a qu'une seule occurance a cette phrase ! NB: S'il y avait eu plusieurs occurance, il aurait fallu s'occuper de chacunes de ces occurances, ou alors determiner celle qui nous interresse (cf 1ere partie du cours). Bien, maintenant observons l'endroit ou on a atteri :

La ligne "Referenced by..." indique l'adresse qui nous a amene ici, c'est a dire depuis quel endroit du programme est-ce qu'on a saut...Il y a un "C" entre parenthese juste derriere l'adresse. Ce "C" signifie tout simplement "Conditional". Ca veut dire que c'est un saut conditionnel qui nous a envoy a cette partie du code. Rflchissons un minimum : si on veut ne pas venir ici, il suffit de nopper ce vilain saut ! On va donc aller a l'adresse indique par le "Referenced by....", a savoir 004027A3...Faites : Goto => Goto Code Location... et rentrer l'adresse en question...

Oh !! Le beau JE 004027C1 !! Bon, ben vous savez ce qu'on va faire : On va nopper le saut :) Donc, dans l'diteur hexadecimal, vous aller cherchez 741C...cependant, il va falloir mettre plus d'instruction que "741C" parce qu'il peut y avoir plusieurs fois "741C" dans le code Hexadecimal du programme :) Donc, on va chercher "741C" en rajoutant un peu devant et un peu derrire : 83C40485C0741CC7054C7240 NB: Si vous comprenez pas d'o sortent les chiffres avant et aprs, faites le rapprochemment avec le listing. Une fois la recherche effectue, vous remplacez le 741C par 9090... Maintenant, lancer le prog et enregistrer vous n'importe comment : ca marche !!! Super !!! Etes-vous sr que ca marche vraiment ? Bien sur, le programme ne vous dit plus "Incorrect Code", mais tes vous pour autant enregistrer ? Un seul moyen de le

savoir : fermer le prog' et relancer le... Sniff!...ben non, ca n'a pas marcher :(...enfin, pas tout a fait... Explication: En fait, tout ce qu'on a fait, c'est dtourner le message cens nous indiquer que le code est incorrect...Ce message s'affiche lorsque le programme sait deja qu'on a entr un faux code. Reprenons les choses pas-a-pas : On vous demande de rentrer un nom et un code... Lorsque vous cliquez sur "OK", le programme verifie le code : Si il est bon, c'est cool et vous tes enregistr, s'il n'est pas bon, on vous previent par un petit message que le code est mauvais... Donc,s'il y a le message "Incorrect Code", ca veut dire que le programme a deja determin que le code tait faux... Inutile donc d'essayer de changer le message qu'on nous affiche, c'est bien avant qu'il faut agir :) Compris ?? Si j'ai pris le temps d'expliquer cette erreur, c'est parce que beaucoup de Newbies tombent dans le piege lors de leur premiers crack. J'espere donc que ce cours aura eclair certains et prvenu d'autres sur les resultats d'un tel raisonnement ;)

Tutorial de Cracking
(3
ime

Partie)

Dans le second cours, nous avons abord une erreur bien commune a tous les dbutants... Maintenant, je vais tenter de vous expliquer comment trouver d'autres endroits "interessants" dans un listing... Voyons d'abord les differences entre une version shareware et une version enregistre. Voici ce qui est susceptible d'appparaitre dans un Shareware :

Un vilain NAG-SCREEN apparait a chaque fois qu'on lance ou qu'on sort du programme... Dans la barre de titre ou dans la barre d'tat du programme, il y a marqu UNREGISTERED... Dans la fenetre "About", il y a marquer UNREGISTERED USER, ou quelquechose comme ca... Dans les menus, il y a un bouton "Register" qui nous permet d'entrer un code pour s'enregistrer... Au bout de 30 jours, le programme nous lance un nag screen qui nous dit qu'on doit s'enregistrer...

Tout ca n'apparait plus dans la version "REGISTERED"...logique :) En fait, le programme doit chercher si on est enregistr ou non a chaque lancement...

Mais comment le prog sait si on s'est enregistr ?? Eh bien, lorsqu'on s'enregistre correctement (avec un vrai code...), le programme inscrit les informations d'enregistrement dans un fichier annexe, ou dans la base de registre de Windows... Maintenant, un peu de pratique... On va reprendre notre bon vieux STARTCLEAN... ;) Comme on l'a vu precedemment, il nous met un mechant NAG SCREEN a chaque demarrage... Si vous le cracker comme dans la 1ere partie du cours, vous pourrez vous enregistrer avec n'importe quel code... A partir du moment ou vous serez enregistr, StartClean va inscrire un truc dans la base de registre. Ce "truc" en question, c'est ce qui va permettre a StartClean de se "souvenir" que vous vous etes enregistr... Jusque la, j'espere que vous suivez :) Essayons donc d'analyser la logique du programe lorsqu'on le lance: 1) le programme va acceder a la base de registre de Windows. 2) si le prog ne trouve aucune information d'enregistrement, vous etes considerez comme UNREGISTERED :( 3) si le prog trouve les informations d'enregistrement, vous etes considerer comme REGISTERED ;) Pas compliqu, n'est-ce pas ? Il suffit de retrouver ce saut conditionnel... Comment ?...humhum...voyons ca etape par etape.... Lancer StartClean...essayer de vous enregistrer...la vous devez indiquez une valeur "Name" et une valeur "Code". Retenez le nom des deux valeurs : "name" pour le nom, "code" pour le serial... Lancer WDasm et decompiler une copie de StartClean.exe... Placer vous au debut du code (code start) et faites une recherche sur le mot "Name"... La, vous devriez tombez a la ligne 175... En regardant un peu au dessus et un peu au dessous, ca donne ca :

L, vous pouvez voir 2 trucs interressant : RegOpenKey et RegQueryValue. Ces fonctions permettent au programme de prendre des informations contenues

dans la base de registre... Elles sont suivis de LstrLenA et LstrCmpA, qui permette de verifiez la longueur d'une chaine de caracteres et d'effectuer des comparaisons... On peut etre quasiment sr que c'est le moment decisif ou le programme va determinez si vous etes enregistr! Dans chacune des fonction LstrxxxA, il y a un "Test eax, eax" suivi d'un saut vers l'adresse 00401140... Essayons de "nopper" (cf cour 1) ces deux sauts... Pourquoi les deux ? Parceque si on limine que le premier, on va sauter quand on va arriver au deuxieme... Et si on noppe que le deuxieme, on aura meme pas le temp d'y arriver puisqu'on aura deja sauter au premier ! Lancer l'editeur Hexadecimal et faites une recherche sur 85C0742E8D84 (cf cour 2). Remplacer le 742E par un 9090...Ensuite, faites une nouvelle recherche sur 85C07505BB01 et remplacer le 7505 par un 9090... L'heure est venu de savoir si on a bien raisonner ou non... Lancer votre StartClean ainsi modifi...CA MARCHE !! Meme pas besoin de s'enregistrer, le programme pense qu'il l'est deja :) Le principe est donc assez simple : Le programme va cherchez les informations d'enregistrement dans la base de registre, mais qu'il les trouve ou non, quelles soient bonnes ou non, le programme agira comme si tout etait OK !
Pourquoi ?

Parcequ'on a enlevez les sauts qui s'effectuaient si une des conditions n'etaient pas remplies... Je pense que maintenant vous avez assimilez le principe du saut conditionnel... A travers le petit programme qu'est StartClean, vous avez meme pu vous exercez un peu... Vous avez egalement appris a evitez un petit piege dans le 2eme cours... Cependant, le cours n'est pas tout a fait fini, et il est necessaire de vous approtez encore quelques precisions sur certains point que nous n'avons pas encore trait...

Tutorial de Cracking
(4
ime

Partie)

Dans cette 4eme partie, nous allons effectuer simplement quelques precisions importantes. Avant de lire tout ceci, il est prfrable que vous ayez bien compris les cours prcdents. Comme les sujets abords ne sont pas lis, j'ai prefer les prsenter dans des paragraphes independants. Qu'est-ce qu'un offset ? Bonne question... L'offset, c'est l'adresse hexadecimale d'un byte...

C'est quoi un byte ? Bon, ben un byte, c'est une valeur hexadecimale de 2 chiffres... Pour etre plus concret, on a vu que JE =75 en hexa...Eh ben 75, c'est 1 byte ;)

Pourquoi a-t-on besoin de l'offset ?

Il se trouve que dans un programme, il y a plusieurs fois le mme byte... vous n'avez qu' rechercher 75 dans le code Hexadecimal de StartClean... Il y en a une bonne centaine !! Pourtant, chacun de ces 75 n'a qu'une seule et unique adresse : l'offset ! Souvenez vous du dernier cours...on a fait une recherche sur 85C0742E8D84 alors qu'on voulait juste trouver le code 742E...Si on avait utilis l'offset, on aurait pu aller directement a l'endroit voulu, sans taper des ribambelles de code hexa...

C'est cool, mais ou on le trouve cet offset ?

Regardez la petite capture :

Vous voyez ou c'est ?! Dans la barre d'tat... (NB: Agrandissez votre fentre Wdasm si vous ne voyez pas de barre d'etat...)
Bon, maintenant il faut que je vous explique comment on se sert de l'offset :

Prenons une ligne en exemple... :

Vous pouvez voir que l'offset donn par WinDasm est 00002F65h Le petit h a cot de l'offset, ca ne vous sert a rien, vous l'oubliez :) Et tous les zros avant le premier chiffre, vous pouvez les oublier aussi :) On se retrouve donc avec un offset qui est 2F65
A quoi correspond cet offset ?

Est-ce l'adresse hexa de 0F8478010000 ? NON ! Je vous ai dit que l'offset est l'adresse hexadecimal d'un byte !
Mais alors c'est quoi cet offset ?

Eh ben, c'est l'adresse hexadecimale du premier byte de l'instruction 0F8478010000...En clair, c'est l'adresse hexadecimale de 0F... ET SEULEMENT DE 0F ! Donc 2F65 est l'offset de 0F
Ok! Mais alors, les autres byte de la ligne, c'est quoi leur adresse ?

C'est l qu'il faut apprendre a compter en Hexadecimal... : En decimale, on compte de 0 a 9 (0 1 2 3 4 5 6 7 8 9), d'ou decimale : il y a dix chiffres... En Hexa, on compte de 0 a F (0 1 2 3 4 5 6 7 8 9 A B C D E F), donc seize chiffres... Maintenant, on va determiner les offsets de chaque byte de la ligne 0F8478010000 :

0F = 2F65 (ca, on l'a expliquer juste avant...) 84 = 2F66 (vous voyer la difference... ;) 78 = 2F67 (ben vi, on ajoute 1 a chaque fois..) 01 = 2F68 00 = 2F69 00 = 2F6A (OUBLIEZ PAS QU'ON COMPTE EN HEXADECIMALE...)

Voila, c'est pas bien compliqu non ? La seule difficult, c'est de compter en hexa... Tiens, un truc pour verifier que vous ne vous tes pas tromp : regardez la ligne suivante :

Vous voyer l'offset ? c'est bien 2F6B, la suite logique de 2F6A !! Bon, maintenant que vous savez ce qu'est un Offset, vous aller pouvoir vous en servir !
J'en fais quoi de cet offset ?

Dans l'editeur Hexadecimal, vous pouvez rentrer directement l'offset du byte a modifier... Comme ca, ca vous vite de taper plein de valeurs Hexadecimales... Voici les menus concerns pour 2 diteurs :

HEdit : Edit =>> Go to... Apres, tapez 0x avant l'offset... (0x2F65 par exemple) WinHex : Position =>> Go To Offset... Vous pouvez tapez directement l'offset (2F65 par exemple...)

Malheureusement, je ne peux pas vous faire une liste exhaustive, mais c'est a peu prs le mme principe pour tous les diteur hexadecimal...
Et si je veux connaitre l'offset d'un byte depuis l'editeur Hexa, je fais comment ?

Bon, la encore je ne peux pas faire une liste complte, mais de facon gnrale, l'offset apparait dans la barre d'tat de votre diteur hexadecimal...Voici l'exemple de Hedit (en haut) et de WinHex (en bas) :

Et cet "Offset", ca sert qu'a trouver un byte en hexa ?

Ben non ! Sinon, je nevous aurais pas pris la tte avec !! Donc, la principale utilit de rechercher l'offset, c'est de faire un crack grce notre petit code :) Et notre code source, il est expliqu dans le 5eme Tutorial de Cracking !!
Peut-on annuler un saut conditionnel autrement que par plein de 90 ? Si je pose la question, la rponse est forcement oui ! :)) Bon, alors comment on fait ?

Vous savez qu'on peut annuler un nombre par son inverse ? Par exemple, si on prend 34, on peut l'annuler avec -34 Facile, non ? Eh bien, pour un saut conditionnel, c'est le meme principe ! Ainsi, un JE est annul par un JNE... De meme, un JNE est annul par un JE !
Comment ca se traduit en hexadecimal ?

C'est tres simple :) Pour annuler un 74, on va mettre un 75 ! (RAPPEL: 74=JE et 75=JNE) Pour annuler un 0F84xxxxxx, on va mettre un 0F85xxxxxx (RAPPEL: 0F84=JE et 0F85=JNE) Rciproquement, pour annuler un 75, on va mettre un 74... Et pour annuler un 0F85xxxxxx, on va mettre un 0F84xxxxxx ! Normalement, vous devriez comprendre sans problme... ;)
Ok! Mais pourquoi "annuler" au lieu de "nopper" ?

L'utilit est de changer changer un minimum de byte... Par exemple, au lieu de changer un 0F8480000000 en 909090909090, on peut ne changer que le 85...ce qui donnera 0F8580000000 ! Ca fait quand mme plus propre, non ? Et puis surtout, vous verrez que quand vous allez crire la source du crack, ca sera moins fastidieux : 1 ligne au lieu de 6.

Y'a t-il encore d'autre maniere de "cracker" un programme ? Bien sur que oui !! Je dirais meme que chaque crack est "diffrent" d'un autre ! Et mme un programme peut etre cracker de plusieurs manires... ! Il existe d'ailleurs d'autres manires de cracker un StartClean...On en a vu 2, mais j'en compte encore au moins 2 autres...(que l'on verra dans le prochain numero, avec SoftIce) Tout dpend du raisonnement qu'on adopte...C'est pour cela qu'il est tres dur de faire un cours qui permette rllement d'apprendre cracker... Je fais mon possible, mais n'oubliez pas : "C'est en forgeant qu'on devient Forgeron" Comment faire sauter un nag-screen ? oOo...on peut pas vraiment faire un cours universel la dessus, mais il y a quand meme une mthode qui peut marcher... : si le Nag-Screen contient du texte ou une barre de titre, vous pouvez essayer de retrouver ces chaines de caractres dans le code hexadecimal du programme de faon a l'effacer... Bon, on va plutot faire un peu de pratique, ca sera plus simple... Prenons une fois encore StartClean...Lorsque vous le lancez, le nag-screen apparait... Relevez des lors le nom de la fentre : "Register!"

NB: Si il n'y a pas de barre de titre, faite une recherche sur le texte contenu dans le nag... Bon, maintenant, je vous explique brievement le principe : Si on efface le nom de la fenetre dans le code hexadecimal, elle n'apparaitra plus au lancement du programme...tout simplement...Donc plus de nag-screen... Comment je
retrouve le "Register!" en hexadecimal ?

Dans votre editeur hexadecimal, il suffit de faire une recherche sur ce mot !

Maintenant faites OK...le programme va vous renvoyer "Data not Found!" ou un truc comme ca.
Ben alors ?? Pourquoi ca marche pas ?

En fait, c'est du au fait que le programme est en 32bit.... Et alors? allez vous me dire...ben en 32 bit, vous devez spare chaque byte de lettre par un byte "00"... Ohlala ! c'est quoi ca ?! Rassurez-vous, vous allez comprendre en regardant l'cran suivant :

Vous comprenez toujours pas ?? Bon, regardez la premiere recherche... On a fait une recherche sur le mot "Register!", ce qui donne en 16bit : 52 65 67 69 73 74 65 72 Et bien en 32 bit, il faut ecrire ce meme code hexadecimal, mais entrelac de "00", ce qui donnera : 52 00 65 00 67 00 69 00 73 00 74 00 65 00 72 NB: Certains programmes, comme WinHex, peuvent faire la recherche de texte en 32bit, simplement en activant l'option "Unicode"...L encore, il faut faire selon l'diteur Hexadecimal que vous utilisez... Donc maintenant, en appuyant sur OK, vous allez tomber sur la phrase qui nous intresse :)
Et a l'avenir, comment je pourrais savoir qu'un programme est en 16bits ou en 32bits ?

Et bien c'est simple : en general, les programmes windows 9x sont tous en 32bits, sauf quelque uns... Si c'est un programme Windows 3.x ou DOS, c'est forcement du 16bits... Au pire des cas, si vous savez pas, ben vous essayer les deux mthodes ! Compris ?...
Ok! Je fais quoi maintenant ?

Eh bien maintenant, il faut remplacer les valeurs hexadecimales des lettres par des zros... Si vous comprenez pas, regardez les deux ecran ci-dessous :

Normalement, vous devriez reussir a faire ca sans probleme... Maintenant, lancer StartClean...La fentre a bel et bien disparu :) NB: Pour certains programmes, vous verrez toujours la fenetre, mais la barre de titre sera vide...

Dans ce cas, il faut voir si il n'y aurait pas juste au dessus (dans le code hexa) une occurance du style "Shareware.Frm","Form.Shareware" ou un truc qui y ressemble...(bien sur, j'ai mis "Form.Shareware" parceque c'est le cas de notre exemple, mais ca correspond en fait a ce qu'il y a d'ecrit dans la barre de titre...vous pouvez aussi chercher un truc du genre "Form.Nag" ou "Form.Splash" ou un autre truc qui vous parait suspect...) Si vous trouvez, essayez de le supprimer (avec des "00") et voyer si ca fonctionne... Si ca marche pas ou que vous ne trouvez pas, laissez tomber...
OK! ca marche, mais la fenetre principal du programme, pourquoi elle n'apparait plus ?

Ah...ca c'est le petit inconvnient de la technique...rappelez-vous : Quand on lance StartClean, il faut cliquez sur "OK" dans le Nag-screen avant de pouvoir accder a la fentre principale... Mais nous, on a vir le nag, donc on ne peut plus appuyer sur "OK", donc le programme ne se lance plus...logique !
Alors quel interet de nous faire un cours sur un truc qui ne marche pas !

Du calme !! Qui a dit que ca ne marchait pas ? On a bien virer la fenetre non ? En fait, ce qui nous gne, c'est juste qu'on peut pas appuyer sur le bouton "OK"... D'ou la caracteristique suivante : Cette technique n'est valable que si le Nag-Screen ne requiert aucune action pour activer le programme... Donc dans le cas ou le nag-screen est "au dessus" du programme deja lanc, cette technique marche parfaitement... ;) Par contre, n'abusez pas de cette methode car elle n'est pas tres "fine"...C'est mme plutot bourin... Personnellement je ne l'utilise que dans les cas ou toutes mes autres tentatives ont echoues...
Pourquoi certains programmes n'ont pas de "Data String References" ?

Arff ! Avez vous deja programm en VisualBasic ? Et bien dans ce language, tres pratique au demeurant, toutes les fonctions de cration de fenetre, de comparaison de chaines de caracteres, etc... sont prise en charge par les fameuse DLL qu'il nous manque tout le temps quand on recupre un programme sur Internet. Vous savez, les VBRUN300.DLL et autres MSVBVM50.DLL...Et c'est pour ca que quand vous allez decompiler le programme vous allez rien voir dans les "Data String References"... Il y a aussi d'autres programmes qui ne possdent pas de Data String (bien qu'il ne soit pas programmer en VisualBasic). Dans ce cas, essayez de voir si le code n'est pas contenu dans un fichier DLL annexe... Sinon, considerez qu'il n'y a rien a faire (ca serait bien trop dur a expliquer a votre stade actuel). Nous aborderons le sujet dans un prochain numero... Ceci dit, si vous etes confronter a un nag-screen, vous pouvez toujours essayer la technique dcrite prcdemment ! Avec un peu de chance, a peut marcher :)
C'est quoi SoftIce ? SoftIce est un "Dbuggeur"...Il trace un programme pendant l'execution... Cet utilitaire est tres pratique dans certains cas, mais comme il n'est pas si simple a utiliser, nous aborderons son utilisation dans le prochain numero... Patience...

Je crois que nous avons vu le plus important pour l'instant... Maintenant, vous de vous faire les dents sur des sharewares... Commencez par des petites production, parceque sinon, vous risquez de dsesperer rapidement ! En effet, les grand logiciels (ACDSee, Paint Shop Pro ....) sont trs difficile cracker pour un debutant. En fait, je dirais meme que vous n'y parviendrez pas avant un bon bout de temps... Mais tout arrive avec le temps ;) Donc patience... Et surtout bonne chance ! Mais avant de vous lancer dans l'aventure, passez par le dernier cours ! Vous y apprendrez comment faire vos propres crack a l'aide d'un code source qu'on vous fournit :)

Tutorial de Cracking
(5
ime

Partie)

Nous allons maintenant apprendre a faire un patche en langage TurboPascal... Rassurez-vous, aucune connaissance n'est requise pour suivre ce tutorial !! Enfin, si : ca suppose que vous sachiez cracker un prog ... Comme je me vois mal vous apprendre a programmez en quelques lecons, je vais vous donner un code source o vous ne modifierez que quelques lignes en fonction du patch que vous ferez :) Commencons par la theorie : Ci-Dessous, le code source du patch en question... Tout ce qui ce trouve aprs les // seront des commentaires... (syntaxe la C/ C++).Pour pouvoir intgrer des commentaires dans vos programmes en pascal les mettre entre { }. Ce qui est en rouge, c'est ce qu'il faut changer c'est dire adapater suivant votre programme ... Quand il y a marqu pas touche, c'est pas touche !! ;) Pour le compilateur Turbo Pascal Compiler: cliquez ici

-----------------------------------------------Dbut--------------------------------------------------------

Program crackpatch; Uses Crt; Const A: Array[1..5] of Record

// Pas touche // Pas touche // 5 correspond au nombre de // byte que vouz changez // Ca pourrait etre 1 ou 60 selon le cas !

A : Longint; B : Byte; End = (

// // // //

Pas Pas Pas Pas

Touche Touche Touche touche

(A:$EE34;B:$90), (A:$EE35;B:$90), (A:$EE36;B:$90), s'en (A:$EE37;B:$90), (A:$EE38;B:$90)

// (A:$offset;B:$nouvelle valeur), // comme il y a 5 changements, ben ya 5 lignes ! // Vous remarquez que la valeur que l'on modifie, on // tamponne !! on met direct le NOP ! // ATTENTION, sur la dernire ligne pas de

// virgule! ); Var Ch:Char; I:Byte; F:File; FN:file of byte; Size:longint; Procedure Presentation; Begin Gotoxy(2,3); // Pas touche // Pas touche // Pas touche // Pas touche // Pas touche // Pas touche // Pas touche // Pas touche // Pas touche // Pas touche

Textcolor(3); // change la couleur de ton texte si tu change le # // Tout ce qu'il y a juste en dessous, c'est la presentation du // crack, donc vous modifiez le nom du prog, le type de crack.... // Notez la syntaxe Writeln('montexte'); // Vous pouvez pas mettre une appostrophe dans votre texte, sinon ya une // erreur !! Writeln (''); // ca fait une ligne blanche... Writeln('cRACk fOR Writeln('cRACk tYPE Writeln('cRACKED bY Writeln(''); Writeln('gREETiNG : Prog De Merde v9.5'); : fuck the time limit'); : yournamehere'); : mes amis, monchien...');

Writeln (''); // ca fait une ligne blanche... end; Begin Presentation; // // // Pas touche Pas touche Pas touche

Assign(F,'PROGDE~1.EXE '); //Il faut mettre le nom de l'exe a crack en //version DOS et en MAJUSCULE //(si il fait 3Km, vous mettez le "

" )

{$I-} Reset(F,1); {$I+} If IOResult <> 0 then begin writeln('fILE nOT fOUND!');

// // //

Pas touche Pas touche Pas touche

// Si le fichier est pas // trouv, il affiche le msg..

halt(0); end; For I:=1 to 5 do

// //

Pas touche Pas touche

// Tu remet le nombre de byte que t'as

// changs (dans cet exemple, on a fait 5 changement) Begin Seek(F,A[I].A); Ch:=Char(A[I].B); Blockwrite(F,Ch,1); End; // // // // // Pas Pas Pas Pas Pas touche touche touche touche touche

Writeln('CrACk Successful'); //Le msg s'affiche quand le crack est //russi ! End. // Pas touche

----------------------------------------Fin---------------------------------------------------

Au final, on s'aperoit qu'il n'y a que 8 endroits a modifier en fonction du patch que l'on veut faire... C'est pas sorcier et mon avis, c'est a la porte de tout ceux qui veulent apprendre....

Bon, maintenant qu'on a vu la thorie, passons a la pratique ! On va crer un patch pour le logiciel que vous avez crack dans le 1er cours... Deja, on peut prparer les infos dont on a besoin pour faire le patch :

Le nombre de changements qu'on a fait : 6, puisqu'on remplace 0F848000000 par 909090909090 Les offsets ou on a fait les changements (cf Tutorial de Cracking 4) :

0F =>> 5EB 84 =>> 5EC 80 =>> 5ED 00 =>> 5EE 00 =>> 5EF 00 =>> 5F0

Pour chaque offset, la nouvelle valeur qu'on veut mettre : 90 Le nom du fichier EXE qu'il faut cracker, en version DOS : STARTCLN.EXE

La version du programme et son nom complet : StartClean v1.2 Voil ! On a tout ce dont on a besoin :)) Bon, ben voila ce que ca donne :

-----------------------------------------------Dbut-------------------------------------------------------Program crackpatch; Uses Crt; Const A: Array[1..6] of Record A : Longint; B : Byte; End = ( (A:$5EB;B:$90), (A:$5EC;B:$90), (A:$5ED;B:$90), (A:$5EE;B:$90), (A:$5EF;B:$90), (A:$5F0;B:$90) ); Var Ch:Char; I:Byte; F:File; FN:file of byte; Size:longint; Procedure Presentation; Begin Gotoxy(2,3); Textcolor(3); Writeln (''); Writeln('cRACk fOR Writeln('cRACk tYPE Writeln('cRACKED bY Writeln(''); Writeln('gREETiNG Writeln (''); end; Begin Presentation; Assign(F,'STARTCLN.EXE ');

: StartClean v1.2'); : Enter Any registration name and code!'); : Smeita'); : A tous ceux qui lisent mon tutorial');

{$I-} Reset(F,1); {$I+} If IOResult <> 0 then begin writeln('fILE nOT fOUND!'); halt(0); end; For I:=1 to 6 do Begin Seek(F,A[I].A); Ch:=Char(A[I].B); Blockwrite(F,Ch,1); End; Writeln('CrACk Successful'); End.

----------------------------------------Fin---------------------------------------------------

VALA ! C'est pas bien dur !! Ben maintenant, il va falloir crer le fichier ".exe" grce au compilateur... L aussi, c'est trs simple : lancer l'explorer puis faites glisser le fichier source du crack sur le programme TPC.EXE... Un fichier .EXE est automatiquement gnr partir du code source !

Alors l, si le compilateur vous dit qu'il y a une erreur, ca peut venir de plusieurs endroits : D'abord, vrifiez que vous n'avez pas mis de virgule la dernire ligne des offset. Ensuite, assurez-vous d'avoir bien compt le nombre de changements et de l'avoir indiqu au dbut du crack et a la fin du crack... Enfin, regardez si vous n'avez pas mis une apostrophe dans les "Writeln"... Normalement, ce sont ces erreurs qui reviennent le plus souvent... Si vous avez un autre probleme, essayer de revoir ligne a ligne votre code source...

Ensuite, il vous faudra patcher ce crack avec TPPATCH.EXE, fournit en meme temps que TPC... Procdez de la meme manire que pour gnerer le crack.exe :

Normalement, ya un truc en allemand qui vous dit "Fertig"...ben ca veut dire que ca a march :) Pourquoi est-ce qu'on a patcher le crack ? Parce que le Pentium 2 bug avec le Turbo Pascal...Et le remde, ben c'est TPPATCH... ;) Voila, c'est fini, vous pouvez maintenant distribuer votre crack sur Internet... Enfin, assurez au moins qu'il fonctionne bien en le testant sur une version "saine" du programme a cracker. Pour vous entrainez, essayez de faire le patch du 3me cours. Vous pouvez aussi essayer de faire les patches correspondant a l'annulation des JE et des JNE (cf Tutorial de Cracking n4) ... En attendant de voir d'autre methodes de cracking, entrainez-vous appliquer ce que nous avons deja expliqu...

Tutorial de Cracking
(6
ime

Partie)

Mon objectif : Vous apprendre a vous servir de SoftIce et meme cracker avec SoftIce (tant ka faire ;) Qu'est ce que SoftIce ? SoftIce est un debuggeur. Il vous permet d'executer un programme pas a pas pour en trouver les erreurs...enfin, ca c'est la mainiere officiel de s'en servir :) Passke nous, les erreurs, on s'en fout ! Ce qu'on veut, c'est de faire tourner un programme pas a pas pour trouver l'endroit d'ou on appelle un nagscreen ou mieux encore, trouver l'endroit ou on

compare un serial avec le bon (et donc chopper le bon!) Vu comme ca, ca a l'air facile non ? En fait, les problemes viennent plutot de l'utilisation du debuggueur et de l'analyse du code Assembleur qu'il nous affiche ! AhAh!! Oui, ici vous pouvez oublier les beau "string data ref" et tout ce qui s'apparente de pres ou de loin a du texte !!! SoftIce, c'est du 100% ASM ! Avec des 'eax' 'ebx' '40000:02245' 'mov eax, [ebp-14]' etc.... C'est donc le but de se tut' de vous apprendre a decortiquer tout ca ! :) Et c'est partit !! Installer SoftIce Bon, ne mettons pas la charrue avant les boeufs, et commencons deja par installer SoftIce correctement : Lorsqu'on vous demande un serial...ben vous avez ka mettre 1900-0000DD-9B (v3.25) Installez-le dans le repertoire par defaut... Choisissez tous les composants... Si vous trouvez pas votre carte video, mettez "Standard VGA" et cochez "Universal Video driver"... Choisissez si votre souris est sur COM1, COM2 ou PS2... Laissez l'installation modifiez votre autoexec.bat... Faite "Register Later" puis "Yes, restart my computer now". Vala, maintenant SoftIce est installe !! ;) Ok, maintenant il faut que vous modifiez quelque parametres... Editez le fichier winice.datqui se trouve dans le repertoire ou vous avez installe SoftIce. (avec notepad, vous faites "ouvrir", vous allez dans le repertoire de SoftIce, par defaut c:\program files\numega\softice95, et vous ouvrez le fichier winice.dat...) Enlevez les ';' devant les dll suivantes : kernel32.dll, user32.dll, gdi32.dll. Recherchez aussi une ligne commencant par ligne INIT= et remplacez l par ceci: INIT="X;CODE ON;DATA;R;".

Pour que les modifications prennent effet il faut redmarrer. Comment qu'on se sert de SoftIce ? Vous avez redemarrez ? Et maintenant, vous vous dites : bon, comment on lance SoftIce ? Reponse: on le lance pas, car vous etes deja dedans ! En fait, c'est comme dans Alien IV :)) Vous etes en apparence dans windows, mais au fond, ya SoftIce qui veille... Et des que vous tapez Ctrl+D (ou F5), vous etes dans SoftIce ! Et la, vous allez me dire "mais a koi ca sert le Symbol Loader qu'il m'on mis en raccourci ??" Et ben ca, c'est si vous voulez tracer un programme depuis sa premiere instruction ! Autant dire que ca sert pas a grand chose...du moins pas souvent :) Passke, entre le debut d'un programme et son nagscreen, peut bien avoir des milliers d'instruction...imaginez si faisiez chacune de ces instruction pas a pas ! Le probleme du debuggeur, c'est que quand vous entrez dedans, vous pouvez etre n'importe ou !! Je m'explique: windows, ca fait plein plein de truc en tache de fond...(vous imaginez meme pas...) et comme le debuggueur il sait pas que vous vous interressez qu'a tel ou tel programme, et ben il vous affiche les instructions en cours au moment ou vous l'appelez. ...Oauis...vous avez l'air perdu...En gros, des que vous faites Ctrl+D, vous tombez n'importe ou dans windows !! (Meme si vous faite Ctrl+D alors que vous etes dans le programme a cracker..) Va donc falloir trouver une ruse pour atterir ou on veut !

Et c'est ce qu'on appelle les "breakpoints" (= "point d'arret" = bpx). Ca consiste a dire a SoftIce "Arrete toi a tel endroit". Et alors je vous entend d'ici me crier : "Comment kon sait a quel endroit faut s'arreter ?" Ahhh...En fait on va dire au debuggeur "arretes toi des qu'il y a une fenetre de cree". C'est alors qu'intervient les fonctions usuelles de windows... Par exemple, quand un programme cree un fenetre, il utilise souvent la fonction "CreateWindowExA" et "ShowWindow"... Donc si on dit a SoftIce "Arretes toi des que la fonction CreateWindowExA intervient", et ben il nous arretes des que la creation de la fenetre est appellee. Donc on a l'appellant, et on peut empecher qu'il appelle le nagscreen...vous suivez ?? Bon, en techinque, pour poser un tel point d'arret, il suffit de rentrer dans SoftIce, puis de taper : bpx CreateWindowExA Quelques fonctions souvent utilises... Notes toutes les fonctions ayant un A la fin signifie que ce sont des fonctions 32 bits. Pour le mode 16 bits enlever simplement le A... Exemple : GetWindowTextA = GetWindowText

Don't Panic !! Si j'enumere ces fonctions (liste non exhaustive..) c'est juste pour vous montrer quelque exemples...dans les autres parties du cours, vous apprendrez a vous en servir :) Commandes Principales de SoftIce C'est pas tout, mais faut bien que vous sachiez utiliser un peu SoftIce...Donc voci une liste des principales commandes de SoftIce... F8 = permet d'xcuter le programme pas pas tout en rentrant dans les CALL (c'est dire que le programme appelle une fonction, ou une routine de vrification du serial par exemple...). Exemple : CALL 000012345 => si ici on fait F8 on rentre dans la fonction. F10 = la meme chose que F8 mais ne rentre pas dans les CALL : il les xcutent, vous n'avez simplement pas le dtail de la fonctions ). Si on fait F10 on xcute le CALL mais on ne rentre pas dedans on va directement a l'instruction suivante... La nuance entre les deux est tres importantes: Imaginez qu'un Call est une porte donnant sur une piece ayant elle meme d'autre porte, et ainsi de suite a n'en plus finir... Et ben, si vous rentrez dans une porte (un CALL) puis, a partir de cette porte, vous entrez dans une autre, et une autre, et encore une autre.... ben vous vous etes plus qu'eloigner de l'origine... :) c'est pour ca que F8 est a utiliser avec moderations, et il faut eviter de trop s'enfoncer de call en call... F12 = permet de sortir d'un CALL et de reprendre l'xcution juste aprs. C'est comme ca que vous retrouverez l'appelant d'une fonction.(vous etes a l'endroit X, appuyez sur F12 et vous arriverez juste apres l'endroit Y qui appelle X...) "? nom_de_registre" = permet d'valuer une valeur d'un registre en dcimal Exemple si eax = 00003039 faites "? eax" et vous obtiendrez : "12345" ? = aide, trs utile, vous y trouverez toutes les fonction de SoftIce... r = pour modifier la valeur d'un registre Exemple si vous voulez que eax soit gal 1 faites "r eax=1" Attention : les valeurs contenues dans les registres sont des valeurs hxadcimale. bpx nom_de_fonction = pour creer un breakpoint sur une fonction (ex: bpx showwindow). bpm adresse_memoire = pour creer un breakpoint sur une addresse memoire (ex: bpx 0040660). bc * = supprimmer tous les breakpoints, car quand vous en poser un, il reste jusqu'a ce que vous l'effaciez.... Exit = forcer SoftIce quitter le programme (pratique en cas plantage). Task = permet de savoir sous quel nom tourne un programme prcis. HWND nom_du_programme = Pour connatre le diffrents sous objets d'une application (fenetre, boite de dialogue...) Ctrl+D ou F5 = Rentrer et sortir de SoftIce...une des touches les plus utile :)

Voila, vous savez le principal sur l'utilisation de SoftIce... N'hesitez pas a revenir sur cette partie du tutorial pour revoir les commandes et les fonctions utilise dans SoftIce...

Allez, en cadeau bonux, je vous offre un beau dessin d'une fenetre SoftIce, histoire que vous voyez a quoi ca ressemble :) Ouais, je sais, ca parait austere vu comme ca, mais en fait c'est bien pratique :)

Tutorial de Cracking
(7
ime

Partie)

Comment choper un serial pour Start Clean v1.2

Matriel ncessaire :

SoftIce
Les protections : Registration par code Un Nagscreen au lancement

Commencez par installer Start Clean (et ouais ca aide si on veut le cracker non ? ) Vous allez voir que choper un serial pour StartClean est trs, mais trs facile... Mais cela constitue, tout de mme, une bonne introduction l'utilisation de SoftIce.

Commencons... Lancez Start Clean et lorsque le nag apparrait, cliquez sur Register... Renseignez les champs : mettez votre nom (pour moi julien Lemaire ou pseudo peu importe) et un serial bidon (12345). Appuyez sur Ok, et une boite de dialogue apparait avec 'Incorrect code!'. Et oui, on ne chope pas un serial valable avec la chance, vous croyez quoi !!!!

Rpetez l'opration prcedente mais n'appuyez pas sur Ok. Maintenant allez sous SoftIce pour cela faites Ctrl+D et posez un "bpx Getdlgitemtexta". (cette commande de SoftIce permet de poser un point d'arret sur les "objet" de la fenetre ou vous rentrez le nom et le numero de serie...Comme ca, des que StartClean va regarder ce que vous avez

rentr comme serial, on va arriver sur SoftIce et on pourra suivre les operation pas-a-pas :) Ensuite sortez de SoftIce et appuyez sur Ok.

Voil vous tes sous SoftIce (grace au bpx !). Faites tout de suite F12 pour sortir du CALL (la fonction appele).

L, regardez dans la fentre des registres (tout en haut...), et plus spcialement la ou il y a marque "EAX". (Dans la fenetre des registres, vous pouvez voir les valeur de tout les registres memoire un instant donn. Tous les registres sont interressant a observer. En fait, il est tres utile de les regarder a chaque pas que l'on effectue sous SoftIce. C'est indispensable pour trouver un serial...Et n'oubliez pas que les registre sont en Hexa !!)

La valeur de EAX est de 0000000E. Tiens, bizarre ca ne serait pas la longueur de notre nom ? Et oui 0E en dcimal ca donne 14 (il y a 14 lettres dansJulien Lemaire !!). (Si vous voulez convertir une valeur hxadcimale en dcimale tapez "? valeur_hexa" ou "? nom_du_registre")

Maintenant, faites d esp+18 et dans la fentre des donnes et on voit....rien...pas grave continuons.. (La fenetre des donnes est la partie de SoftIce ou il y a des trucs du style de ce qu'on peut voir dans un editeur hexadecimal...et "d nom_du_registre" affiche les infos contenu a l'adresse du registre... C'est souvent grace a cette commande qu'on peut trouver un serial)

La zone de saisie que l'on trace pour l'instant semble etre celui o l'on a rentr notre nom... En effet, chaque zone de saisie est traite l'une apres l'autre. De facon general, l'ordre dans lequel elle sont traits est concide souvent avec l'ordre qu'elle ont dans la fenetre...Par exemple, dans StartClean, on a d'abord le nom et ensuite le password...d'ou il est fort probable que l'on atterisse d'abord sur la premiere zone (le nom) puis sur la seconde (le serial..) (je rappelle que "bpx getdlgitemtexta" permet d'arriver sur SoftIce ds que le programme appelle une zone de saisie...)

On refais F12 pour atterir sur la deuxieme zone de saisie (le serial..), et ici l valeur de EAX est de 00000005. Tiens, bizarre ca ne serait pas la longueur de notre serial ? Et si on fait "d esp", on voit dans la fentre "Data" 12345...Eh!! mais c'est notre serial !! Plus de doute, on est bien dans la zone de saisie qui nous interresse !!

Y'en a qui doivent se dire "Comment on sait kil fo faire "d esp" ou aut' chose ????" Bon, dans ce genre de cas, apres avoir appuyer sur F12, on arrive sur une instruction du style "push esi" ou "push edi"...bref, on tombe sur "push xxx", et alors il suffit de faire "d xxx"...

On va poser un bpm (un point d'arrt sur une zone de la mmoire) comme ca quand le programme va comparer notre serial au bon on pourras essayer de le choper. Mais pour poser un bpm il faut une adresse...Regardez la gauche de la fentre sur la meme ligne que '12345'. Ici il s'agit de 63F4E0. (Attention: l'adresse n'est pas la meme tout le temps, ne vous etonnez pas si c'est differrents chez vous...). Donc on tapes bpm 63F4E0 et on fait Ctrl+D (pour laisser le programme continuer son xcution). Si tt sorti de SoftIce qu'on y retourne, et on voit alors ces lignes :

MOV AL, [EAX] => met le contenut de EAX dans AL (sans doute le bon serial..) CMP [ECX], AL => Compare ECX avec AL ; compare le bon serial et celui que vous avez entr JNZ BFF7A7E8 => On dgage si c'est pas bon (ndSmeita: c'est a cette ligne qu'on arrive...) CMP BYTE [ESI],00 => Regarde si ESI=0 (c'est dire si ESI est le bon serial)

Tapez simplement d esi (cette commande permet de voir ce que contient le registre ESI dans la fentre DATA) et dans la fentre data apparait mais oui votre SERIAL OFFICIEL !!!! Donc pour CrAzY SquirreL le serial est 2730-26346-1673-333. Pour info, le serial bidon est visble en tapant "d edi"... Enlevez les breakpoints l'aide de la commande bc * (cette commande permet d'ter tous les breakpoints poss auparavant), puis quitter SoftIce avec Ctrl+D. De retour dans StartClean, rentrez le nom et le serial obtenus, et...Bravo!!! StartClean est encore crack !

Les prochains cours ne s'attaqueront plus a ce logiciel en particulier :) Par exemple, dans le cours qui suit, vous allez apprendre a chopper un srial pour Winzip 7.0 !! Comme ca, au moins, vous pourrez flamber devant les copains ;)

Tutorial de Cracking
(8
ime

Partie)

Comment choper un serial pour Winzip 7.0 ?

Matriel ncssaire : SoftIce Dans ce cours nous allons expliquer comment cracker Winzip 7.0, programme de compression trs utilis et quasi indispensable surtout sur le net. Nous allons utiliser dans ce cours la mthode qui permet de trouver un serial qui corresponde notre nom. Matriel ncssaire : winzip

Commencons ! Lancez Winzip et tout de suite si vous avez une version shareware, un beau nag-screen s'affiche avec les boutons "Quit", "I Agree", "Ordering Info", "View Evaluation Licence" et "Enter Registration Code"... Il s'agit du dernier qui nous intresse, quand vous cliquez dessus la boite de dialogue permettant de s'enregistrer s'affiche. Il y a deux champs , l'un pour le nom et l'autre pour le code. Mettez votre nom, pour moi Julien Lemaire et un serial bidon, 12345 et cliquez sur OK et une boite de

dialogue s'affiche avec le message 'Incomplete or incorrect information'. Donc le programme a compar notre code par rapport au bon code et nous informe que 12345 n'est pas le bon code pour notre nom. Nous allons donc essayer de choper le bon serial en interrompant l'xcution du programme lorsqu'il lit notre nom/serial.

Pour cela il faut poser un breakpoint sous SoftIce, les deux fonctions les plus couramment utilises dans la lecture d'un champs sont GetWindowTextA et GetDlgItemTextA. Donc allez sous SoftIce ( l'aide de Ctrl-D) tapez bpx GetDlgItemTextA puis bpx GetWindowTextA. Quittez SoftIce toujours avec Ctrl-D, et mettez un nom (Julien Lemaire) et un serial bidon (12345). Ensuite appuyez sur Ok, et l on se retrouve immdiatement sous SoftIce.

Faites F12 pour sortir de la fonction pour voir si Winzip lit notre nom et effectivement on voit EAX=12. Mais qu'est que ca pourrais bien tre ? Il faut savoir que les valeur des registres sont hxadcimales et non dcimals, donc 12=18 en dcimal... Et il se trouve que 18 est longueur de mon nom! Et la ligne sur laquelle nous emne SoftIce est PUSH EBX... Faites donc "d EBX" et dans la fentre Data on apercoit notre nom !

Faites F12 pour que SoftIce continue son xcution et lise notre serial (car pour l'instant, on est dans la routine qui lit la zone de saisie contenant notre nom...). L, EAX=5 c'est dire la longueur de notre code. Et la ligne sur laquelle on se trouve est PUSH ESI... Ainsi, comme precedemment, faites "d esi" et on voit notre serial bidon.

Et maintenant qu'est qu'on fait ?...On peut supposer que Winzip va gnrer le serial valide et le comparer au notre et s'il sont diffrents nous envoie la boite de dialogue 'Incomplete or ...' On peut donc supposer qu'il va comparer un moment ou un autre notre serial (12345) au bon... On va donc poser un bpm (arrt sur une zone de la mmoire) sur 12345. Pour cela il nous faut l'adresse laquelle se trouve le serial, donc quand Winzip lit notre serial et que vous faites d esi notez l'adresse laquelle il se trouve. [je rappelle que pour trouver l'adresse, il suffit de regarder sur la meme ligne que 12345, mais tout a gauche...(la ou il y a xxx:xxxxx sur mon beau dessin :))...] Dans mon cas, j'ai 47D958. La commande taper est donc bpm 47D958 (notez que cette adresse n'est pas forcement la meme chez vous !!).

Ensuite faites F5 (pareil que Ctrl+D...) pour que Winzip continue son xcution jusqu' ce qu'il xcute notre bpm. Winzip fais plusieurs fois rfrence cette zone de la mmoire, en effet il est entrain de crer le bon serial par rapport notre nom. On fait plusieurs fois F5 (ou Ctrl+D...), cinq fois xactement et l nous arrivons sur des lignes de code interressantes...:

MOV AL, [ESI] => met ESI dans AL INC ESI MOV AH, [EDI] => met EDI dans AH INC EDI CMP AH,AL => compare AL et AH...(c'est pour ca que c'est interressant...)

Faites d esi et vous on voit notre serial bidon dans la fenetre des donnes. On peut donc supposer que EDI contient le bon serial, faites d edi et vous voyez A24A388C :))

On peut constater que si on continue faire F5 (ou Ctrl+D, c'est pareil...), on tombe de nouveau sur les mmes lignes que prcdemment mais que le serial est diffrent mais galement valide. Peut tre qu'il d'agit d'un srial d'une version antrieur...(on obtient 21645132)

Donc pour Julien Lemaire le serial est A24A388C ou 21645132 !! Quittez SoftIce en enlevant d'abord les breakpoints (en faisant bc * puis F5) et rentrez les informations obtenues (c'est a dire le serial...) dans Winzip... Maintenant Winzip est enregistr !

Bon, vous avez vu ?? C'est pas si dur !! En plus, ce qu'est cool avec SoftIce, c'est qu'y a pas de modif' en hexa ! ;) Maintenant, entrainez vous un peu avec des sharewares a deux balles, et puis vous deviendrez vite un virtuose de SoftIce :))...Quand aux prochains cours (les 'Flash Tuts'), il vont reprendre notre bon vieux WinDASM, histoire de completer vos connaissances...Il sera peut etre plus difficile de les mettre en pratique, car vous ne disposerez pas des logiciels sous la main...mais bon, lisez les quand meme, il finiront peut-etre de vous eclaircir sur l'utilisation de WinDASm :) PS: Au fait, pour ceux qu'on toujours pas compris, Ctrl+D c'est pareil que F5 :)

Tutorial de Cracking
(9
ime

Partie)

Comment craquer avec un diteur hxa ?

Attention les amis !! J'avais deja essay d'expliquer comment virer un nagscreen dans un editeur hexadecimal mais c'etait un peu flou, bourrin et moyennement efficace... Heureusement, Static REvenge est la pour amener sa touche de professionalisme a cette technique etonnante ;) Bon, en tous cas, si vous avez un peu de mal avec votre editeur hexa, je vous invite a relire le [cour 4 - 'Comment faire sauter un nag ?']...

Dans ce cours, nous allons voir un exemple extrmement simple sur "comment cracker un programme rien qu' avec un editeur hxa" :) Pour cela, vous aurez bien sur besoin de votre editeur hxadcimal prfr et du prog 1toX (180Ko) tlchargable ici.

Donc voil, une fois 1ToX install, il faut le dmarrer (beu...ca peut servir) puis que voit-on, un '(non enregistr)' du plus mauvais effet... Ensuite, aprs avoir bien fait tourner le programme, vous verrez qu'il est bien pratique et puissant, mais ds que vous le quittez un nag trs embtant apparait. alors l c' est trop, il va faloir virer tout ca... Pour cela, rappellez-vous, un '(non enregistr)' est prsent dans la barre de prsentation. En premier lieu, nous allons nous occuper de lui. Alors voil, avant tout faites une sauveguarde du fichier 1toX.exe, puis ouvrez-le avec votre diteur hxa. Bon, ok, ca parait bordlique, mais vous allez voir, c'est trs simple. NB: pour pouvoir ecrire sur le fichier, il faut avoir quitter le prog.

Avant de commencer, une petite intro sur l'hxadcimal s'impose: En dcimal on compte jusqu' 15 comme ca => 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 Et en hxa, on compte aussi jusqu'a 15, mais comme ca => 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f. Attention, on part sur une base de 0, ce qui fait un total de 16 adresses sur une ligne 32-bits, celles que vous verez avec n' importe quel diteur hxadcimal :) ( Si vous comprenez pas, c'est pas important...) Premire mthode Virer le '(non enregistr)': Bon, une fois que tout est prt, lancez une recherche en mode ASCII sur (non enregistr). Pour se faire, recherchez le de cette faon (ca donne a en general sous un editeur hexadcimal...). (Dans certains editeurs (HEdit par exemple), l'equivalent est une recherche en 'Text'...).

L, vous allez forcment tomber dessus et deux solutions s' offrent vous pour l'effacer: - Celle du cracker bourrin (mthode moyenne) qui va remplacer tout ca en appuyent sur [Espace] ( un [espace] correspond au code ASCII '20'). Cela donne:

- Et celle du cracker qui y va tranquille et qui va faire ca bien proprement en placent un octects bien precis, ici 00. Cela donne:

Si l'on dois mettre un 00, c' est parce qu' une fonction du programme va dire de lire le '(non enregistr)' d' une adresse une autre, ici de ( ... ... ) -->les parenthses de mot 'non enrigistr. Et c' est avec un simple 00 que l' on va faire comprendre au PC que le texte s' arrete juste aprs le X de 1toX. Et comme 00 n' est pas une instruction, il indique juste une zone dite vide qui ne sert rien et que la machine va interpretter comme un stop sur le texte si l' on peut dire ainsi.

Virer le nag-screen: Pour ce qui suit, laissez tomber 2 minutes WinDasm et les autres dsassembleurs... Alors, pour virer un nag, il faut d' abord lire ce qu' il comporte et y chercher un mot qui y est utiliser asser peux pour reperrer plus vite le coin interessant. Sur ce nag, on peut voir ca: 'Cette version est une version d' valuation pleinement fonctionnelle. Vous pouvez tester 1toX pendant une dur de 30 jours.' Bon, prenez par exemple le mot 'pleinement' et lancez une recherche mais ce coup-ci en mode hxadcimal. B ca alors! On peut pas entrer ce mot dans la cellule de recherche! Normal, car rappellez vous, on compte en hxa. Il faut donc trouver ce mot en mode hxa. Pour ce faire, recherchez le de cette faon (ca donne ca en general sous un editeur hexa):

Soit "pleinement" donne en hxa:70 00 6C 00 65 00 69 00 6E 00 65 00 6D 00


65 00 6E 00 74
NB: Inutile de tout entrer. Et l, nous avons de la "chance", car ce mot n'est present qu' une fois dans le prog. On peut cet endroit reconnaitre sans problme l' ensemble du message :) Alors bien sur, comme un prog se lit et va tre executer par le machine de haut-en-bas il faut remonter pour voir qu' est ce qui va faire que ce message va s' afficher. Nous pouvons voir qu'une certaine chane d'octects est presente de trs prs juste au dessus, la voici:

Alors pkoi cette chane? En fait, ca ne fonctionne pas tout le temps si l' on prend toujours la chane la plus proche du texte du nag. Parfois un telle chane peut se trouver bien plus haut avec des messages qui ne correspondent pas au nag, mais c' est ass rare. Il est vrai qu' il n' y pas mal de chanes de ce type dans ce prog mais c' est celle-ci qui va determine si le nag va s' affich ou non. Ici c' est grce (et dans la plupart des cas) au 82. Dans ce cas, il faut remplacer 82 par 7E.

Que veux dire 7E? Et bien cela vient du compilateur C++. Cette modif' n' a aucune signification en assembleur. De plus, il est trs difficle de trouver une telle chane avec un dsassembleur. Cette modification va donc virer le nag automatiquement. Le 7E (comme un 7C) montre d' aprs plusieurs experiences qu' il peut servir aussi bien virer entirement des fentres que des boutons de commande ;)) Vala, ce prog n' t crack rien qu' avec un editeur hxa. Cette mthode est valables pour pas mal de progs :) Deuxieme mthode Ici, je prends en compte le fait que vous ayez deja lu la premiere mthode. Je vous ai montrer la mthode precdente en premier parce qu'elle fonctionne plus souvent que celle qui suit. Alors voila, l nous allons toujours utilis un diteur hxa. Pour virer le '(non enregistr)', c' est la mme chose qu' au debut du cours dans la rubrique Virer le (non enregistr). Pour le nag, c' est presque la mme chose. Alors pour le virer, lancez un recherche sur en mode hxadecimal sur " 70 00 6C 00 65 00 69 00 6E 00 65 00 6D 00 65 00 6E 00 74 " qui correspond comme nous avons pus le voir au mot "pleinement". Une fois arriv cet endroit, juste un octect va nous interresser. D'ailleur, il se trouve juste aprs la fameuse chane de la preimire mthode:

ors pkoi cet octet? Car il correspond la lettre "C" de la phrase "Cette version est une version d' valuation..." (pour ceux qu'on pas pas compris, c'est la premiere lettre de la phrase...) Souvenez vous, pour virer le (non enregistr), nous avions mis un 00 au dbut de la phrase, et bien l c' est la mme chose, il faut remplacer le 43 par 00 :)) Et oui, car le prog va croire qu' aucun texte n' est prsent dans cette fentre alors il ne va pas l' affiche du tout, c' est t'y pas cool? Cette mthode fonctionne bien sur les progs programms et compils de faon simple sans reverseenginnering itout. (enfin bref, ca fonctionne plutot bien :)).

Tutorial de Cracking
(10
ime

Partie)

Comment cracker Winrescue 95 v.8.01 ?

Matriel ncessaire : Wdasm32 Un diteur hxadcimal (Hex WorkShop ou Hedit par exemple) Les protections : Limitation dans le temps (30 jours) Registration par code Certaines options brides Un Nagscreen au lancement + 9 secondes d'attente (pas une protection c'est juste chiant)

Commencez par installer Winrescue dans le rpertoire de votre choix sur votre disque dur. Cela fait, au boulot !! (faut arrter de glander de temps en temps...)

On note d'abord les messages d'erreurs : On lance Rescue95 on mais un code au hasard, et l un message nous informe : "WARNING - Incorrect Key Entered".

Sachant que le logiciel est limit dans le temps on change la date en 2002 et on relance le programme. Ainsi, lorsque l'on veut accder certaines options un message nous dit "Trial Period Expired".

De plus certaines options sont en temps normal brides cela nous donne un messagedu genre : "RegPack Disabled. Please register."

Faire une copie de Rescue95.exe et renomme la 1.exe. Maintenant lancez Wdasm32 et dsassemblez Rescue95.exe. On constate qu'il n'y a pas de rference au menu (Menu Ref) ni aux botes de dialogues (DLG Ref). Par contre on constate qu'il y a quelque chose en 'String Refs'. On recherche donc dans la liste des "string references" si il n'y a rien qui pourrait nous intresser. C'est cool ! On trouve tous les messages d'erreurs !! On pourrait s'amuser enlever toutes les protections une aprs l'autre si on le voulait.... Mais autant essayer de s'enregistrer directement cela a le mme effet.

On clic donc dans la liste sur "WARNING - Incorrect Key Entered". Et cela nous donne quelque chose comme cela :

* Possible StringData Ref from Code Obj -> "msR3I8aUi9y2E84L" (humhum...c'est le bon code, c'est vraiment trop facile)

:004681BC :004681C1 :004681C6 :004681C8

B89824600 mov eax, 00468290 E8EEBDF9FF call 00403FB4 85C0 test eax, eax 7420 je 004681EA => si mauvaise rponse, aller 004681EA

* Possible StringData Ref from Code Obj -> "Registration Key Accepted"

:004681CA :004681CF :004681D4 :004681D9 :004681DB :004681E1 :004681E8

B8AC824600 mov eax, 004682AC E8104D4DFF call 0043CEE4 A1B0EA4700 mov eax, dword ptr [0047EAB0] 8B00 mov eax, dword ptr [eax] 8B80F0010000 mov eax, dword ptr [eax+000001F0] C7400C64000000 mov eax, dword ptr [eax+0C], 00000064 EB16 jmp 00468200

* Referenced by a (U)nconditional or (C)onditional Jump at Address : :004681C8 (C) le (C) veut dire que c'est un saut conditionnel en 004681C8 qui nous a amen ici.

* Possible StringData Ref from Code Obj -> "WARNING - Incorrect Key Entered"

onc pour arriver "Registration Key Accepted" il faut enlever le "je" qui fait effectuer un saut jusqu' "Warning Incorrect Key Entered". Pour cela on peut tout simplement enlever la ligne 004681C8 et remplacer 7420 par 9090. (on rapelle que 90 = nop = No Operation...) Donc maintenant, quand le programme arrive la ligne 004681C6 mme si le code est mauvais il va directement sur "Registration Key Accepted" puisqu'il n'y a plus de saut conditionnel ! On peut diter maintenant 1.exe. On va l'offset 675C8 (car cela correspond la ligne 004681C8) et on remplace 7420 par 9090. On relance le Rescue95, on entre n'importe quel code et... BRAVO , RESCUE95 EST CRACKE !!! Winrescue98 a exactement le mme schma de protection, sauf que le serial n'est pas le mme. Pour conclure on peut simplement dire que ce logiciel est vraiment super simple cracker, et que la protection est vraiment simpliste puisqu'il n'y a meme pas une vrification du code...

Bon, la c'est vraiment le cas le plus simple qu'il existe !! Ya pas plus facile !! Disons que c'etait juste pour vous rememorer le principe de base :)

Le prochain Tutorial de Cracking s'occupe de Unreal, le celebre Doom-Like ! Vous verrez que c'est aussi facile que WinRescue :) Notez que tout ces Tutorial de Cracking partir de celui-ci ne sont pas la pour vous apprendre de nouveau truc, mais simplement vous montrer leur mise en pratique.... Inutile donc de vous etonnez et de trouver ca trop simple :) On le sait que c'est hyper simple !! Le plus dur reste a venir, et si on insiste sur les bases, c'est pour etre sur que dans le MemenTo 3 on puisse accelerer un peu plus.... Allez, si vous voulez un truc un tout petit peu plus "dur", (ou tout petit peu moins facile...) allez directement au Tutorial de Cracking n 12. il s'agit de mIRC 5.5...

Tutorial de Cracking
(11
ime

Partie)

Tutorial pour Unreal no-cd toutes versions

Pour cracker, vous aurez besoin: -de votre diteur hxadcimal prfr -de WinDASM -et cette fois, pas besoin d'un cerveau super rveill

Unreal a t, en son temps, un jeux magnifique, super beau, super jouable, avec une bande-son superbe aussi. Malheureusement, pour en profiter pleinement, il faut l'installer compltement sinon ses temps de chargement CD sont beaucoup trops longs.

Parlons en du CD tiens ! Une fois UNREAL installer compltement, chaque fois que je dmarre le jeux, il me demande ce CD. Comme je suis de nature assez bordlique, et que j'guare souvent mes CD dans le foutoir qu'est my bedroom, j'ai dcider de faire un crack pour jouer sans CD. Dans ce tutorial, je vais donc vous expliquer mon rsonnement... Ca n'a pas t vident du fait que j'ai d tout dtailler alors que ce crack ne m'a pris que 5 minute. H oui, c'est certainement un des cracks que j'ai fait le plus rapidement, c'est donc pas forcment parcqu'on sattaque une grosse bote, que le crack sera dur.

Bref passons aux choses srieuses et commenont: Au dbut, on serait tent de dsassembler le fichier Unreal.exe, hophophop! Pas du tout! Quand on dmarre UNREAL sans CD la bote de dialogue qui rclament le CD vient du fichier Window.dll. ( de facon generale, quand vous trouvez rien d'interressant dans le fichier '.exe' et qu'il existe des Dlls qui accompagne le programme, il ne coute rien de desassembler ces Dlls, histoire de voir si c'est pas dedans que ca se passe :)...) Il faut donc dsassembler le fichier window.dll. (apres avoir fait une copie de sauvegarde...) Lancez une recherche sur la String Reference "Cd Required"... On tombe alors sur cette partie:

:10B1C3D5 :10B1C3DA eax=0 :10B1C3DD :10B1C3DF :10B1C3E5 :10B1C3E6 :10B1C3E8 :10B1C3EB :10B1C3ED :10B1C3EF

A114B7B310 833800 75E3 8D8DE49FFFF 51 FFD3 83C404 85C0 7F2E 680120000

mov eax,dword ptr [10B3B414] cmp dword ptr [eax], 00000000

//Regarde si

jne 10B1C41D lea ecx, dword ptr[ebp+FFFFFF9E4] puch ecx call ebx add esp, 00000004 test eax, eax //Test jg 10B1C41D //meme saut qu'en 10B1C3DD... push 00002001

*Possible StringData Ref from Data Obj - >"Cd Required" :10B1C3f4 68089DB310 push 10B39D08

*Possible StringData Ref from Data Obj - > "Please insert CD-Rom in drive"

On effectue le saut en:10B1C3DD On remarque qu'il atterit juste aprs le "ExitProcess" (donc juste apres les messages d'erreur) ce qui signifie que la procdure de fermeture n'est pas prise en compte si cmp eax=1. Comme d'habitude, saut conditionel est prsent (ici on a jne...), donc si le CD est prsent le saut conditionel est ok sinon UNREAL affiche le message " Please insert CD..." Trop fastoche, il suffit de remplacer le 'jne' par un 'jmp', saut qui s'effectue quoi qu'il arrive ! (saut inconditionnel !!)

C'est ce moment l qui faut ouvrir window.dll avec votre diteur hxa prfr et de faire la modif' suivant ;-))

Cherchez -------> 75 3E 8D 8D Remplacez par --> EB 3E 8D 8D

Conclusion: Les programmeurs de ce jeux sont pas cons du tout, car ils ont enfin comprit qu'il tait inutile de se faire ch... en faisent des protection anti crack qui de toute faon se font largus les jours qui suivent. PS : pour ceux que ca interresse, la valeur hexadcimale A114B7B30 (qu'on peut retrouver l'addresse 10B1C3D5) est en rapport avec le type de securit appel Realloc@...

Cours de Cracking
(12
ime

Partie)

Comment cracker mIRC 5.5

Matriel ncessaire : Wdasm32 Un diteur hxadcimal (Hex WorkShop ou Hedit par exemple) Introduction Tout d'abord on peut se demander pourquoi cracker mIRC alors qu'il ne possde proprement dit aucune protection part un nag screen de temps en temps. En fait, cela constitue tout de mme une bonne initiation au crack, et cela va permettre au dbutants de suivre sans trop de difficults (enfin je l'espre... :-) et leur permettrent d'acqurir quelques bases. Ou bien encore la satisfaction de voir son nom dans la fentre ou l'on voit habituellement 'unlicenced'. Au boulot Allez dans mIRC et dans le menu faites 'Help' puis 'Register'. Entrez votre nom et un serial bidon puis appuyez sur 'ok'. Et le message : "Sorry, your registration name and numer don't match! Please..." apparait. Notez le, il va nous servir pour la suite. Puis faites une copie de mIRC.exe en la renommant par exemple '1.exe' faites en une seconde copie et renommez la en '2.exe' Ensuite desassemblez 1.exe avec W32dasm Allez ensuite dans 'String Data References', et dans la liste des messages cherchez le messages d'erreurs que nous avons not prcdemment. C'est bon vous l'avez ? Ok au boulot cliquez deux fois dessus, voil W32dasm nous emmne dans le programme...

* Referenced by a (U)nconditional or (C)onditional Jump at Address: :00435D09(C) (nous allons y faire rfrence un peu plus bas...) :00435DAA 6A00 push 00000000

* Reference To: USER32.MessageBeep, Ord:0000h :00435DAC :00435DB1 :00435DB6 :00435DB8 E80B1C0900 68E9AD4C00 6A00 6A0C Call push push push 004C79BC 004CADE9 00000000 0000000C

* Possible Ref to Menu: MenuID_0017, Item: "Search..." * Possible Reference to Dialog: DialogID_0033, CONTROL_ID:0083, :00435DBA 6883000000 :00435DBF 8B5508 :00435DC2 52 push 00000083 mov edx, dword ptr [ebp+08] push edx

* Reference To: USER32.SendDlgItemMessageA, Ord:0000h :00435DC3 :00435DC8 :00435DCD :00435DCF E8481C0900 68EBAD4C00 6A00 6A0C Call push push push 004C7A10 004CADEB 00000000 0000000C

* Possible Ref to Menu: MenuID_0017, Item: "Contents" * Possible Reference to Dialog: DialogID_0033, CONTROL_ID:0082, " :00435DD1 6882000000 :00435DD6 8B4D08 :00435DD9 51 push 00000082 mov ecx, dword ptr [ebp+08] push ecx....

* Reference To: USER32.SendDlgItemMessageA, Ord:0000h :00435DDA E8311C0900 :00435DDF 6A10 :00435DE1 6A00 Call 004C7A10 push 00000010 push 00000000.

* Possible Reference to String Resource ID=01912: "mIRC Registration!" :00435DE3 :00435DE8 :00435DED :00435DEE 6878070000 E81348FDFF 50 6A00 push call push push 00000778 0040A600 eax 00000000

* Possible Reference to String Resource ID=01913: "Sorry, your registration name and number don't match!..Pleas" (Le programme nous amne ici si le code est mauvais.)

:00435DF0 :00435DF5 :00435DFA :00435DFB :00435DFE

6879070000 E80648FDFF 50 8B4508 50

push 00000779 call 0040A600 push eax mov eax, dword ptr [ebp+08] push eax

* Reference To: USER32.MessageBoxA, Ord:0000h

Il s'agit donc de savoir quand le programme dcide de nous envoyer ici... on remonte donc pour chercher un saut conditionnel (Je ou Jne, Ja....). Au bout d'un moment on arrive ici : (c'est ce qui avait au tout debut...) * Referenced by a (U)nconditional or (C)onditional Jump at Address: :00435D09(C) :00435DAA 6A00 push 00000000

* Reference To: USER32.MessageBeep, Ord:0000h :00435DAC :00435DB1 :00435DB6 :00435DB8 E80B1C0900 68E9AD4C00 6A00 6A0C Call push push push 004C79BC 004CADE9 00000000 0000000C

Le (C) indique que c'est un saut conditionnel On nous indique aussi sa provenance (a gauche du (c)), savoir : 00435D09. Faites 'Goto Code Location' et tapez 00435D09. W32dasm nous emmne ici :

* Reference To: USER32.SendDlgItemMessageA, Ord:0000h :00435CF3 E8181D0900 Call 004C7A10 :00435CF8 68235F4D00 push 004D5F23 :00435CFD 683C5B4D00 push 004D5B3C :00435D02 E871C50500 call 00492278 :00435D07 85C0 test eax, eax :00435D09 0F859B000000 jne 00435DAA (le JNE nous envoie sur "Sorry, your ...." quand le code est faux...) * Possible StringData Ref from Data Obj ->"mirc.ini. :00435D0F 687CCF4C00 push 004CCF7C

* Possible StringData Ref from Data Obj ->"oryx" :00435D14 68E3AD4C00 push 004CADE3

* Possible StringData Ref from Data Obj ->"show"

:00435D19 68DDAD4C00

push 004CADDD

* Possible StringData Ref from Data Obj ->"about" :00435D1E :00435D23 :00435D28 :00435D2D :00435D32 :00435D34 :00435D37 :00435D38 :00435D39 :00435D3B :00435D3D :00435D3F :00435D41 :00435D43 :00435D46 :00435D47 :00435D48 :00435D4A :00435D4D :00435D4E :00435D4F :00435D54 :00435D59 :00435D5E 68D6AD4C00 E8D8600200 BE105E4E00 BF3C5B4D00 33C0 83C9FF F2 AE F7D1 2BF9 87F7 8BC7 8BD1 C1E902 F3 A5 8BCA 83E103 F3 A4 68235F4D00 683C5B4D00 E8F6C70500 6A00 push 004CADD6 call 0045BE00 mov esi, 004E5E10 mov edi, 004D5B3C xor eax, eax or ecx, FFFFFFFF repnz scasb not ecx sub edi, ecx xchg edi, esi mov eax, edi mov edx, ecx shr ecx, 02 repz movsd mov ecx, edx and ecx, 00000003 repz movsb push 004D5F23 push 004D5B3C call 00492554 push 00000000

* Possible Ref to Menu: MenuID_0017, Item: "Register..." * Possible Reference to Dialog: DialogID_0033, CONTROL_ID:0085, "" :00435D60 6885000000 :00435D65 A1C0204E00 :00435D6A 50 push 00000085 mov eax, dword ptr [004E20C0] push eax

* Reference To: USER32.DeleteMenu, Ord:0000h (ici il appelle la fonction qui efface 'Register' du menu) :00435D6B :00435D70 :00435D72 :00435D75 E8541A0900 6A01 8B5508 52 Call 004C77C4 push 00000001 mov edx, dword ptr [ebp+08] push edx

* Reference To: USER32.EndDialog, Ord:0000h :00435D76 E89D1A0900 Call 004C7818

* Possible Reference to Dialog: DialogID_0040 :00435D7B 6A40 :00435D7D 6A00 push 00000040 push 00000000

* Possible Reference to String Resource ID=01912: "mIRC Registration!"

:00435D7F :00435D84 :00435D89 :00435D8A

6878070000 E87748FDFF 50 6A00

push call push push

00000778 0040A600 eax 00000000

* Possible Reference to String Resource ID=01911: "Your registration has been entered successfully...Thanks for." :00435D8C :00435D91 :00435D96 :00435D97 :00435D9A 6877070000 E86A48FDFF 50 8B4D08 51 push 00000777 call 0040A600 push eax mov ecx, dword ptr [ebp+08] push ecx

Donc si on change le 'jne 00435DAA' en 'je 00435DAA' le programme ira sur "Your registration has been entered successfully..." uniquement quand le code sera faux. Il faut donc changer 'jne 00435DAA' en 'je 00435DAA' donc 0F859B000000 devient 0F849B000000 (OF85xxxxxx devient OF84xxxxxx, et inversemment...cf MemenTo 1) On clique sur la ligne 00435D09 pour savoir quel offset modifier. (en effet dans la barre du bas, W32dasm nous indique l'offset ou on se trouve. cf MemenTo 1...). Ensuite prenez un diteur hxadcimal, allez l'offset et modifier '2.exe' comme indiqu prcedemment. Sauvegardez, et relancer le programme et essayez de vous enregistrez, rentrez un nom et un serial bidon. Bravo, mIRC et enregistr on constate galement que 'Register' ne figure plus dans le menu 'Help' En plus, votre nom apparait dans 'About' !! Quittez mIRC et relancez le programme et l....oh surprise, le programme n'est plus enregistr :( Et oui...comme la plupart des programmes mIRC effectue une vrification du nom/serial au dmarrage. On rflchit et on se souvient que lorsque on c'est enregistr le menu 'Register' avait disparut. On cherche alors dans 'Ref Menu' la reference 'Register' et on le trouve ! On sait galement que pour supprimer un menu le programme doit faire appel la fonction USER.DELETEMENU. On recherche donc un endroit ou on trouve une rfrence au menu 'Register' et la commande User.deletemenu. Cliquez donc plusieurs fois sur 'Register' jusqu' ce que vous trouviez 'Register' et un peu plus haut la commande qui permet de supprimer le menu. On la trouve, et cela nous donne cela :

:004923EA 681F024D00 :004923EF 8B4C240C :004923F3 51

push 004D021F mov ecx, dword ptr [esp+0C] push ecx

* Reference To: ADVAPI32.RegQueryValueA, Ord:0000h :004923F4 :004923F9 :004923FB :004923FD :004923FF E8CB4E0300 85C0 7565 6A02 68235F4D00 Call 004C72C4 test eax, eax jne 00492462 push 00000002 push 004D5F23

:00492404 E867B1FAFF :00492409 68235F4D00 :0049240E 55 :0049240F E864FEFFFF :00492414 85C0 :00492416 754A intresse... non) :00492418 8B0424 :0049241B 50

call 0043D570 push 004D5F23 push ebp call 00492278 test eax, eax jne 00492462 voil quelque chose qui nous (dtermine si le menu est affich ou mov eax, dword ptr [esp] push eax

* Reference To: ADVAPI32.RegCloseKey, Ord:0000h :0049241C E88B4E0300 :00492421 6A00 Call 004C72AC push 00000000

* Possible Ref to Menu: MenuID_0017, Item: "Register..." (Voil la rfrence qui nous intresse...) * Possible Reference to Dialog: DialogID_0033, CONTROL_ID:0085, "" :00492423 6885000000 :00492428 8B15C0204E00 :0049242E 52 push 00000085 mov edx, dword ptr [004E20C0] push edx

* Reference To: USER32.DeleteMenu, Ord:0000h (Et la commande permettant de supprimer le menu 'Register...'). La comme avant, il suffit de changer un je en jne donc jne 00492462 devient je 00492462 en hxadcimal 744A devient 754A Voil, comme avant notez l'offset modifier et allez les changez avec l'diteur hxadcimale, sauvegardez, relancez le mIRC. Puis rentrez une nom et un serial bidon, comme avant le programme vous dis "Thank...", quitter mIRC, relancez le et l bravo, mIRC et compltement crack, en effet notre nom et dans 'About' et 'Register' n'est plus la. [Conclusion :] C'tait pas trop dur, mIRC et un petit programme facile cracker, mais cela permet au moins d'acqurir un peu de pratique. A une prochaine fois pour un autre FlashTut....peut tre

Tutorial de Cracking
(13
ime

Partie)

Comment cracker un 'CD-CHECk' ? Exemple : Myth II

Matriel ncessaire : Wdasm32 Un diteur hxadcimal (Hex WorkShop ou Hedit par exemple) Mise en situation...

Quand vous lancez le jeu sans le CD, une image vous demande de l'inserer !Il n'y a pas de MessageBox, donc il faut proceder autrement que d'habitude... Pas de probleme, on va le cracker. Faites deux copies de MythII.exe. Appellez la premiere 'WDASMyth2.exe' et l'autre 'BAKUP.EXE'... Maintenant lancez W32DASM et desassemblez 'WDASMyth2.exe'. Quand le fichier est decompil cliquez sur le bouton 'Imports Functions'. Pourquoi 'Imports Funtions' and pas 'String Data reference' comme d'hab ? Parceque le message d'erreur n'est pas sous forme de MessageBox,mais est integr dans le jeu sous forme d'image. Dans les 'Imports functions', double-cliquez sur 'KERNEL32.GetDriveTypeA'. Cette fonction determine si un support est un CD-Rom ou un Disque Dur,et permet donc de realiser un 'Cd-CHECk' (en sus, il y a d'autres infos du style Nom_du_volume, taille_du_disque...) C'est donc cette fonction qui va nous interresser ! Au premier 'double-clique', vous tombez sur un petit bout de code... Ce n'est pas l'endroit qui nous interesse. Pourquoi ? Eh ben, sachez que la fonction GetDriveTypeA differencie le type de support suivant un code (de 1 a 7 je crois..) et le CD-Rom a le code '5'.Regardez donc en 4870D6...Si vous voyer une ligne comme ca a cot d'un GetDriveTypeA,vous pouvez etre quasi sur que c'est la routine du CDCheck ! Recliquez donc sur 'KERNEL32.GetDriveTypeA' afin d'atterir sur cette partie du code :

* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00487170(C) | * Possible Reference to String Resource ID=00001: "Myth II" | :004870B2 BA01000000 mov edx, 00000001 :004870B7 8ACB mov cl, bl :004870B9 D3E2 shl edx, cl :004870BB 8AC3 mov al, bl :004870BD 0441 add al, 41 :004870BF 88442410 mov byte ptr [esp+10], al :004870C3 85D5 test ebp, edx :004870C5 0F84A0000000 je 0048716B <-- jump vers le debut du CD-CHECK :004870CB 8D442410 lea eax, dword ptr [esp+10] :004870CF 50 push eax

* Reference To: KERNEL32.GetDriveTypeA, Ord:00DFh | :004870D0 FF1520495B00 Call dword ptr [005B4920] :004870D6 83F805 cmp eax, 00000005 <-- Verifie qu'il y a le CD. :004870D9 0F858C000000 jne 0048716B <-- Si non, jump au debut du 'CD-Check' :004870DF 8A0D103E5500 mov cl, byte ptr [00553E10] :004870E5 33C0 xor eax, eax <-- Le test 'Cd-Check' a chou :004870E7 884C2418 mov byte ptr [esp+18], cl :004870EB B93F000000 mov ecx, 0000003F

:004870F0 8D7C2419 :004870F4 6A00 :004870F6 F3 :004870F7 AB :004870F8 66AB :004870FA 6A00 :004870FC 6A00 :004870FE 6A00 :00487100 6A00 :00487102 AA :00487103 8D54242C :00487107 68FF000000 :0048710C 8D442428 :00487110 52 :00487111 50 . .. ... ....

lea edi, dword ptr [esp+19] push 00000000 repz stosd stosw push 00000000 push 00000000 push 00000000 push 00000000 stosb lea edx, dword ptr [esp+2C] push 000000FF lea eax, dword ptr [esp+28] push edx push eax

Un peu plus loin dans le listing, vers la fin de la routine du 'CD-Check'... * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00487156(U) | :0048715D 85C0 test eax, eax <-- Test si eax=0 :0048715F 741B je 0048717C <-- jump si vous avez le CD (eax=0) :00487161 EB08 jmp 0048716B <-- Jump vers le 'CD-CHECk' (eax<>0)

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:004870C5(C), :004870D9(C), :00487161(U) | :0048716B 43 inc ebx <- ici, ebx est increment a chaque passage :0048716C 6683FB19 cmp ebx, 0019 <- au bout de 20 passage on quitte le Cd Check :00487170 0F8E3CFFFFFF jle 004870B2 <- Appelle GetDriveTypeA :00487176 8B442414 mov eax, dword ptr [esp+14] :0048717A EB05 jmp 00487181 <-- Le 'CD-check' a chou.

* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0048715F(C) | * Possible Reference to String Resource ID=00001: "Myth II" | :0048717C B801000000 mov eax, 00000001 <-- Ok, le Cd est reconnu !

* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0048717A(U) | :........ ........... ................... => vers la suite du listing...

Bon, maintenant je vous explique...

C'est assez simple : l'histoire commence en 487170.... On arrive d'on-ne-sais-ou et voici donc que le programme va se demandez si oui ou non vous avez le CD...Alors en 4870C5 il y a un jump vers la boucle du 'Cd-Check'.Une boucle ?? Ben oui, a chaque passage on incremente 'ebx', et au bout de 20 fois, on rend le 'verdict' :) Ne me demandez pas pourquoi ca se passe comme ca, c'est pas important de toute facon... Donc, apres avoir increment 'ebx', s'il est inferieur a 19 on repart en 487170. Sauf que cette fois, le saut en 4870C5 ne se fera pas car 'ebp' n'est plus egale a 'edx' (si vous regardez bien, on peut supposer que c'est 'ebp' qui change pendant la routine du CD-Check puisque 'edx' est initialis a 1 des le debut de 487170...'ebp' doit etre modifier dans les lignes que je vous ai coup, de toute facon c'est pas important). Donc comme on saute pas ce coup si, on passe a GetDriveTypeA...Arriv la, la fonction regarde s'il y a un CD ou non...Et donc on va se taper le saut car on a pas de CD ! Il faudra donc penser a remplacer ce 0F85 (jne) par un 0F84 (je) qui annulera ce saut...

Imaginons qu'on est annul ce saut: on continue notre epope et arriv a un moment de la routine (dans les lignes que j'ai coup), le programme determine si le support correspond a un CD original de Myth 2 (voir 48715D). On voit qu'il saute de facon inconditionnel en 48716B si le premier saut n'est pas execut. Or 48716B c'est la 'boucle des 20 passages', la ou il faut pas aller !! On en deduit donc que le saut en 48715F, c'est la ou il faut aller :) Alors la, c'est simple, il suffit de forcer le 741B (JE) en EB1B (JMP) (cf 48715F) Bon, ben voila si on recapitule, il faut d'abord annuler le saut en 4870D9 puis forcer le saut en 48715F... Voulez-vous une autre methode pour niquer le CD-Check ?? (ouiiiiiii) Mmm...mais alors c'est parceque c'est vous :) Bon, sans rire, regard la difference entre le saut de 48715F et celui qui est en 48717A, a la fin du 'CD-Check'...Ben la seule difference c'est qu'avec le premier vous passez par une ligne supplementaire : :0048717C B801000000 mov eax, 00000001 Donc, en fait, on pourrait tout simplement nopper le saut en 48717A et on irai toujours sur ce 'mov eax, 00000001'...valavalou :)) Il suffirait alors de mettre un 9090 a la place du EB05 (cf 48717A) et le jeu serait crack...Cool non ?? (Au fait, cette methode marche avec toutes les versions de Myth 2.) Bon, alors la vous venez d'apprendre a cracker un jeu commercial d'une grosse boite...Vous voyez, c'est pas si dur :)) En tout cas, soyez sur que c'est pas toujours aussi simple.Ceci dit, vous pouvez cracker pas mal de jeu comme ca :)

Cours de Cracking
(14
ime ime

Partie)

Dans le 5 cours de cracking, Smeita vous avait expliqu comment faire son propre patcheur via le language Pascal et son compilateur TPC... Maintenant, nous allons voir comment faire un patch mais plus voluer qui tiendra compte de plus de paramtres avec notamment une verification CRC du fichier a patcher ! Comme dans le 5 cours de cracking, je vous donne le code comment, puis un exemple sans les commentaires ! Ici, les textes en rouge sont ceux que vous devez modifier pour faire correctement votre patcheur. Les texte en jaune sont ceux que vous pouvez modifier pour des raisons esthetique...Le reste, pas touche !! Essayer de bien comprendre, ca sera deja bien :) Bien sur, il faut savoir que certains passages ne sont pas vidents expliqus, ainsi j' ai essayer de faire le plus simple possible ;)
ime

------------------------- debut -------------------------Program Crack; Uses CRT, DOS; Const FileN //juste pour indiquer le nom du prog //indique quel' on va utiliser des //routines graphiques DOS //indique que l' on va charger des constantes //en mmoire pour les rutiliser par la suite : String = 'progde~1.exe'; //FileN va donc indiquer //le fichier 'progde~1.exe' //ds que l' en aurat besion

BytesToChange : Integer = 2;

//2 indique le nombre d' octects //patcher

FileS A

: LongInt = 564132; : Array[1..2] of Record

//564132 indique la taille du fichier. //Elle s' xprime en octects //indique que l' on va donner //de modification allant de //1 2, ici en octects

A : Longint; B : Byte; End = ( (A:$303e6;B:$90), (A:$47274;B:$90) ); Var F Ch Attr I Begin Textcolor(13); clrscr; //pour choisir la couleur de ce qui va s' afficher l' cran : : : : File; Char; Word; LongInt; //adresses hxadcimales modifier et leurs octects //attention !! sur la derniere ligne=> pas de virgule !!!!

//efface l' cran, WriteLn ne se charge donc que d' afficher un texte, //juste une question de prsentation

Writeln('cRACk fOR Writeln('cRACk tYPE Writeln('cRACKED bY Writeln(''); Writeln('cONTACT Writeln('wEBsITE Writeln('gREETiNGz Writeln('');

: Prog de merde v0.0'); : Auto-registration!'); : NoOne'); : monmail@cacamail.com'); : www.monsite.com'); : Everybody !');

If (FSearch(FileN,FExpand(FileN))='') then

//cherche le fichier FileN, //S'il est non prsent, //alors => Message d'erreur...

Begin Textcolor(12); Writeln('oOOPS!: File ',FileN,' not found !!!'); Writeln('-Current bad size has: ', FileSize (F),' bytes.'); Writeln('-Good size should be : ', FileS ,' bytes.'); Writeln('Crack aborted...'); Halt(1); end;

Assign(F,FileN); Reset(F,1);

//pour ouvrir un fichier

TextColor(8); Write('Checking FileSize...'); If FileSize(F)<>FileS then begin //FileSize verifie la taille du fichier...

//dbut du mesage d' erreur //(si le fichier cible n'a pas la bonne taille..)

TextColor(12); Writeln('ERROR!'); TextColor(07); Writeln(''); Textcolor(12); Writeln('File ',FileN,' has an invalid Size !!!'); Writeln('Crack aborted...'); Close(F); Halt(1); end Else begin Writeln('OK'); end; //ce qui suit est le "patchage" des octets... //inscrit OK juste aprs 'Checking FileSize...' //on ferme le fichier //on arrete le prog //fin du passage affichant une erreur...

//fin de la reconnaissance le la taille du fichier

TextColor(8); Write('Cracking ',FileN,'...'); For I := 1 to BytesToChange do begin Seek(F,A[I].A); Ch:=Char(A[I].B);

//Et hop!, on rutilise encore ',FileN,' //change les octect de 1 ...'x'

//repere l'offset a patcher //on identifie la nouvelle valeur de l'offset //et on la stock dans 'Ch'

Blockwrite(F,Ch,1); //ouf! Aprs toutes les conditions remplis, le prog va //enfin pouvoir modifier le fichier cible en inscrivant //des octects par blocs de 1, tels qu'ils sont indiqus //par (A:$303e6;B:$00) et (A:$47274;B:$00) dans l'exemple. end; Writeln('OK'); //inscrit OK juste aprs 'Cracking ',FileN,'...' Close(F) // Pour fermer le fichier //message de russite du patchage :))

TextColor(10); Writeln('CrACk Successful!');

------------------------- Fin --------------------------

Voila !! Vous pourrez constatez que c'est deja plus consistant que le premier patch ! En plus, la verification CRC permet d'eviter de patcher une mauvaise version d'un programme... Bon, maintenant, on vous donne un apercu de ce que ca donne sans les commentaires... Le compilateur turbo pascal est ici ------------------------- debut -------------------------Program Crack; Uses CRT, DOS; Const FileN : String = 'progde~1.exe';

BytesToChange : Integer = 2; FileS : LongInt = 564132; A : Array[1..2] of Record A : Longint; B : Byte; End = ( (A:$303e6;B:$90), (A:$47274;B:$90) ); Var F Ch Attr I Begin Textcolor(13); clrscr; Writeln('cRACk fOR Writeln('cRACk tYPE Writeln('cRACKED bY Writeln(''); Writeln('cONTACT Writeln('wEBsITE Writeln('gREETiNGz Writeln(''); : Prog de merde v0.0'); : Auto-registration!'); : NoOne'); : monmail@cacamail.com'); : www.monsite.com'); : Everybody !');

: : : :

File; Char; Word; LongInt;

If (FSearch(FileN,FExpand(FileN))='') then begin Textcolor(12); Writeln('oOOPS!: File ',FileN,' not found !!!'); Writeln('-Current bad size has: ', FileSize (F),' bytes.'); Writeln('-Good size should be : ', FileS ,' bytes.'); Writeln('Crack aborted...'); Halt(1); end; Assign(F,FileN); Reset(F,1); TextColor(8); Write('Checking FileSize...'); If FileSize(F)<>FileS then begin TextColor(12); Writeln('ERROR!'); TextColor(07); Writeln(''); Textcolor(12); Writeln('File ',FileN,' has an invalid Size !!!'); Writeln('Crack aborted...'); Close(F); Halt(1); end else begin Writeln('OK'); end; TextColor(8); Write('Cracking ',FileN,'...');

For I := 1 to BytesToChange do begin Seek(F,A[I].A); Ch:=Char(A[I].B); Blockwrite(F,Ch,1); end; Writeln('OK'); Close(F) TextColor(10); Writeln('CrACk Successful!'); end. ------------------------- Fin --------------------------

N.B: Certains progs, vont chercher un fichier dat et refusent de demarrer. Alors, pour ne pas vous galrer, une ptite ligne Pascal va vous permettre de crer un fichier vide. Pour cela il faut d' abord dclarer une variable puis l' exploiter de la faon suivante:

Var k: text;
puis:

Assign(k,'Info.dat'); Rewrite(k);
Ceci est a placer avant la ligne "If

(FSearch(FileN,FExpand(FileN))='') then".

Allez, bonne chance a tous et a bientot !