-
-
[原创]学硬核知识-硬件断点
-
发表于: 2022-1-10 23:00 8687
-
上一篇文章我们介绍了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里需要传线程句柄,设置哪个线程的寄存器。
赞赏
- [原创]gcc xxx.cpp究竟经历了什么? 6630
- [原创]mutex实现与性能 16234
- [原创]SUID提权:CVE-2021-4034漏洞全解析 8916
- [原创]原理+代码实战:SUID提权渗透 7558
- [原创]CVE-2021-4034提权(一)进程凭证与文件权限 11160