我想知道在执行汇编指令后是否可以立即读取另一个进程的eax寄存器。
在我的情况下,我有以下汇编代码:
mov byte ptr ss:[EBP-4]
call dword ptr ds:[<&MSVCR100.??2@YAPAXI@Z>]
add esp, 4
想法是在“call dword ptr ds:[&amp; MSVCR100。?? 2 @ YAPAXI @ Z&gt;]”指令执行完毕后获取eax值。 实际上,我必须在我的C ++代码中检索由另一个进程中创建的对象的instanciation返回的内存地址。
如果我已经足够清楚了,那就不知道。请原谅我糟糕的英语。答案 0 :(得分:2)
您可以使用硬件断点调试该过程。
使用winapi的示例:
DWORD address = 0x12345678; // address of the instruction after the call
DebugActiveProcess(pid); // PID of target process
CONTEXT ctx = {0};
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS | CONTEXT_INTEGER;
ctx.Dr0 = address;
ctx.Dr7 = 0x00000001;
SetThreadContext(hThread, &ctx); // hThread with enough permissions
DEBUG_EVENT dbgEvent;
while (true)
{
if (WaitForDebugEvent(&dbgEvent, INFINITE) == 0)
break;
if (dbgEvent.dwDebugEventCode == EXCEPTION_DEBUG_EVENT &&
dbgEvent.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_SINGLE_STEP)
{
if (dbgEvent.u.Exception.ExceptionRecord.ExceptionAddress == (LPVOID)address)
{
GetThreadContext(hThread, &ctx);
DWORD eax = ctx.Eax; // eax get
}
}
ContinueDebugEvent(dbgEvent.dwProcessId, dbgEvent.dwThreadId, DBG_CONTINUE);
}