2014-05-08 46 views
1

我有這個ASM代碼,我想對它做一個硬件斷點,但我不知道是否可以使用硬件斷點來寫內存。誰能建議?硬件斷點是否可以寫入內存?

[ASM] 
41A8BA - 68 12345678 [PUSH 78563412] 

是否有無論如何我可以寫在硬件斷點,例如在C++上使它成爲「68 00000000」?

[C++ Code] 
LONG WINAPI ExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo) 
{ 
    if(ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP) 
    { 
     if((DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress == 0x41A8BA) 
     { 
      //What do i write here? 
      return EXCEPTION_CONTINUE_EXECUTION; 
     } 
    } 
    return EXCEPTION_CONTINUE_SEARCH; 
} 
+0

換句話說,你想在執行指令前修改指令嗎? – zneak

+0

如果可能的話,我想修改一個硬件級別的指令(我不確定是否硬件斷點可以做到這一點),然後執行,是的。 –

+0

通過「硬件級別」,你的意思是你想改變指令而不會在內存中看到變化嗎? – zneak

回答

4

我非常熟悉x86的硬件斷點實現是如何工作的(從「它對處理器的作用」 - 而不是它實際上是如何設計的),並且已經閱讀了其他幾種描述。它是一組特殊的寄存器,可以給定一個模式(「地址X,寫入時觸發」,「地址Y,執行時觸發」),在執行代碼期間檢查它們,如果匹配(例如「正在寫入地址X」或「正在執行地址Y」),則處理器將停止執行並進入異常處理程序 - 在這意味着異常處理程序中的軟件會接管,通常是通過交給調試器來說「您的代碼寫入地址X,這裏是您所在的位置」或「您的代碼執行地址Y,這裏是我們停止的地方」。

硬件brekapoints不能直接用於讀取,寫入或執行任何操作 - 它只是一個「匹配+異常」機制。從技術上講,可以讓異常處理程序執行類似於正在執行的地址的操作,但這不是「硬件斷點」,它仍然會像處理器上執行的任何其他代碼一樣處理,這意味着內存必須以一種可寫入的方式進行映射(代碼,通常,在現代操作系統(如Windows和Linux)中不可寫入代碼)。當然,您可以在調試中斷的異常處理程序中將內存映射爲可寫(如果需要),併爲您關心的代碼部分寫入不同的值(如果它在另一個進程中,則需要使用OpenProcessWriteProcessMemory) - 再次,這與硬件斷點沒有直接關係,而是關於作爲結果執行的代碼,並且仍然遵循關於可以讀取和寫入的內存的通用規則。

0

我想知道這與硬件斷點有什麼關係。

就我所知,你想在停止時修改一個Windows程序?

爲此,您應該使用「WriteProcessMemory()」API函數。

+0

我不確定是否有可能,但我想在硬件級別修改它。 –

+1

這沒有任何意義。 –

+0

也許,這就是爲什麼我的問題是「我想知道我是否可以使用硬件斷點寫入內存。」 –

相關問題