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

Assembleur Discussion :

Utiliser le registre EIP en C


Sujet :

Assembleur

  1. #1
    Membre habitué Avatar de mensoif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Points : 129
    Points
    129
    Par défaut Utiliser le registre EIP en C
    Bonjour, je poste mon message ici car je pense qu'ils sont étroitement lié. Voila mon problème, il me faudrait utiliser la valeur du registre EIP dans un code C. Le problème c'est que je n'ai trouvé aucune doc à ce sujet. Si quelqu'un l'a déjà fait ou possède des informations à ce sujet je suis preneur !! merci =)

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    Citation Envoyé par mensoif Voir le message
    Bonjour, je poste mon message ici car je pense qu'ils sont étroitement lié. Voila mon problème, il me faudrait utiliser la valeur du registre EIP dans un code C. Le problème c'est que je n'ai trouvé aucune doc à ce sujet. Si quelqu'un l'a déjà fait ou possède des informations à ce sujet je suis preneur !! merci =)
    Il faut utiliser la directive asm ("") pour insérer du code inline au sein de ton programme C, et s'arranger pour récupérer la valeur de EIP d'une manière ou d'une autre car elle n'est pas facilement accessible. Une manière habituelle est de faire un CALL 00000000 en relatif pour se référer à l'instruction suivante et de faire un POP EAX pour extraire l'adresse empilée par le CALL.

    Cependant, le code de ta fonction se trouvant toujours à la même place en mémoire, la valeur de EIP sera toujours la même, et n'aura donc que très peu d'intérêt.

    Tu cherches à faire quoi, exactement ?

  3. #3
    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
    Bonsoir,

    Tu peux facilement faire une fonction getEIP() en suivant le principe expliqué par Obsidian. Par exemple avec NASM :

    geteip.asm:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    global getEIP
     
    section .text
    getEIP:
      mov eax, [esp]
      ret
    Pour l'assembler sous Linux :
    Et voilà, tu as un .o à linker à ton projet. Ça fonctionne aussi sous Windows en utilisant le format COFF, peut-être qu'il faudra appeler la fonction _getEIP().

    main.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
     
    void* getEIP (void);
     
    int main (void)
    {
      printf("%p\n", getEIP());
     
      return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc main.c geteip.o -o main
    Citation Envoyé par Obsidian Voir le message
    Une manière habituelle est de faire un CALL 00000000 en relatif pour se référer à l'instruction suivante et de faire un PUSH EAX pour extraire l'adresse empilée par le CALL.
    POP plutôt non ?
    :wq

  4. #4
    Membre habitué Avatar de mensoif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 248
    Points : 129
    Points
    129
    Par défaut
    Merci de vos réponses, dès ce soir je testerais cela.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 373
    Points : 23 629
    Points
    23 629
    Par défaut
    Citation Envoyé par dapounet Voir le message
    POP plutôt non ?
    /me va se fouetter avec des orties fraîchement coupées.

    Merci pour la rectif' !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation du registre ?
    Par orditosh dans le forum WinDev
    Réponses: 4
    Dernier message: 27/01/2008, 18h12
  2. Utilisation du registre
    Par Général03 dans le forum C++Builder
    Réponses: 8
    Dernier message: 22/11/2007, 17h27
  3. execution d'un programme sur eclipse utilisant le registre RMI
    Par engineer_23 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 16/10/2007, 15h51
  4. [VB.NET]Utilisation Du Registre
    Par Astro8899 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/11/2006, 19h00
  5. Lire le registre EIP
    Par flatron dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 30/11/2004, 22h59

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