首页
社区
课程
招聘
[原创]暑假浅谈系列-硬件断点
发表于: 2014-8-25 13:24 6098

[原创]暑假浅谈系列-硬件断点

2014-8-25 13:24
6098
前言:去了杭州一个月,兼职了一个月,收获了不少.
   最大体会是中国人都很热情,有时候嘴上面说的,到了最后都会推脱掉,这一点是让我印象最深刻的,我是不是也应该学习学习.

正言:不扯淡了,说说硬件断点 Dr7;
      |---------------|----------------|
Dr7 |RWE LEN   ...    RWE LEN      |     G              G L G L GL GL GL |
      | 3        3     ...      0    0          |     D              E E 3 3 22 11 00 |
      |---------------|----------------|
      31                                          15  13              9                       0
1.
LEN LEN为一个两位的字段,用以指示断点的长度。每一断点寄存器对应一个这样的字段,所以共有四个这样的字段分别对应四个断点寄存器。LEN的四种译码状态对应的断点长度如下

LEN 说明 :
0 0 断点为一字节
0 1 断点为两字节
1 0 保留
1 1 断点为四字节
2.
这里,如果断点是多字节长度,则必须按对应多字节边界进行对齐。如果对应断点是一个指令地址,则LEN必须为00
RWE RWE也是两位的字段,用以指示引起断点异常的访问类型。共有四个RWE字段分别对应四个断点寄存器,RWE的四种译码状态对应的访问类型如下

RWE 说明
0 0 指令
0 1 数据写
1 0 保留
1 1 数据读和写
3.
GE/LE GE/LE为分别指示准确的全局/局部数据断点。如果GE或LE被置位,则处理器将放慢执行速度,使得数据断点准确地把产生断点的指令报告出来。如果这些位没有置位,则处理器在执行数据写的指令接近执行结束稍前一点报告断点条件。

每当启用数据断点时,启用LE或GE。降低处理机执行速度除稍微降低一点性能以外,不会引起别的问题。但是,对速度要求严格的代码区域除外。这时,必须禁用GE及LE,并且必须容许某些不太精确的调试异常报告。
L0—L3/G0—G3 L0—L3及G0—G3位
我们在网上百度硬件断点时候常常看到Dr7=0x405是什么意思呢:
           GL  GL  GL  GL   GL
           EE  33  22  11   00
地址:1  00  00  00  01   01
     10

4.
继续分析:
各个L位(即LE,L0—L3)是有关任务的局部位,使调试条件只在特定的任务启用。而各个G(即GD,G0—G3)是全局的,调试条件对系统中的所有任务皆有效。在每次任务切换时,处理器都要清除L位。
我们设置硬件断点时候,断一次后运行在运行,那个断点就没了,清除掉了.
DWORD Test()
{
	printf("硬件断点地址0x%x\n",&Test);
	MessageBox(0,L"这个是硬件断点出发",L"",MB_OK);
	return 0;
}
DWORD TestB()
{
MessageBox(0,L"异常转到",L"",MB_OK);
return 0;
}
void SetBreakpoint()
{
	CONTEXT ctx;
	ctx.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;;
	GetThreadContext(GetCurrentThread(), &ctx);
	ctx.Dr0 = (DWORD)&Test;
	
	//ctx.Dr2=0x0012f914;
	ctx.Dr7 = 0x405;
	SetThreadContext(GetCurrentThread(), &ctx);
}
DWORD NTAPI ExceptionHandler(EXCEPTION_POINTERS * ExceptionInfo)
{
	if ((DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress == (DWORD)&Test)
	{
		ExceptionInfo->ContextRecord->Eip =(DWORD)&TestB;
		return EXCEPTION_CONTINUE_EXECUTION;
		//EXCEPTION_CONTINUE_EXECUTION;
	}
	else
	{

		ExceptionInfo->ContextRecord->Dr0 = 0x009E235E;
		ExceptionInfo->ContextRecord->Dr7 = 0x405;
		return EXCEPTION_CONTINUE_SEARCH;
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	AddVectoredExceptionHandler(1,(PVECTORED_EXCEPTION_HANDLER)ExceptionHandler);
SetBreakpoint();
Test();

	return 0;
}




开启调试器,触发硬件断点,VEH  EIP指针转移:



事实上Dr7还可以做 HOOK NTAPI.
本人文章写的又烂又渣,请大家不要见怪,本来想每周发一个帖子,结果没空+偷懒了.
大家都去玩移动安全了,PC没人玩了,准备改玩.

群:Super-Rootkis 121157016

[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 3
支持
分享
最新回复 (5)
雪    币: 2664
活跃值: (3401)
能力值: ( LV13,RANK:1760 )
在线值:
发帖
回帖
粉丝
2
第二句是亮点...
2014-8-25 14:14
0
雪    币: 396
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
厉害,硬件断点什么的,还是很模糊啊,得好好研究咯
2014-8-25 14:17
0
雪    币: 60
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
赞一个,优秀的文章。
2014-8-25 14:34
0
雪    币: 2143
活跃值: (720)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
扫盲贴
2014-8-25 16:22
0
雪    币: 433
活跃值: (1895)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
说个很偷懒的方法

这个方法主要是因为加了SE的壳动态设置Dr7会失效

那静态怎样设置呢

Dr7=0x505
....4个全生效...就是这样
2014-8-25 18:43
0
游客
登录 | 注册 方可回帖
返回
//