欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

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

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

前言:去了杭州一个月,兼职了一个月,收获了不少.
   最大体会是中国人都很热情,有时候嘴上面说的,到了最后都会推脱掉,这一点是让我印象最深刻的,我是不是也应该学习学习.
正言:不扯淡了,说说硬件断点 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

上传的附件 1.jpg
2.jpg
3.gif
Dr7.zip

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功