我正在尝试读取该方法的返回地址,但另一个内存的返回地址。所以我得到了帧指针,并读取了返回值的值。据我了解,我应该得到一个等于 m_stackframe.AddrReturn.Offset 的值,但是:
- 如果我将 Esp 添加到帧指针地址 - ReadProcessMemory 将返回 false。
- 如果我只是使用地址帧偏移量 - 我会得到一个错误的值。
//读取栈顶方法。
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++。谁能告诉我它有什么问题?谢谢 :)