callstack和ReadProcessMemory

时间:2010-09-27 20:35:47

标签: c++ callstack readprocessmemory

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

  1. 如果我将Esp添加到帧指针地址 - ReadProcessMemory返回false。
  2. 如果我只是使用地址框偏移量 - 我得到一个错误的值。
  3. //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 ++。 任何人都可以告诉我它有什么问题吗? 谢谢:))

1 个答案:

答案 0 :(得分:2)

当前堆栈帧中的返回地址为EBP + 4.

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