Cours n°1 : L'hexadécimal et les sauts conditionnels
Comprendre l'hexadécimal ?
Tout d'abord ouvrez
le cracke-me avec WinDasm (si vous ne savez pas l'utiliser allez voir le cours
précédent). Vous devez apercevoir des lignes semblables à celle-ci :
Le nombre en bleu est l'adresse de la ligne pour WinDasm.
Le nombre en blanc est les instructions en hexadécimal.
C'est ça qu'on recherchera dans l'éditeur hexadécimal et qu'on
modifiera.
Les mots et nombres en rouge sont les instructions
en assembleur du programme désassemblé. C'est un peu la "traduction"
de l'adresse hexadécimal.
Exemple :
:0040100E E839000000
Call 0040104C
:00401013
83F807
cmp eax, 00000007
:00401016
EB1A
jmp 00401032
:00401018
6A40
push 00000040
En décimal vous compter comme ça :
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
16...
Et bien en hexadécimal on
compte de cette manière :
0 1 2 3
4 5 6 7 8 9 A B C D E F
Par exemple 15 s'écrira F, 16 => 10, 17=> 11, 26=> 1A ...etc...
Les adresses de WinDasm sont en hexadécimal et dans l'ordre croissant, mais il ne les met pas toutes comme on peut le voir dans l'exemple ci-dessus.
Qu'est qu'un saut conditionnel ?
Je vais d'abord vous
faire un schéma d'une protection utilisée presque tout le temps.
JNE est un saut conditionnel. Il saute si le code est faux (saut si pas égal).
JMP est aussi un saut. Il saute obligatoirement (saut).
Et ça donne à peu près ça en assembleur :
:00401001
&&&& Teste
si le code est bon.
:00401002 7502
jne
00401004
<<<
"jne" est un saut conditionnel. Il saute au 00401004
si le code est faux (jne = saut si pas égal) ou
continue sa route si le code est bon.
* Possible StringData Ref from Data Obj ->"Le code est bon "
<<< Message d'une boîte de dialogue
:00401003 EB04
jmp
00401005 <<<
"jmp" est aussi un saut ( jmp = saut). Le numéro à sa droite est
l'adresse où il va sauter.
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401002(U)<<^^ Il indique que le message suivant est appelé
par un saut conditionnel (l'adresse de celui-ci est à gauche du"(U)"
: 00401002)
:00401004
&&&& push
&&&&&
* Possible StringData Ref from Data Obj ->"Le code n'est pas bon "
:00401005
&&&&
&&&&&
Après ces schémas, vous avez donc compris (du moins je
l'espère) que c'est le JNE qu'il faut changer. Mais vous allez me dire : "Comment
qu'on change un saut conditionnel"?
Regardez le schéma en assembleur et plus
précisement la ligne 00401002 avec le jne. Dans le code hexa, on voit 7502. Et
bien le 75 c'est notre JNE. Tout comme le JMP qui
correspond à EB.
Voici une petite liste de sauts conditionnels que vous
pourrez trouver le plus souvent :
Saut conditionnel |
Valeur en hexadécimal | Description |
jne | 75 ou 0F85 | Saut si non égal |
je | 74 ou 0F84 | Saut si égal |
jmp | EB | Saut |
nop | 90 | Pas d'opération |
Pour modifier un saut, il suffira donc de rechercher sa valeur et de la modifié avec l'éditeur hexadécimal. Par exemple pour le schéma ci-dessus on mettra un JE (il sautera à "Code bon" si le code est mauvais ) ou NOP (il ne sautera pas du tout et ira donc dirtectement vers "Code bon") à la place de JNE.
Aprés la théorie place à la pratique, dans le cours n°2
nous essaierons de cracker un cracke-me.