Cours de Cracking Lecon 1
Cours de Cracking Lecon 1
Cours de Cracking Lecon 1
Cours de Cracking
(1 ime 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 les cours. Chaque cours est la suite du prcdent et de niveau croissant en difficult (rassurez vous on va faire dans la simplicit en expliquant au maximum les points pouvant paratre obscurs).
d'excuter ligne de code par ligne de code le programme craquer. Par ailleurs il vous faut aussi ce qu'on appelle un diteur hexadcimal. Comme son nom l'indique aussi, il sert faire apparatre un fichier sous forme hxadcimale. C'est cet diteur qui nous permet de modifier physiquement le comportement du programme et donc de le craquer en remplaant une suite d'octets par une autre. Mon prfer c'est WinHex 10.2 , mais il y a ausi HexWorks 3.X. N'importe quel diteur hexadcimal fera l'affaire. Enfin, il vous faudra dans tous les cas (enfin presque) un cerveau rveill et en tat de marche ;)
4/ Le listing de dsassemblage.
Ben oui, ce que vous voyez maintenat l'cran c'est du code en 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 C ou en Delphi, tout est traduit en assembleur pour que votre programme soit comprhensible par l' ordinateur,
file:///I|/pifoman/cours_cracking_01.htm (2 sur 9)24/02/2007 12:36:25
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 "c'est quoi ce charabia incomprhensible, je quitte a et je retourne tlcharger des cracks tous faits sur internet". 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 "ce truc, c'est bizarre mais j'ai envie d'appronfondir et de savoir comment on s'y prend pour cracker" ; alors la suite de ce tutorial est pour vous ;)). Bon, ce qui apparat l'cran a s'appelle un listing de dsassemblage. C'est l dessus que l'ont va travailler.
Avant de poursuivre ayez l'esprit que les instructions successives d'un programme s'excutent toujours de bas en haut et de gauche droite : c'est le sens naturel de lecture.
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 d'autres endroits 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 arrtez vous la seconde occurence de "name " (qui doit etre trouve a la ligne 423 comme indiqu en bas de cette photo qui reprsente une partie de listing de dsassemblage cre plus haut).
On se trouve alors un endroit particulirement intrressant. Mais alors pourquoi cet endroit est t-il si intressant me direz-vous ? Parce que si l'on observe bien cette petite partie (ce qu'il y a avant et aprs...), on remarque que l'indication *Reference To: ADVAPI32. RegCreateKey, Ord: 00C6h est affiche. Cette indication de fonction indique que STARTCLN.EXE 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 Registry). L'instruction que l'on recherche est un saut conditionnel. En assembleur, a se traduit par : JNE, JNZ... (jump if not equal (to zro), jump if not zro) qui sont des sauts appels sauts de "non egalit"... JE, JZ.... (jump if equal (to zro), jump if zro) qui sont des sauts qui s'effectuent en cas d'galit"... Egalit signifie ici "deux valeur identique". Lorsque que le programme va comparer votre code avec le vrai, il va indiquez s'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 dira que "le saut se fait si les codes ne sont pas egaux"... Il existe un type de saut appel inconditionnels, c'est a dire que le saut s'effectue sans conditions (on saute tout le temps).Ce saut s'ecrit avec une instruction JMP en assembleur, mais cela ne nous servira pas pour ce tutorial. Donc, pour revenir a STARTCLN.EXE, il va falloir qu'on trouve tout les sauts qu'il y a dans le bout de code ci dessus, puis qu'on analyse o est-ce qu'ils nous font sauter. On est chanceux, ici il n'y a qu'un seul saut qui est a l'adresse 004011EB, et qui est situe juste apres un test (un TEST est l'instruction qui determine si une valeur est gale zro) et juste au dessus de la chane "name" trouve.On a donc :
L'instruction assembleur jne 00401271 signifie : "Sauter l'adresse 00401271 si la valeur teste ici eax n'est pas gale zro". Cette instruction est intressante car il y a fort parier que la valeur teste soit le numro de srie que vous avez rentr au pif. En effet au dessus on voit que le programme fait appel une API (Application Interfcace Programming) nomme Kernel32 qui est un fichier sur votre disque dur (le
file:///I|/pifoman/cours_cracking_01.htm (4 sur 9)24/02/2007 12:36:25
fichier kernel32.dll dans C:\windows\system32). C'est dans cette dll (Dynamic Link Librairie <=> bibliothque de liens dynamiques) qu'est encode la fonction de comparaison de chanes nomme lstrcmpA ( l' API Kernel32.lstrcmpA va comparer votre numro de srie encore appel serial dans la terminologie anglo-saxone avec le vrai serial calcul par l'application). Il faut bien comprendre que souvent, un numro de srie est considr comme valide lorsque la valeur du test est gale a zro. Autrement, dans le cas o le test n'est pas gal zro, alors ce numro est reconnu comme incorrect. C'est un peu comme le courant electrique : 0 = ouvert et 1 = ferm. Compris ? Donc, "sauter a l'adresse 00401271 si la valeur teste n'est pas egale a zro" 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 o le saut nous amne).
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. * Reference To: ADVAPI32.RegCreateKeyExA, Ord:00C6h :00401218 FF1500924000 Call dword ptr [00409200] ... * Reference To: ADVAPI32.RegSetValueExA, Ord:00ECh :0040122C 8B35FC914000 mov esi, dword ptr [004091FC] ... * Possible StringData Ref from Data Obj ->"Name" :00401236 6838624000 push 00406238 ... * Possible StringData Ref from Data Obj ->"Code" :00401250 6830624000 push 00406230 ... * Reference To: ADVAPI32.RegCloseKey, Ord:00C2h :0040125D FF15F0914000 Call dword ptr [004091F0]
Par contre, si le code est bon, le saut ne s'effectue pas et le programme va continuer son listing en passant sur ls lignes du dessus.
L encore c'est une API qui est utilise ADVAPI32.dll qui est utilise -> pour crer une cl dans le registre de windows on utilise la fonction RegCreateKeyExA). -> pour assigner une valeur cette clef on utilise la fonction RegSetValueExA. Le mot Reg est une abrviation de Registry (registre en franais. Le registre est la base de paramtrage du systme windows, du mattriel et des applications installs sur votre machine; en d'autres termes c'est une
grosse base de donnes et le coeur des systmes windows). 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 petit cour sur l'hexadcimal s'impose :))
6/ L'hexadcimal.
D'abord oubliez la faon dons vous avez appris compter. Parce qu' en hexadcimal, on compte le la faon suivante : Dcimal Hexadcimal 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 A 11 B 12 C 13 D 14 E 15 F
Par exemple 15 en dcimal s' ecrit F en hexadcimal. Mais pouquoi dit-on hxadcimal ? Tout simplement parce qu' aprs les neufs premier chiffres il y six lettres, 6 d'o hexa, comme un hxagone a six cots ;) Sinon pour ce qui est des conversions et tout, nous verrons a dans un autre tutorial ;)
Assembleur Hexadcimal
NOP JNE JE JMP XOR RET 90 75 ou 0F85 74 ou 0F84 EB ou E9 33 C3
Il existe encore beaucoup d'autres instructions, mais qui sont peu intressantes notre stade ;) Pour illustrer ce tableau prenons un exemple. Regardons le code hexadcimal 0F8580000000 se trouvant la gauche de l'instruction jne 00401271 dans le listing l'adresse 004011EB. C'est en fait la valeur traduite en hexadcimale de l'instruction assembleur jne 00401271. 0F85 c'est jne et 80000000 c'est la zone mmoire mmoire o l'on saute. Une zone 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 bien la porte c'est le bloc mmoire et le postit l'information ;)
Remarque : 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 W32DSM89.EXE qui verrouille toujours un fichier en criture quand celui-ci est ouvert dedans. Il empche ainsi d'crire sur ce fichier avec un autre logiciel comme notre diteur hexadcimal winhex par exemple.
Miracle ? Non, c'est a la magie de l'assembleur ;))) PS : je ne dis pas a pour vous dcourager, mais pour un cracker consquent, un tel raisonnement, observations et crack compris, ce type de scurit retirer ne prend que deux trois minutes et encore. Alors entranez vous bien et vous verrez, c'est pas si compliqu que a en l'air ;)
-> Ne pas rester tout le temps dans le dsassembleur et naviguer de faon quilibr entre ce dernier et l'diteur hxa. -> Faire pleins d'essais avec l'diteur hexadcimal. -> Dsassemblez le fichier d'origine et travailler sur une copie du fichier dans l'diteur hexadcimal. -> Toujours vrifier si l'effet d'une modification dans l'diteur hexdcimal est bien celui attendu dans le programme.
and