我正在尝试读取方法的返回地址,但是要读取另一个内存。 所以我得到了帧指针,并读取了返回值的值。 据我所知,我应该得到一个等于m_stackframe.AddrReturn.Offset的值,但是:
//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);
我在Windows上使用c ++。 任何人都可以告诉我它有什么问题吗? 谢谢:))
答案 0 :(得分:2)
当前堆栈帧中的返回地址为EBP + 4.
每当调用一个新函数时,就会建立一个新的堆栈帧,并将旧的ESP(堆栈指针)移动到EBP(基指针)。通过减去新的堆栈指针在堆栈上创建局部变量。在调用之前,传递的参数以相反的顺序推送。从基指针可以得到返回地址。