Les bases de l'asm

 

Introduction 

    Quoi de plus ardu que d'essayer de r�sumer l'asm pour n'en garder que l'essentiel. De plus, comment voulez-vous poss�der un bon niveau de programmeur mais aussi d'analyste si des instructions vous font d�faut? D'un autre c�t�, rien ne sert de se leurrer, peu sont ceux qui peuvent se vanter de conna�tre toutes les instructions sur le bout des doigts ainsi que toutes les astuces qui en d�coulent. C'est pourquoi je ne perdrais pas ici mon temps � d�tailler toutes les instructions ni � faire du plagia (en cherchant un peu, Google regorge de tutos plus ou moins bien expliqu�s et complets sur l'asm). Je vais simplement pr�senter bri�vement l'asm et faire un bref rappel de quelques instructions qui me semblent int�ressantes pour le cracking mais sans rentrer dans les d�tails techniques, ainsi que de quelques astuces utilis�es avec celles-ci. Libre � vous de continuer votre apprentissage sur d'autres sites.

 

Les registres

    Les registres principaux sont : EAX, EBX,ECX, EDX, EDI, ESI, EBP, ESP, EIP et les Flags.

    Ce sont des petites zones de stockage log�es dans le processeur auxquels il a un acc�s tr�s rapide (beaucoup plus rapide qu'en m�moire).

    Ils ont tous une taille de 32 bits (4 bytes).

    EAX, EBX, ECX et EDX sont les registres de travail. La partie basse (les 16bits de poids fort) de chacun d'eux peut �tre utilis�e directement mais reste une partie du registre de 32bits, c'est � dire que s'il l'on modifie AX (la partie basse de EAX), on modifiera EAX. En plus de cela, la partie basse peut �tre de nouveau s�par�e en 2 parties de 8bits (la partie haute AH et la partie basse AL pour AX, BH et BL pour BX, ...). De nouveau si l'on modifie l'une des 2 parties, c'est tout le registre qui est modifi� (AX est modifi� donc EAX aussi).   

    EDI et ESI servent principalement pour des instructions d'adressage (lors de traitements de cha�nes de caract�res par exemple) mais peuvent aussi servir de registres de travail.

    EBP et ESP sont des registres de pile, ESP d�signe toujours le sommet de la pile. EBP permet de travailler dans la pile sans devoir utiliser ESP qu'il ne vaut mieux pas modifier.

    EIP d�signe l'adresse de l'instruction courante.

    Le registre de Flags est un registre dont chaque bit (indicateur) indique un �tat. Les instructions arithm�tiques, logiques et de comparaison modifient la valeur des indicateurs.

 

La pile

    La pile est un espace m�moire r�git par le syst�me LIFO (Last In First Out). La derni�re valeur � avoir �t� empil�e sera la premi�re � �tre d�pil�e. Imaginez une pile d'assiettes : la derni�re que vous avez d�pos�e sur le paquet sera celle que vous reprendrez en premi�re, c'est le principe de la pile. On y acc�de par des PUSH et des POP

   

Quelques instructions courantes   

    NOP (90h)

    La plus simple � expliquer : cette instruction ne fait rien! Vous le savez peut-�tre mais nous ne pouvons modifier la taille d'un programme sans des cons�quences d�sastreuses. C'est l� que cette instruction prend toute son utilit�. Elle permet de supprimer une instructions sans modifier la taille du programme (si l'instruction � "effacer" tient sur plusieurs bytes remplacez autant de bytes que n�cessaires par NOP).

 

    MOV destination, source

    Cette instruction copie la valeur de source dans destination. Les 2 op�randes doivent avoir la m�me taille. Il n'y peut y avoir au maximum qu'un acc�s m�moire par instruction. Si vous voulez par exemple mettre la valeur de [00401234] dans [00405678], vous devrez faire par exemple:
    MOV EBX , [401234]

    MOV [405678] , EBX    

mov eax , 45                ; Mettre 45 dans eax

   

    ADD destination, source

    Cette instruction additionne le contenu de destination � celui de source. Le r�sultat est plac� dans destination.

mov eax,45

add eax,10                   ; eax <= eax (45)  + 10      donc eax vaudra 55

   

    SUB destination, source

    Cette instruction soustrait le contenu de source � celui de destination. Le r�sultat est plac� dans destination.

mov eax,45

sub eax,5                      ; eax <= eax (45) - 5       donc eax vaudra 40

 

    INC destination

    Cette instruction incr�mente destination d'une unit�

mov eax,10

inc eax                        ; eax <= eax + 1

 

    DEC destination

    Cette instruction d�cr�mente destination d'une unit�

mov eax,10

dec eax                      ; eax <= eax - 1

 

    JMP label

    Modifie l'EIP en l'adresse d�sign�e par label. Ce que l'on d�signe par un saut.

jmp label

; instructions non ex�cut�es

label:

; instructions � �x�cuter

 

    PUSH source

    Place la valeur de source au sommet de la pile.

 

    POP destination

    Place la valeur au sommet de la pile dans destination.

mov eax,15

push eax                ; Place la valeur de eax (15) sur la pile

pop ebx                  ; R�cup�re la valeur au sommet de la pile (15, c'est celle que l'on vient de mettre) et la place dans ebx

 

    CMP destination, source

    Cette instruction effectue la soustraction de destination et source mais ne conserve pas le r�sultat. Seuls les Flags sont modifi�s.

    Le ZF (Zero Flag) est positionn� � 1 si le r�sultat de la soustraction est nul (donc que les 2 valeurs sont �gales).

    Le CF (Carry Flag) est positionn� � 1 si le r�sultat ne tient pas sur 32bits (donc que le r�sultat est est inf�rieur � 0).

    Le SF (Sign Flag) est positionn� � 1 si le r�sultat est n�gatif.

    Le OF (Overflow Flag) est positionn� � 1 si le r�sultat a provoqu� un d�bordement (lorsqu'on travaille avec des nombres sign�s).

mov eax,5

cmp eax,10                 ; eax < � 10  => ZF=0, SF=1 et CF=1

cmp eax,2                   ; eax > � 2  => ZF=0, SF=0 et CF=0

cmp eax,5                    ; eax = 5  => ZF=1, SF=0 et CF=0

  

 

  Les sauts conditionnels

    Fonctionne comme un JMP mais saute en fonction de l'�tat de certains bits du registre de Flags.

    Les diff�rents sauts sont :

Mn�mo

Saut si  �

Indicat. test�s
JA

Sup�rieur

CF = 0 et ZF = 0
JAE

Sup�rieur ou �gal

CF = 0
JB

Inf�rieur

CF = 1
JBE

Inf�rieur ou �gal

CF = 1 ou ZF = 1
JC

CF = 1

CF = 1
JCXZ

Registre CX � 0

CX = 0
JE

Egal

ZF = 1
JG*

Sup�rieur

ZF = 0 et SF = OF
JGE*

Sup�rieur ou �gal

SF = OF
JL*

Inf�rieur

SF<>OF
JLE*

Inf�rieur ou �gal

ZF = 1 ou SF<>OF
JNA

Pas sup�rieur

CF = 1 ou ZF = 1
JNAE

Pas sup�rieur ni �gal

CF = 1
JNB

Pas inf�rieur

CF = 0
JNBE

Pas inf�rieur ni �gal

CF = 0 et ZF = 0
JNC

CF = 0

CF = 0
JNE

Pas �gal

ZF = 0
JNG*

Pas sup�rieur

ZF = 1 et SF<>OF
JNGE*

Pas sup�rieur ni �gal

SF<>OF
JNL*

Pas inf�rieur

SF = OF
JNLE*

Pas inf�rieur ni �gal

ZF = 0 et SF = OF
JNO

OF = 0

OF = 0
JNP

PF=0

PF = 0
JNS*

SF=0

SF = 0
JNZ

ZF=0

ZF = 0
JO*

OF=1

OF = 1
JP

PF=1

PF = 1
JPE

Parit� paire

PF = 1
JPO

Parit� impaire

PF = 0

* Utiliser avec des nombres sign�s

 

mov eax,2

cmp eax,5

je lblfin            ; On ne saute pas puisque 2<>5

; Instructions qui vont �tre ex�cut�es puisque eax <> 5 et donc on ne sautera pas

lblfin:

 

Les op�rations logiques

 

    Les op�rations logiques travaillent toutes bit � bit. Elle peuvent servir � comparer deux valeurs, tester certains bits mais aussi � forcer certains bits � une certaine valeur.

 

    AND destination, source

    Le AND effectue un ET LOGIQUE de destination et source. Le AND peut se traduire par une multiplication de bits.

    Voici la table logique : 

A

B

AND

0

0

0

0

1

0

1

0

0

1

1

1

   

mov al,14h         ; 00010100b

mov bl,2Fh         ; 00101111b

and al,bl              ; 00000100b  = 04h   => al va prendre la valeur 04h

 

    OR destination, source

    Le OR effectue un OU inclusif de destination et source. Le OR peut se traduire par une addition de bits sans report.

   

A

B

OR

0

0

0

0

1

1

1

0

1

1

1

1

 

mov al,14h          ; 00010100b

mov bl,2Fh         ; 00101111b

or al,bl                 ; 00111111b = 3Fh => al va prendre la valeur 3Fh

 

    XOR destination, source

    Le XOR effectue un OU inclusif de destination et source. Le XOR peut se traduire par une addition de bits avec report.

A

B

XOR

0

0

0

0

1

1

1

0

1

1

1

0

 

mov al,14h          ; 00010100b

mov bl,2Fh         ; 00101111b

xor al,bl               ; 00111011b = 3Bh => al va prendre la valeur 3Bh

 

   

    Voil�, ce n'est �videmment pas complet mais j'esp�re que cela vous permettra de commencer mes cours sans trop gal�rer.

    Si vous voulez compl�ter votre apprentissage, et je vous conseille de le faire quitte � garder les liens et � les utiliser par apr�s, voici quelques sites non exhaustifs qui vous permettrons d'apprendre les bases (plus ou moins par ordre de difficult�) :

http://benoit-m.developpez.com/assembleur/tutoriel Les bases de l'asm
http://asm.developpez.com/intro/index.php Aussi
http://www.developpez.com/ Un site regroupant les bases de beaucoup de langages
http://www.deamoncrack.host.sk/Pages/cours-asm.htm Si vous n'avez pas trop de temps et que vous avez juste besoin d'un rappel
http://www.chez.com/pageasm/ Intro � la programmation win32 mais aussi DOS
http://win32assembly.online.fr/ Le site de r�f�rence pour la programmation win32 mais en anglais
les opcodes Tr�s complet mais en anglais

 

 

Bon crack,                         

Crisanar         

         [ << Intro ] [ Intro � Olly >> ]

 

Derni�re mise � jour le 04/10/2004 16:45