You are on page 1of 53

Tutorial de Cracking

ime
(1 Partie)

Mon objectif :
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
ime
(2 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
ime
(3 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
ime
(4 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
ime
(5 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; // Pas touche


Uses Crt; // Pas touche

Const A: Array[1..5] of Record // 5 correspond au nombre de


// byte que vouz changez
// Ca pourrait etre 1 ou 60 selon le cas !

A : Longint; // Pas Touche


B : Byte; // Pas Touche
End = // Pas Touche
( // Pas touche

(A:$EE34;B:$90), // (A:$offset;B:$nouvelle valeur),


(A:$EE35;B:$90), // comme il y a 5 changements, ben ya 5 lignes !
(A:$EE36;B:$90), // Vous remarquez que la valeur que l'on modifie, on
s'en
(A:$EE37;B:$90), // tamponne !! on met direct le NOP !
(A:$EE38;B:$90) // ATTENTION, sur la dernire ligne pas de
// virgule!

); // Pas touche
Var // Pas touche
Ch:Char; // Pas touche
I:Byte; // Pas touche
F:File; // Pas touche
FN:file of byte; // Pas touche
Size:longint; // Pas touche
Procedure Presentation; // Pas touche
Begin // Pas touche
Gotoxy(2,3); // 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 : Prog De Merde v9.5');


Writeln('cRACk tYPE : fuck the time limit');
Writeln('cRACKED bY : yournamehere');

Writeln('');
Writeln('gREETiNG : mes amis, monchien...');

Writeln (''); // ca fait une ligne blanche...

end; // Pas touche


Begin // Pas touche
Presentation; // 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+} // Pas touche


If IOResult <> 0 then // Pas touche
begin // Pas touche

writeln('fILE nOT fOUND!'); // Si le fichier est pas


// trouv, il affiche le msg..

halt(0); // Pas touche


end; // Pas touche

For I:=1 to 5 do // Tu remet le nombre de byte que t'as


// changs (dans cet exemple, on a fait 5
changement)

Begin // Pas touche


Seek(F,A[I].A); // Pas touche
Ch:=Char(A[I].B); // Pas touche
Blockwrite(F,Ch,1); // Pas touche
End; // Pas 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 : StartClean v1.2');
Writeln('cRACk tYPE : Enter Any registration name and code!');
Writeln('cRACKED bY : Smeita');

Writeln('');
Writeln('gREETiNG : A tous ceux qui lisent mon tutorial');

Writeln ('');

end;
Begin
Presentation;

Assign(F,'STARTCLN.EXE ');
{$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
ime
(6 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
ime
(7 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
ime
(8 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
ime
(9 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 reverse-
enginnering itout. (enfin bref, ca fonctionne plutot bien :)).

Tutorial de Cracking
ime
(10 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 B89824600 mov eax, 00468290


:004681C1 E8EEBDF9FF call 00403FB4
:004681C6 85C0 test eax, eax
:004681C8 7420 je 004681EA => si mauvaise rponse, aller 004681EA

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

:004681CA B8AC824600 mov eax, 004682AC


:004681CF E8104D4DFF call 0043CEE4
:004681D4 A1B0EA4700 mov eax, dword ptr [0047EAB0]
:004681D9 8B00 mov eax, dword ptr [eax]
:004681DB 8B80F0010000 mov eax, dword ptr [eax+000001F0]
:004681E1 C7400C64000000 mov eax, dword ptr [eax+0C], 00000064
:004681E8 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
ime
(11 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 A114B7B310 mov eax,dword ptr [10B3B414]


:10B1C3DA 833800 cmp dword ptr [eax], 00000000 //Regarde si
eax=0
:10B1C3DD 75E3 jne 10B1C41D
:10B1C3DF 8D8DE49FFFF lea ecx, dword ptr[ebp+FFFFFF9E4]
:10B1C3E5 51 puch ecx
:10B1C3E6 FFD3 call ebx
:10B1C3E8 83C404 add esp, 00000004
:10B1C3EB 85C0 test eax, eax //Test
:10B1C3ED 7F2E jg 10B1C41D //meme saut qu'en 10B1C3DD...
:10B1C3EF 680120000 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
ime
(12 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 E80B1C0900 Call 004C79BC


:00435DB1 68E9AD4C00 push 004CADE9
:00435DB6 6A00 push 00000000
:00435DB8 6A0C push 0000000C

* Possible Ref to Menu: MenuID_0017, Item: "Search..."

* Possible Reference to Dialog: DialogID_0033, CONTROL_ID:0083,

:00435DBA 6883000000 push 00000083


:00435DBF 8B5508 mov edx, dword ptr [ebp+08]
:00435DC2 52 push edx

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

:00435DC3 E8481C0900 Call 004C7A10


:00435DC8 68EBAD4C00 push 004CADEB
:00435DCD 6A00 push 00000000
:00435DCF 6A0C push 0000000C

* Possible Ref to Menu: MenuID_0017, Item: "Contents"

* Possible Reference to Dialog: DialogID_0033, CONTROL_ID:0082, "

:00435DD1 6882000000 push 00000082


:00435DD6 8B4D08 mov ecx, dword ptr [ebp+08]
:00435DD9 51 push ecx....

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

:00435DDA E8311C0900 Call 004C7A10


:00435DDF 6A10 push 00000010
:00435DE1 6A00 push 00000000.

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

:00435DE3 6878070000 push 00000778


:00435DE8 E81348FDFF call 0040A600
:00435DED 50 push eax
:00435DEE 6A00 push 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 6879070000 push 00000779
:00435DF5 E80648FDFF call 0040A600
:00435DFA 50 push eax
:00435DFB 8B4508 mov eax, dword ptr [ebp+08]
:00435DFE 50 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 E80B1C0900 Call 004C79BC


:00435DB1 68E9AD4C00 push 004CADE9
:00435DB6 6A00 push 00000000
:00435DB8 6A0C push 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 68D6AD4C00 push 004CADD6


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

* Possible Ref to Menu: MenuID_0017, Item: "Register..."

* Possible Reference to Dialog: DialogID_0033, CONTROL_ID:0085, ""

:00435D60 6885000000 push 00000085


:00435D65 A1C0204E00 mov eax, dword ptr [004E20C0]
:00435D6A 50 push eax

* Reference To: USER32.DeleteMenu, Ord:0000h (ici il appelle la fonction


qui efface 'Register' du menu)

:00435D6B E8541A0900 Call 004C77C4


:00435D70 6A01 push 00000001
:00435D72 8B5508 mov edx, dword ptr [ebp+08]
:00435D75 52 push edx

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

:00435D76 E89D1A0900 Call 004C7818

* Possible Reference to Dialog: DialogID_0040

:00435D7B 6A40 push 00000040


:00435D7D 6A00 push 00000000

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


:00435D7F 6878070000 push 00000778
:00435D84 E87748FDFF call 0040A600
:00435D89 50 push eax
:00435D8A 6A00 push 00000000

* Possible Reference to String Resource ID=01911:


"Your registration has been entered successfully...Thanks for."

:00435D8C 6877070000 push 00000777


:00435D91 E86A48FDFF call 0040A600
:00435D96 50 push eax
:00435D97 8B4D08 mov ecx, dword ptr [ebp+08]
:00435D9A 51 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 push 004D021F


:004923EF 8B4C240C mov ecx, dword ptr [esp+0C]
:004923F3 51 push ecx

* Reference To: ADVAPI32.RegQueryValueA, Ord:0000h

:004923F4 E8CB4E0300 Call 004C72C4


:004923F9 85C0 test eax, eax
:004923FB 7565 jne 00492462
:004923FD 6A02 push 00000002
:004923FF 68235F4D00 push 004D5F23
:00492404 E867B1FAFF call 0043D570
:00492409 68235F4D00 push 004D5F23
:0049240E 55 push ebp
:0049240F E864FEFFFF call 00492278
:00492414 85C0 test eax, eax
:00492416 754A jne 00492462 voil quelque chose qui nous
intresse...
(dtermine si le menu est affich ou
non)
:00492418 8B0424 mov eax, dword ptr [esp]
:0049241B 50 push eax

* Reference To: ADVAPI32.RegCloseKey, Ord:0000h

:0049241C E88B4E0300 Call 004C72AC


:00492421 6A00 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 push 00000085


:00492428 8B15C0204E00 mov edx, dword ptr [004E20C0]
:0049242E 52 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
ime
(13 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 CD-
Check !

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 lea edi, dword ptr [esp+19]
:004870F4 6A00 push 00000000
:004870F6 F3 repz
:004870F7 AB stosd
:004870F8 66AB stosw
:004870FA 6A00 push 00000000
:004870FC 6A00 push 00000000
:004870FE 6A00 push 00000000
:00487100 6A00 push 00000000
:00487102 AA stosb
:00487103 8D54242C lea edx, dword ptr [esp+2C]
:00487107 68FF000000 push 000000FF
:0048710C 8D442428 lea eax, dword ptr [esp+28]
:00487110 52 push edx
:00487111 50 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
ime
(14 Partie)

ime
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 !

ime
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 ;)
------------------------- debut --------------------------
Program Crack; //juste pour indiquer le nom du prog

Uses CRT, DOS; //indique quel' on va utiliser des


//routines graphiques DOS

Const //indique que l' on va charger des constantes


//en mmoire pour les rutiliser par la suite

FileN : 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 : LongInt = 564132; //564132 indique la taille du fichier.


//Elle s' xprime en octects

A : Array[1..2] of Record //indique que l' on va donner


//de modification allant de
//1 2, ici en octects

A : Longint;
B : Byte;

End =

(
(A:$303e6;B:$90), //adresses hxadcimales modifier et leurs octects
(A:$47274;B:$90) //attention !! sur la derniere ligne=> pas de virgule !!!!
);

Var

F : File;
Ch : Char;
Attr : Word;
I : LongInt;

Begin

Textcolor(13); //pour choisir la couleur de ce qui va s' afficher l' cran

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

Writeln('cRACk fOR : Prog de merde v0.0');


Writeln('cRACk tYPE : Auto-registration!');
Writeln('cRACKED bY : NoOne');
Writeln('');
Writeln('cONTACT : monmail@cacamail.com');
Writeln('wEBsITE : www.monsite.com');
Writeln('gREETiNGz : Everybody !');
Writeln('');

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 //FileSize verifie la taille du fichier...

begin //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); //on ferme le fichier


Halt(1); //on arrete le prog
end //fin du passage affichant une erreur...

Else

begin //ce qui suit est le "patchage" des octets...

Writeln('OK'); //inscrit OK juste aprs 'Checking FileSize...'

end; //fin de la reconnaissance le la taille du fichier

TextColor(8);
Write('Cracking ',FileN,'...'); //Et hop!, on rutilise encore ',FileN,'

For I := 1 to BytesToChange do //change les octect de 1 ...'x'

begin
Seek(F,A[I].A); //repere l'offset a patcher

Ch:=Char(A[I].B); //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

TextColor(10);
Writeln('CrACk Successful!'); //message de russite du patchage :))

------------------------- 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 : File;
Ch : Char;
Attr : Word;
I : LongInt;

Begin

Textcolor(13);
clrscr;

Writeln('cRACk fOR : Prog de merde v0.0');


Writeln('cRACk tYPE : Auto-registration!');
Writeln('cRACKED bY : NoOne');
Writeln('');
Writeln('cONTACT : monmail@cacamail.com');
Writeln('wEBsITE : www.monsite.com');
Writeln('gREETiNGz : Everybody !');
Writeln('');

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 !

You might also like