2010-09-27 37 views
2

我試圖讀取方法的返回地址,但另一個內存。 所以我得到幀指針,並讀取返回值的值。 據我明白我應該得到的值等於m_stackframe.AddrReturn.Offset,但:callstack和ReadProcessMemory

  1. 如果我添加了ESP的幀指針地址 - ReadProcessMemory返回false。
  2. 如果我只是使用地址幀偏移量 - 我得到一個錯誤的值。
 
//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); 

我使用C++的窗口。 有人可以告訴我它有什麼問題嗎? 謝謝:)

回答

2

返回地址是在您當前的堆棧幀的EBP + 4。

每當一個新的函數被調用時,一個新的堆棧幀被建立,並且舊的ESP(堆棧指針)被移動到EBP(基址指針)。通過減去新的堆棧指​​針,在堆棧上創建局部變量。在調用之前,傳遞的參數按相反的順序推入。從基地指針你可以得到返回地址。