注册

CpuDbg x96

查看: 182|回复: 0
收起左侧

硬件访问断点如何记录中断次数?

[复制链接]
发表于 2024-11-1 00:42:50 | 显示全部楼层 |阅读模式
我们都知道普通的INT3断点中断后,通过判断IP就能确定是否是断点触发的中断,并记录中断次数.
但如果是硬件访问断点如何记录呢?
比如我们常用的ESP定律来脱压缩壳时, 都会对ESP下HR(硬件访问断点).
下断后, 此时DR0~DR3保存的都是栈地址.
在程序中断后,IP往往都是中断在.code区域. 而DR寄存器保存的却是stack地址.
这样我们就无法通过IP来判断是否是我们命中的断点了.因此也无法实现记录中断次数.

解决方法也很简单, 直接通过DR6寄存器就能实现判断. 代码如下:

0B0如果为 1,表示 DR0 硬件断点触发。
1B1如果为 1,表示 DR1 硬件断点触发。
2B2如果为 1,表示 DR2 硬件断点触发。
3B3如果为 1,表示 DR3 硬件断点触发。


[C] 纯文本查看 复制代码
CONTEXT context;
context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
GetThreadContext(hThread, &context);

if (context.Dr6 & 0x1) {
    // DR0 断点触发
} else if (context.Dr6 & 0x2) {
    // DR1 断点触发
}
// 依此类推检查 DR2 和 DR3

回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注册

QQ|Archiver|手机版| CpuDbg x96

GMT, 2024-12-21 18:36 , Processed in 0.062500 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表