gpt4 book ai didi

c++ - 调用堆栈和 ReadProcessMemory

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:59:57 27 4
gpt4 key购买 nike

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

  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);

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

最佳答案

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

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

关于c++ - 调用堆栈和 ReadProcessMemory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3807636/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com