
此時Dr0為4271B5,表示4271B5地址處被設置了硬件斷點。現在我們來看看CONTEXT結構。


這里我們可以看到context結構中Dr0~Dr3寄存器的內容。黃色標注的4271B5是我們設置了硬件斷點的地址。其他三個粉紅色標注的位零,因為我們只設置了一個硬件斷點,所以它們是空的。
當異常處理完畢以后,context中的值將被清零,我們一起來看一看,直接運行起來,斷在第二個斷點處。


我們可以看到經過了異常處理以后,Dr0被清零了,我們可以編寫腳本來恢復它。這里我們有兩種方案,
第一種方案:
在斷在KiUserExceptionDispatcher入口處時將context中調試寄存器的值保存一份。當斷在下面的ZwContinue的調用處時將調試寄存器的值恢復。
第二種方案:
在context中定位到程序的返回地址,在返回地址處設置一個斷點,當斷在返回地址處時恢復硬件斷點,相當於重新設置了一次硬件斷點。

