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 :

Echec de stockage d'une valeur dans une variable locale pointée par EBP


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut Echec de stockage d'une valeur dans une variable locale pointée par EBP
    Bonjour,

    Je suis entrain de m'initier à la programmation de drivers sous Windows XP avec un processeur 32 bits et depuis un petit moment je bute pour récupérer un argument de type POBJECT_ATTRIBUTES au travers la pile.

    Ma fonction se présente ainsi:
    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
    17
    18
    19
    20
    21
    22
    __declspec(naked) my_function()
    {
    	ULONG addrObject;
    	POBJECT_ATTRIBUTES  pObjectAttrib;
    	PUNICODE_STRING pObjectName;
    	__asm
    	{
    	   pushad
    	   pushfd
               mov		ebp, esp
               mov ebx, dword ptr [ebp+30h]
               mov addrObject, ebx
    	}
    	pObjectAttrib = (POBJECT_ATTRIBUTES)addrObject;
    	pObjectName = pObjectAttrib->ObjectName;
    	//DbgPrint("YEP:Passage dans my_function...\n");
    	__asm
    	{
    	   popad
    	   popfd
    	}
    }
    J'utilise WinDdg et lors de mon jump sur cet extrait de fonction, j'ai un plantage apparemment sur l'opération "mov addrObject, ebx".
    En effet en désassemblent, voici le code que j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    815fea04 8bec            mov     ebp,esp
    815fea06 8b5d30          mov     ebx,dword ptr [ebp+30h] <- ebx contient bien l'argument que je désire récupéré
    815fea09 895df8          mov     dword ptr [ebp-8],ebx  <- ICI la valeur récupérée précédemment n'est pas stockée dans la variable locale???
    815fea0c 8b45f8          mov     eax,dword ptr [ebp-8] ss:0010:f65b7d08=00000008 <- Je récupère donc une valeur erronée (celle déjà en place)
    815fea0f 8945fc          mov     dword ptr [ebp-4],eax
    815fea12 8b4dfc          mov     ecx,dword ptr [ebp-4]
    815fea15 8b5108          mov     edx,dword ptr [ecx+8]
    815fea18 8955f4          mov     dword ptr [ebp-0Ch],edx
    815fea1b 61              popad
    815fea1c 9d              popfd
    Le pushad et le pushfd sont manquants car je n'ai pas copié ces instructions.

    lors de l'opération "mov dword ptr [ebp-8],ebx", jeconstate que la valeur stockée à l'adresse de ebp-8 n'est pas modifiée. Je ne comprends pas du tout pourquoi... Si quelqu'un pourrait m'expliquer comment faire?

    Merci.

    Nicolas

  2. #2
    Membre habitué Avatar de - Robby -
    Inscrit en
    Juillet 2003
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 266
    Points : 170
    Points
    170
    Par défaut
    ATTENTION !!!

    __decspec(nacked) + Variale locale = pas bon !

    avec "__declspec(naked)" il n'y a pas de code prologue qui définit un cadre de pile.
    Tu ne peux donc pas faire référence à ta variable locale "addrObject".
    Le compilateur ne sait pas ou elle est.

    En fait, il va essayer d'y accéder "comme si" il y avait un cadre de Pile.
    Ce cadre de Pile commencerait par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PUSH EBP
    MOV EBP , ESP
    SUB ESP , 0Ch (12 = 3x dword)
    donc ta variable locale ""addrObject" se trouverait bien en "EBP-8"
    Se trouverait ... au conditionnel !!! ... car il n'y a PAS ce cadre de Pile !


    De plus ... même sans "naked", cela n'ira pas.

    Car tu modifies EBP toi même, sans le restituer après.
    Sans "Nacked", le compilo construira un cadre de pile "Enter/Leave"
    qui lui permettra d'accéder aux variables locales déclarées ...
    en prenant comme référence asm le registre EBP.

    Même SANS Nacked :
    En modifiant EBP, tu flanques l'acces aux variables locales en l'air.

    AVEC Nacked :
    ... c'est encore pire,
    tu n'as même pas de cadre de pile pour tes variables.

    Déclarer des Variables Locales dans une fonction "Nacked", c'est le piège ça !
    et si tu enlèves "nacked", fait gaffe si tu modifies EBP ... voilou

    a+

Discussions similaires

  1. [XL-2010] Stockage de la valeur d'une formule dans une variable
    Par Coxtox dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 30/04/2015, 09h59
  2. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  3. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  4. Réponses: 1
    Dernier message: 25/09/2006, 17h15
  5. Mettre une valeur d'une table dans une variable
    Par Raphou96 dans le forum Access
    Réponses: 5
    Dernier message: 06/02/2006, 15h19

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