IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

Comprendre un programme C simple décompilé


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Comprendre un programme C simple décompilé
    Bonjour,

    J'aurais besoin d'un petit coup de main pour comprendre la décompilation d'un programme en C. (Inel x86)

    Le programme C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void f(int a , int b, int c){
            char z[4];
    }
     
    void main(){
            f(1,2,3);
    }
    donc je compile : gcc test.c -o test

    Je désassemble avec gdb ("disas main"):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    0x0804832c <main+0>:    lea    0x4(%esp),%ecx
    0x08048330 <main+4>:    and    $0xfffffff0,%esp
    0x08048333 <main+7>:    pushl  -0x4(%ecx)
    0x08048336 <main+10>:   push   %ebp
    0x08048337 <main+11>:   mov    %esp,%ebp
    0x08048339 <main+13>:   push   %ecx
    0x0804833a <main+14>:   sub    $0xc,%esp
    0x0804833d <main+17>:   movl   $0x3,0x8(%esp)
    0x08048345 <main+25>:   movl   $0x2,0x4(%esp)
    0x0804834d <main+33>:   movl   $0x1,(%esp)
    0x08048354 <main+40>:   call   0x8048324 <f>
    0x08048359 <main+45>:   add    $0xc,%esp
    0x0804835c <main+48>:   pop    %ecx
    0x0804835d <main+49>:   pop    %ebp
    0x0804835e <main+50>:   lea    -0x4(%ecx),%esp
    0x08048361 <main+53>:   ret

    Par exemple "add $0xfffffff0,%esp", le $0xfffffff0 est un entier signé ou non signé??

    Je ne comprend pas ce que le programme fait entre <main+0> et <main+7>.

    Si qqn sait
    merci

  2. #2
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Salut,

    Citation Envoyé par _jeez_ Voir le message
    Par exemple "add $0xfffffff0,%esp", le $0xfffffff0 est un entier signé ou non signé??
    C'est toi qui vois. ADD et SUB peuvent être utilisés sur des nombres signés ou pas, il donneront toujours la bonne réponse grâce à la représentation en complément à deux (à moins qu'il y ait un débordement). Pour d'autres opérations comme la multiplication il faut choisir l'instruction qui correspond au "type" de tes variables (signées ou pas).
    Je te conseille d'obtenir le code assembleur avec GCC directement, ce sera un peu plus lisible :
    gcc -S -masm=intel test.c -o test.exe
    Il vaut mieux lui demander d'optimiser un minimum avec l'option -Ox, sinon tu risques de lire des horreurs. Par contre il risque de deviner que ton code ne sert à rien et compiler un programme vide. Personnellement j'utilise -O2 et je l'oblige à créer les variables en les affichant.
    L'option -masm=intel sert à utiliser la syntaxe Intel, on la trouve plus lisible en général. Au passage un lien vers un désassembleur super bien foutu était passé quelques topics plus haut : http://www.datarescue.be/idafreeware/freeida43.exe
    :wq

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    non je suis sous linux ca ne passe pas

Discussions similaires

  1. Programme Qt simple - erreur cachée ?
    Par olivier57b dans le forum Débuter
    Réponses: 5
    Dernier message: 03/10/2008, 18h08
  2. Améliorer un programme très simple
    Par Alp dans le forum Prolog
    Réponses: 6
    Dernier message: 15/03/2008, 11h17
  3. Programme super simple qui ne marche pas!
    Par _Michel dans le forum Visual C++
    Réponses: 2
    Dernier message: 07/01/2008, 18h50
  4. Réponses: 1
    Dernier message: 25/08/2007, 23h14
  5. programmation 2D simple
    Par korp69 dans le forum API graphiques
    Réponses: 6
    Dernier message: 23/12/2006, 11h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo