我们都知道普通的INT3断点中断后,通过判断IP就能确定是否是断点触发的中断,并记录中断次数.
但如果是硬件访问断点如何记录呢?
比如我们常用的ESP定律来脱压缩壳时, 都会对ESP下HR(硬件访问断点).
下断后, 此时DR0~DR3保存的都是栈地址.
在程序中断后,IP往往都是中断在.code区域. 而DR寄存器保存的却是stack地址.
这样我们就无法通过IP来判断是否是我们命中的断点了.因此也无法实现记录中断次数.
解决方法也很简单, 直接通过DR6寄存器就能实现判断. 代码如下:
[C] 纯文本查看 复制代码 CONTEXT context;
context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
GetThreadContext(hThread, &context);
if (context.Dr6 & 0x1) {
// DR0 断点触发
} else if (context.Dr6 & 0x2) {
// DR1 断点触发
}
// 依此类推检查 DR2 和 DR3
|