2010-09-27 6 views
2

J'essaie de lire l'adresse de retour de la méthode mais d'une autre mémoire. donc je reçois le pointeur de trame, et lire la valeur de la valeur de retour. Pour autant que je comprends que je suis censé avoir une valeur égale à m_stackframe.AddrReturn.Offset, mais:callstack et ReadProcessMemory

  1. Si j'ajoute l'Esp à l'adresse de pointeur de trame - ReadProcessMemory retourne false.
  2. Si j'utilise simplement le décalage de trame d'adresse - j'ai une mauvaise valeur.
 
//Reading the top method in the stack. 
bool ok = StackWalk64(IMAGE_FILE_MACHINE_I386,m_processInfo.Handle ,m_threadInfo.Handle, &m_stackframe,&m_threadContext, 
          0,SymFunctionTableAccess64,SymGetModuleBase64,0); 

// the Esp register is the base address of the stack, right? 
DWORD baseAddressOfCallstack = m_threadContext.Esp; 
// Getting the absolute address by adding the ESP to the stack frame address. 
    DWORD absoluteAddressInCallstack = m_stackframe.AddrFrame.Offset + baseAddressOfCallstack ; 
// Converting it to a pointer. 
    DWORD* addressInCallStack = (DWORD*)absoluteAddressInCallstack; 
    DWORD val = 0; 
    SIZE_T bytesRead = 0; 
// and trying to read it from the process... 
    ok = ReadProcessMemory(m_processInfo.Handle, addressInCallStack, (void*)&val, sizeof(DWORD),&bytesRead); 

J'utilise C++ sur Windows. quelqu'un peut-il me dire ce qui ne va pas avec? merci :)

Répondre

2

L'adresse de retour est à EBP + 4 dans votre cadre de pile actuel.

Chaque fois qu'une nouvelle fonction est appelée, une nouvelle trame de pile est configurée et l'ancien ESP (pointeur de pile) est déplacé vers EBP (pointeur de base). Les variables locales sont créées sur la pile en soustrayant le nouveau pointeur de pile. Les arguments passés sont poussés dans l'ordre inverse avant d'appeler. À partir du pointeur de base, vous pouvez obtenir l'adresse de retour.

Questions connexes