首页
社区
课程
招聘
[原创]学硬核知识-硬件断点
发表于: 2022-1-10 23:00 8720

[原创]学硬核知识-硬件断点

2022-1-10 23:00
8720

上一篇文章我们介绍了inlinehook(修改代码的hook方式),接下来准备介绍硬件断点+veh hook(无需修改代码的hook方式)。作为铺垫,本文先介绍硬件断点。


获取本文的实战代码、参考资料,请关注后,在聊天框回复:硬件断点


硬件断点介绍


硬件断点与软件断点类似,都是一种代码调试的手段,可以让代码中断在需要的地方,方便调试。


软件断点是调试器在断点位置插入 int 3汇编指令实现的。硬件断点顾名思义是依赖硬件cpu,主要是靠dr0~dr7 ,8个调试寄存器实现的。


硬件断点比软件断点的功能更强,除了函数断点外,还可以数据断点,可以指定当数据被读或写时中断。


硬件断点的本质就是在指定内存下断点,内存可以位于代码段(函数断点)也可以是数据段(数据断点)。可以设置事件有执行、写入、读写时中断。


调试器使用硬件断点实现数据断点功能(例如gdb的watch命令)


一些游戏外挂也会使用硬件断点来实现hook效果,介绍完硬件断点以后讲。


调试寄存器

硬件断点是cpu提供的功能,主要是与cpu上的dr0~dr7这8个调试寄存器打交道。下面参考intel手册详细介绍一下。

intel-325462-sdm-vol-1-2abcd-3abcd.pdf ,page 3415


dr0,dr1,dr2,dr3(Debug Address Registers)


dr0~dr3是调试地址寄存器,储存4个硬件断点的内存地址。硬件限制所以最多只有四个硬件断点。


dr4,dr5(保留,暂时没用)



目前没有用,不说了。


dr6(Debug Status Register)



调试状态寄存器,dr6按位使用,我们主要关注B0~B3位。触发硬件断点后,会将对应序号位设置为1。


dr7(Debug Control Register)


可以按位设置硬件断点的属性,包括:开关位、条件位、长度位。


开关位


dr7的开关位控制dr0~dr3号硬件断点是否启用。


条件位


dr7的条件位控制dr0~dr3如何被触发。00 执行时触发。01写入时触发,11读写时触发。


长度位



dr0~dr3指定的内存地址,dr7的长度位控制内存长度。


如果dr7的条件位设置为00执行,则对应的长度位必须是00。


代码实战


设置调试寄存器


windows提供了API,可以设置和获取寄存器。

CONTEXT是一个结构体,里面包含所有寄存器。因为每个cpu有一套寄存器,所以API里需要传线程句柄,设置哪个线程的寄存器。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//