callstack и ReadProcessMemory - PullRequest
       18

callstack и ReadProcessMemory

2 голосов
/ 28 сентября 2010

Я пытаюсь прочитать адрес возврата метода, но из другой памяти.поэтому я получаю указатель кадра и читаю значение возвращаемого значения.Насколько я понимаю, я должен получить значение, равное 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);

Я использую c ++ в Windows.Кто-нибудь может сказать мне, что с ним не так?спасибо:)

1 Ответ

2 голосов
/ 25 ноября 2011

Адрес возврата равен EBP + 4 в текущем кадре стека.

Когда вызывается новая функция, устанавливается новый кадр стека, а старый ESP (указатель стека) перемещается в EBPбазовый указатель).Локальные переменные создаются в стеке путем вычитания нового указателя стека.Переданные аргументы передаются в обратном порядке перед вызовом.Из базового указателя вы можете получить обратный адрес.

...