6.硬件断点

本文介绍了硬件断点的原理,通过调试寄存器DR0~DR3设置地址和DR7控制状态,最多可设置4个断点。详细阐述了断点的启用、长度和类型,并详细讨论了被调试进程中的处理流程。硬件断点异常表现为STATUS_SINGLE_STEP的单步异常,同时讲解了EFLAGS寄存器如何控制单步运行。最后,探讨了单步步入与单步步过在遇到CALL指令时的不同处理方式。
摘要由CSDN通过智能技术生成

调试寄存器

  • DR0~DR3:调试地址寄存器,用于设置硬件断点
  • DR4~DR5:保留,未公开具体作用
  • DR6:调试寄存器组状态寄存器
  • DR7:调试寄存器组控制寄存器

硬件断点的原理是使用DR0~DR3设置地址,使用DR7设置状态,因此最多设置4个。

在这里插入图片描述

<1> L0/G0 ~ L3/G3: L0/G0对应DR0,L1/G1对应DR1,以此类推…,用于控制Dr0~Dr3是否有效,Lx是局部的仅影响当前线程,Gx全局的影响当前进程中所有线程。
每次异常后,Lx都被清零,Gx不清零。

<2> 断点长度(LENx):x的下标为几就对应那个控制寄存器,00(1字节) 01(2字节) 11(4字节)

<3> 断点类型(R/Wx):x的下标为几就对应那个控制寄存器,00(执行断点) 01(写入断点) 11(访问断点)

被调试进程
  1. CPU执行时检测到调试寄存器(Dr0~Dr3)
  2. 查IDT表找到对应的断处理函数nt!KiTrap01(1号门)
  3. CommonDispatchException
  4. KiDispatchException।
  5. DbgkForwardException收集并发送调试事件
DbgkpSendApillessage (x, x)
1)第一个参数:消息结构每种消息都有自己的消息结构共有7种类型
2)第二个参数,要不要把本进程内除了自己之外的其他线程挂起.有些消息需要把其他线程挂起,比如异常

这个过程到第3步时,所有断点都一样执行流程都一样。

处理硬件断点:
  1. 硬件调试断点产生的异常是 STATUS_SINGLE_STEP(单步异常
  2. B0~B3:哪个调试地址寄存器触发的异常

设置硬件断点要设置到所属线程的上下文。

单步异常

不单只有硬件断点能触发单步异常,EFLAGS寄存器也可以
在这里插入图片描述

设置单步运行:

TF位置1

处理单步异常:

单步产生的异常是 STATUS_SINGLE_STEP(单步异常)

TF位置1的时候每走完一步就会触发单步异常。

单步步入:
遇到CALL指令会跟进去

单步步过:
遇到CALL不会跟进去,实现原理是计算当指令长度,当前指令长度+当前eip的地方下断(也就是call指令的下一行)。

如果写代码修改返回地址,单步步入没事,单步步过就会跑飞。
在这里插入图片描述

下面代码只有单步步入

//被调试进程句柄
HANDLE hDebuggeeProcess = NULL;
//被调试线程句柄
HANDLE hDebuggeeThread;
//系统断点
BOOL bIsSystemInt3 = TRUE;
//被INT 3覆盖的数据
char OriginalCode = 0;
//线程上下文
CONTEXT Context = {
    0 };

BOOL WaitForUserCommand()
{
   
	BOOL bRet = FALSE;
	char cContext = 0;
	printf("COMMAND> ");
	scanf("%c",&cContext);

	switch (cContext)
	{
   

	case 't':
		bRet = TRUE;
		//1.获取线程上下文
		Context.ContextFlags = CONTEXT_FULL || CONTEXT_DEBUG_REGISTERS;
		GetThreadContext(hDebuggeeThread, &Context);
		//2.设置单步执行
		Context.EFlags |= 0x100;
		//3.设置线程上下文
		SetThreadContext(hDebuggeeThread, &Context);
		break;

	case 'p':
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值