【问题标题】:callstack and ReadProcessMemory调用堆栈和 ReadProcessMemory
【发布时间】:2011-04-17 23:35:51
【问题描述】:

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

【问题讨论】:

    标签: c++ callstack readprocessmemory


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-05-10
      • 2019-11-22
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多