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.

<<< Cours précédent    Cours suivant >>>