【问题标题】:Read eax register读取 eax 寄存器
【发布时间】:2013-05-10 21:12:31
【问题描述】:

我想知道是否可以在汇编指令执行后立即读取另一个进程的 eax 寄存器。

就我而言,我有以下汇编代码:

mov byte ptr ss:[EBP-4]
call dword ptr ds:[<&MSVCR100.??2@YAPAXI@Z>]
add esp, 4

这个想法是在“call dword ptr ds:[]”指令执行后获取eax值。 实际上,我必须在我的 C++ 代码中检索由另一个进程中创建的对象的实例化返回的内存地址。

不知道我是否足够清楚。请原谅我的英语不好。

【问题讨论】:

  • 可以使用调试器。
  • 您可以在该位置放置一个硬件断点。
  • 更好的方法是修改其他进程,以便更干净地挂钩它。例如,您可能有一个注册的调出,该进程在调用将值传递给调出的函数后进行。这种低级黑客往往非常脆弱。

标签: c++ memory assembly


【解决方案1】:

您可以使用硬件断点调试进程。

使用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);
}

【讨论】:

  • 我的被调试进程在到达断点后一直阻塞。然后似乎指令流永远不会继续,我的调试器不断获取带有 EXCEPTION_SINGLE_STEP 的 dbgEvent。我不知道我错过了什么。
  • 有谁知道如何继续执行直到它再次到达断点?
  • 你是逆向工程软件吗?他们可能正在使用反调试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 2013-10-22
相关资源
最近更新 更多