2014-02-25 16 views
0

我試圖用ReadProcessMemory記錄指向指令,實際上我使用EIP寄存器來獲取下一個指令地址。接下來,我使用distorm lib來顯示助記符。但ReadProcessMemory不讀取任何內容。使用ReadProcessMemory來記錄有針對性的指令

void display_instruction(Debuggee* debuggee) 
{ 
    CONTEXT lcContext; 
    lcContext.ContextFlags = CONTEXT_ALL; 
    GetThreadContext(debuggee->debugEvent->u.CreateProcessInfo.hThread, &lcContext); 

    BYTE cInstruction = 0; 
    DWORD dwReadBytes; 
    ReadProcessMemory(debuggee->debugEvent->u.CreateProcessInfo.hProcess, (void*)&lcContext.Eip, &cInstruction, 1, &dwReadBytes); 
    decode((void*)cInstruction); //Distorm Mnemonic 
    printf("Instruction : 0x%03.3X , %d\n",cInstruction,dwReadBytes); 
} 

}

我需要你的幫助,請^^

+1

當線程未掛起時,標準錯誤正在使用GetThreadContext(),試圖在32位調試器中訪問64位線程的上下文,並完全忽略這些winapi函數的返回值,找出他們失敗的原因。 –

+0

感謝您的回答。調試器使用陷阱標誌來停止目標執行。我在收到EXCEPTION_SINGLE_STEP時顯示說明。下一條指令不能執行,直到display_instruction沒有完成(我沒有把所有的代碼)。 – nasm

回答

0

這大概:

ReadProcessMemory(debuggee->debugEvent->u.CreateProcessInfo.hProcess, 
       (void*) &lcContext.Eip, // < 
       &cInstruction, 
       1, 
       &dwReadBytes); 

應該是:

ReadProcessMemory(debuggee->debugEvent->u.CreateProcessInfo.hProcess, 
       (void*) lcContext.Eip, // < 
       &cInstruction, 
       1, 
       &dwReadBytes); 

ReadProcessMemory預計在地址該虛擬記憶目標進程。

加上你可以檢查返回值和失敗的原因。

+0

嗨,感謝您的回答,我得到了錯誤代碼998:ERROR_NOACCESS 998(0x3E6):無效訪問內存位置。調試對象(調試過程)按如下方式啓動: – nasm

+0

我更改了調試對象 - >調試對象(debuggee-> path_to_binary,NULL,NULL,NULL,FALSE,DEBUG_ONLY_THIS_PROCESS,NULL,NULL,&debuggee-> startup_info和debuggee-> process_information) debugEvent-> u.CreateProcessInfo.hProcess by debuggee-> process_information.hProcess和&lcContext.Eip by lcContext.Eip。有用 !謝謝 ! – nasm