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 :

A propos du prologue


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut A propos du prologue
    Bonjour,

    J'étudie actuellement le fonctionnement de la stack et des conventions d'appels. Mes tests sont effectués actuellement sous Windows, et le tout est compilé par MinGW. Afin de simplifier cette étude je me base sur un code simple :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main()
    {
        return 0;
    }

    Sous OllyDbg je retrouve le code suivant :
    00401280 > $ 55 PUSH EBP
    00401281 . 89E5 MOV EBP,ESP
    00401283 . 83EC 08 SUB ESP,8
    00401286 . C70424 0100000>MOV DWORD PTR SS:[ESP],1
    0040128D . FF15 C8504000 CALL DWORD PTR DS:[<&msvcrt.__set_app_type>] ; msvcrt.__set_app_type
    00401293 . E8 B8FEFFFF CALL stackfoo.00401150 ; Qui correspond à l'appel de ExitProcess()
    Un point reste encore obscur pour moi concernant ce code. Je ne comprends pas l'utilité du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MOV DWORD PTR SS:[ESP],1
    Qui, il me semble équivaut à un
    non ?

    A noter aussi que plus loin je trouve là aussi encore un prologue :
    004012A0 . 55 PUSH EBP
    004012A1 . 89E5 MOV EBP,ESP
    004012A3 . 83EC 08 SUB ESP,8
    004012A6 . C70424 0200000>MOV DWORD PTR SS:[ESP],2 ; Ici 2 ?
    004012AD . FF15 C8504000 CALL DWORD PTR DS:[<&msvcrt.__set_app_ty>; msvcrt.__set_app_type
    004012B3 . E8 98FEFFFF CALL stackfoo.00401150
    Cependant, en faisant du step by step, je ne tombe jamais sur cette portion de code, je suppose donc que ce code doit être généré par défaut par le compilo :/.

    J'ai eu quelques doutes aussi sur le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CALL DWORD PTR DS:[<&msvcrt.__set_app_type>]
    Après quelques recherches (je suis tombé sur quelques boards/logs IRC rien de plus) j'ai vu que c'était pour définir le type d'application, c'est-à-dire ici pour indiquer un mode console ou autres. Si d'ailleurs vous avez plus de doc dessus je suis preneur.

    Merci d'avance pour votre aide,

    antivoid

    edit : ajout d'infos.

  2. #2
    Membre actif

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 235
    Points
    235
    Par défaut
    Il me semble que la démarche, pour étudier la pile, n'est pas la bonne.
    En effet, un compilateur génère un code standard, voir des obfuscations.
    Dans le cas de visual, par exemple, des kilos de code mort sont générés et pourrissent la lecture de l'init. De plus, Main, selon les compilateurs, reçoit des arguments ou pas.
    Un bon livre sur la gestion de la pile, ou l'utilisation d'un programme assembleur comportant un mode step serait plus directement utile.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Oui sur la théorie de base j'ai lu quelques docs, mais je cherchais entre autres à comprendre justement l'intérêt de la ligne suivante (et celà même si c'est de la crap insérée par le compilo) :
    MOV DWORD PTR SS:[ESP],1
    J'ai la fâcheuse tendance à vouloir tout comprendre, même pour ce qui à première vue peut paraitre inutile. Pour la mise en pratique c'était essentiellement histoire de voir dans un cas réel comment ca se passait, c'est chose faite. A présent je cherche surtout à cerner le code que rajoute ici mingw.

  4. #4
    Membre actif

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 235
    Points
    235
    Par défaut
    Tu as raison: En fait, c'est un appel à la MFC (beark) avec un passage d'argument à chaque fois (1 et 2). Bien alambiqué pour rien, comme d'habitude.

    En fait, si c'est vraiment la gestion de pile qui t'intéresse, il y à des règles très simples (signe de l'offset et cadres). Tout ce que tu vois et constates ici ne sont simplement que des spécificités du compilateur et des directives utilisées dans le script.

    Pourquoi ne pas faire du inline pour limiter tant que ce peut les dégâts ?

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Ok ca confirme ce à quoi je pensais, comme tu le dis c'est un argument de la fonction qui est PUSHed avant l'appel de la fonction. Ici c'est __app_type qui est mis à 1 pour le monde console, et à 2 pour produire une GUI. J'ai trouvé l'info ici.
    Pour ce qui est l'asm inline... je vais carrément faire de l'asm (tout court) avec NASM, là je suis partis d'un code C car c'était à la base pour effectuer une simple vérification du code produit par Mingw pour un code C donné (ici un code qui ne fait rien ). Je me lance petit à petit dans le monde merveilleux de l'assembleur.

    Merci pour ton aide

Discussions similaires

  1. A propos de Last_insert_id
    Par f-demu01 dans le forum Administration
    Réponses: 2
    Dernier message: 26/03/2003, 08h32
  2. A propos depth buffer
    Par j.yves dans le forum DirectX
    Réponses: 1
    Dernier message: 03/12/2002, 00h41
  3. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 12h22
  4. Fonctionnement de la compression DivX
    Par Rodrigue dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 20/09/2002, 14h10
  5. A propos du composant DBGrid
    Par _Rico_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/07/2002, 09h18

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