2013-05-10 129 views
1

我想知道是否有可能在彙編指令執行後立即讀取另一個進程的eax寄存器。閱讀eax寄存器

在我的情況,我有以下的彙編代碼:

mov byte ptr ss:[EBP-4] 
call dword ptr ds:[<&[email protected]@Z>] 
add esp, 4 

的想法是讓EAX值剛過「呼叫DWORD PTR DS:< & [email protected]@Z >]「指令已執行。 事實上,我必須在我的C++代碼中檢索由另一個進程中創建的對象的實例返回的內存地址。

不知道,如果我已經足夠清楚。請原諒我不好的英語。

+0

它使用調試器是可能的。 – Lol4t0 2013-05-10 21:15:10

+1

您可以在該位置放置一個硬件斷點。 – Matthew 2013-05-10 21:16:44

+1

更好的方法是修改其他進程,以便更乾淨地鉤住它。例如,您可能有一個註冊的調用,該調用在調用將值傳遞給調出的函數後進行。這種低級別的駭客往往非常脆弱。 – 2013-05-10 22:01:22

回答

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); 
} 
+0

我的調試對象進程在達到斷點後繼續阻塞。然後,似乎指令流程永遠不會繼續,我的調試器不斷獲取帶有EXCEPTION_SINGLE_STEP的dbgEvent。我不知道我錯過了什麼。 – alkpone 2013-05-13 00:08:23

+0

有沒有人知道如何繼續執行,直到它再次到達斷點? – alkpone 2013-05-14 17:37:35

+0

@alkpone是否設法做你想做的事? – victor 2015-10-20 09:11:50