2010-05-25 7 views
3

de code suivantExplication du démontage du simple programme (x86)

int _main() {return 0;} 

compilé à l'aide de la commande:

gcc -s -nostdlib -nostartfiles 01-simple.c -o01-simple.exe 

gcc version 4.4.1 (TDM-1 mingw32)

OllyDbg a produit cette sortie:

alt text

Pouvez-vous expliquer ce qui se passe ici? Analyse jusqu'à présent:

// these two seems to be an idiom: 
PUSH EBP  // places EBP on stack 
MOV EBP, ESP // overwrites EBP with ESP 

MOV EAX, 0  // EAX = 0 

LEAVE   // == mov esp, ebp 
       // pop ebp 
       // according to 
       // http://en.wikipedia.org/wiki/X86_instruction_listings 

Quel est le sens de tout cela?

+0

Voir http://www.phrack.com/issues.html?issue=49&id=14#article. – Yktula

+0

Note: Je ne peux pas mettre des images dans la question avec une mauvaise réputation. – George

Répondre

5

Ceci crée un stack frame.

PUSH EBP  
MOV EBP, ESP 

Dans la convention d'appel utilisée, la valeur de retour est renvoyé par EAX (de sorte que le 0 est là parce que vous avez écrit return 0; - essayez de changer cela pour return 1; et voir comment cela affecte le code).

MOV EAX, 0 

Et cela indique au processeur pour nettoyer le cadre de la pile (il est l'équivalent de MOV ESP, EBP suivi par POP EBP qui est à l'opposé de ce qui a été fait lors de la création du cadre de pile):

LEAVE 
0

Le 'Instruction MOV EAX, 0' est le corps de votre fonction. Le code d'en-tête sert à configurer l'espace pour que votre code s'exécute.

L'instruction 'LEAVE' renvoie votre code à l'endroit où il est arrivé. Même si vous n'avez pas indiqué de bibliothèque standard, il y a beaucoup d'autres codes que l'éditeur de liens met en place.

+0

'leave' ne retourne rien n'importe où. 'leave' désinstalle le cadre de pile de la fonction en cours. Afin de retourner une instruction 'ret' séparée est toujours nécessaire. – AnT

1

Les instructions met en place le cadre de pile sur le chargeur d'exécution entrant dans la fonction int _main(),

 
PUSH EBP 
MOV EBP, ESP 

cadre de pile est mis en place et accéder aux paramètres le cas échéant ont été fournis serait décalée par rapport à EBP + la taille de le paramètre (WORD, BYTE, LONG, etc.).

Habituellement, le registre EAX est le registre normal de retourner un état de sortie de l'environnement d'exécution du système d'exploitation chargeur,

 
MOV EAX, 0 
LEAVE 

autrement dit, pour dire que le programme a quitté le retour avec succès un 0 à la Système opérateur. Lorsqu'un retour est utilisé, la trame de la pile est restaurée lors de l'exécution, avant de remettre le contrôle au système d'exploitation.

 
POP EBP 

Le consensus général est, si une erreur est survenue, la valeur serait non nulle, et peut être utilisé aussi bien à partir des fichiers de traitement par lots (ressasser les vieux jours DOS) et les scripts unix où il vérifie si le programme s'est exécuté avec succès ou non et continue en fonction de la nature du fichier batch ou du script.

Questions connexes