2011-11-03 6 views
0

Je suis sur une machine Windows 7 et j'ai essayé d'ouvrir kernel32.dll dans IDA et IDA dit que l'adresse de la fonction IsDebuggerPresent est 0x77e2b020. J'essaie d'appeler la fonction en utilisant l'assemblage en ligne.appel IsDebuggerPresent en utilisant l'assembly inline

Sur une plate-forme VS2010, j'ai essayé en utilisant le code suivant: -

#include<iostream> 
using namespace std; 

int blah() { 
    __asm { 
     xor eax, eax 
     mov ebx, 0x77e2b020 
     call ebx 
    } 
} 

int main() { 
    cout<<blah(); 
    return 0; 
} 

sur la construction de l'exe, il montre le kernel32.dll est en cours de chargement.

J'ai essayé de déboguer l'exe dans OllyDbg et l'erreur est une "violation d'accès" lorsque l'instruction "call" s'exécute.

Oui, je sais que l'appel de l'API directement à partir de C++ est la meilleure/bonne façon de le faire, je le fais pour le plaisir, je ne comprends tout simplement pas pourquoi cela ne fonctionne pas.

Répondre

1

L'adresse 0x77e2b020 n'est pas statique, vous DOIT l'appeler par son nom plutôt que par son adresse explicite. Lorsque vous redémarrez, la bibliothèque est chargée à une adresse différente si ASLR est activé. Vous ne pouvez pas non plus garantir l'ordre de chargement de la bibliothèque, ce qui affectera également l'adresse.

Si vous essayez de faire un appel indirect, envisagez d'utiliser LoadLibrary et GetProcAddress pour trouver l'adresse de IsDebuggerPresent lors de l'exécution. Un autre problème est que vous videz eax et ebx. Vous devez utiliser pushad et popad pour garder les registres en sécurité pendant que vous faites un tel ensemble en ligne, par exemple:

__asm { 
    pushad 
    call IsDebuggerPresent 
    mov dbgPresent, eax 
    popad 
} 
+0

merci! mais hmm, ouais je l'avais essayé mais le compilateur semble penser que le label IsDebuggerPresent n'est pas défini. –

+0

Incluez-vous une définition pour cela? – Polynomial

Questions connexes