我正在尝试读取该方法的返回地址,但另一个内存的返回地址。所以我得到了帧指针,并读取了返回值的值。据我了解,我应该得到一个等于 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++。谁能告诉我它有什么问题?谢谢 :)