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