2

我正在尝试读取该方法的返回地址,但另一个内存的返回地址。所以我得到了帧指针,并读取了返回值的值。据我了解,我应该得到一个等于 m_stackframe.AddrReturn.Offset 的值,但是:

  1. 如果我将 Esp 添加到帧指针地址 - ReadProcessMemory 将返回 false。
  2. 如果我只是使用地址帧偏移量 - 我会得到一个错误的值。
//读取栈顶方法。
bool ok = StackWalk64(IMAGE_FILE_MACHINE_I386,m_processInfo.Handle,m_threadInfo.Handle,&m_stackframe,&m_threadContext,
                          0,SymFunctionTableAccess64,SymGetModuleBase64,0);

// Esp 寄存器是栈的基地址,对吧?
DWORD baseAddressOfCallstack = m_threadContext.Esp;
// 通过将 ESP 添加到堆栈帧地址来获取绝对地址。
    DWORD absoluteAddressInCallstack = m_stackframe.AddrFrame.Offset + baseAddressOfCallstack ;
// 将其转换为指针。
    DWORD* addressInCallStack = (DWORD*)absoluteAddressInCallstack;
    双字值 = 0;
    SIZE_T bytesRead = 0;
// 并试图从进程中读取它...
    ok = ReadProcessMemory(m_processInfo.Handle, addressInCallStack, (void*)&val, sizeof(DWORD),&bytesRead);

我在 Windows 上使用 c++。谁能告诉我它有什么问题?谢谢 :)

4

1 回答 1

2

返回地址位于当前堆栈帧中的 EBP + 4 处。

每当调用一个新函数时,就会建立一个新的堆栈帧,并将旧的 ESP(堆栈指针)移动到 EBP(基指针)。通过减去新的堆栈指​​针,在堆栈上创建局部变量。传递的参数在调用之前以相反的顺序推送。从基指针可以得到返回地址。

于 2011-11-24T22:10:30.870 回答