首页
社区
课程
招聘
[原创]简易调试器的原理_15PB
发表于: 2015-12-6 11:49 20799

[原创]简易调试器的原理_15PB

2015-12-6 11:49
20799

这是我在15PB做的一个项目
简易调试器的实现

调试器实现的依赖.
1.CPU支持调试功能
1.1CPU中,有标志寄存器EFLAGS的IF,TF标志位用于开启调试功能,如果一个进程是以调试状态开启,且其线程环境(CONTEXT)中的EFLSGS的TF标志位是1,那么这个进程执行一条指令后,将会产生一个异常,异常被处理后,TF自动被重置为0
1.2CPU有DRx(DebugRegister)系列的寄存器可用于断点功能.

DR0~DR3这四个寄存器是断点地址存储器,用于保存断点的地址
DR6是调试状态寄存器用于指明DR0~DR3寄存器中哪一个产生了调试异常
DR6寄存器使用比特位B0~B3来指明DR0~DR3中哪个产生了调试异常
DR7是断点属性控制器
DR7寄存器分别保存着DR0~DR3的断点地址对应的断点的属性,属性有如下几种:
L0~L3:这个比特位等于1,则断点为本地断点.
G0~G3:这个比特位等于1,则断点为全局断点.
R/W0-R/W3:
00:执行断点
01:数据写入断点
10:I/0读写断点
11:读写断点()读取指令不算)
2.操作系统提供的功能
Windows有一个调试子系统,所有的异常(包括CPU产生的异常)都会中断到调试子系统中,进程产生异常后,调试子系统会捕捉到这个异常,如果这个进程是以被调试状态创建,那么,调试子系统会将这个异常派发到产生异常的进程的父进程.
如果其父进程的代码用有函数WaitForDebugEvent(),那么,函数将会从等待状态中被唤醒,返回到其父进程的调用地点.并将异常信息保存到DEBUG_EVENT结构体中.

调试器实现的原理:
程序在运行起来后,其执行指令的速度是光速的.由于人类无法从光速中看清真相,程序出错也是光速的,常会在人无法预知的时候发生了无法预知的错误,让程序变慢,或者停下来是一种能够查明程序出错,或者程序运行机制的重要技能.
程序的运行,是通过CPU对指令流的处理,如果CPU能够听人指挥,一直在指令流的指定地点处执行,那么,程序的流程不会
接着往下走,程序就自然而然的停下来了.
前面说的异常,其实就是CPU告诉操作系统,大佬,我看到了一条让我停下来的指令(0xcc,遇到了DRx寄存器中保存的地址,
除0等),现在该怎么办.
操作系统遇到了这个情况,赶紧回想,自己没有发布这样的指令,于是就让它的马仔调试子系统去解决这个问题,调试子系统会查看进程是否被人调试了,一看,真是被调试了,于是找到了调试这个进程的人的电话(PrentProcessID),打了个电话给那个人.
如果那个人装了电话(WaitForDebugEvent),那么就能从这个电话中得到信息,调试子系统会跟那个人约定,你先去解决吧,我就在这等着,于是那个人就可以针对调试子系统给的信息做出对应的处理.最后就答复调试子系统有没有处理成功.
调试子系统就会拍拍屁股回去,让被调试的进程继续执行或是一直执行那条指令.

调试器在刚才说的作品中扮演的角色就是被调试进程的父进程.
下面就是调试器要完成的流程:

1.以调试创建一个进程或附加到一个进程

CreateProcess(/*创建调试线程*/
pszFilePath,//可执行模块路径
NULL,//命令行
NULL,//安全描述符
NULL,//线程属性是否可继承
FALSE,//否从调用进程处继承了句柄
DEBUG_ONLY_THIS_PROCESS,//启动方式,这里是以只调试的方式创建一个还没有运行的进程
NULL,//新进程的环境块
NULL,//新进程的当前工作路径(当前目录)
&stcStartupInfo,//指定进程的主窗口特性
&stcProcInfo//接收新进程的识别信息
);
2.创建完进程后,需要安装个电话,静静的等待调试子系统找上门来:

DEBUG_EVENTstcDeEvent={0};//这是保存调试子系统发来的信息的结构体
WaitForDebugEvent(&stcDeEvent,//保存异常信息的结构体
INFINIT//等待时间
);
2.1关于解读DEBUG_EVENT结构体的一些方法和注释

typedefstruct_DEBUG_EVENT{
	DWORDdwDebugEventCode;//发生异常的是什么事
	DWORDdwProcessId;//触发异常的进程ID(如果被调试进程有多个进程,这个ID有可能是其子进程的)
	DWORDdwThreadId;//触发异常的线程ID(如果被调试进程有多个线程,这个ID有可能是其中的一个线程的
	union{
		EXCEPTION_DEBUG_INFOException;//异常类型信息
		CREATE_THREAD_DEBUG_INFOCreateThread;//创建线程时得到的信息结构体(有可能会创建多个线程)
		CREATE_PROCESS_DEBUG_INFOCreateProcessInfo;//创建进程时得到的信息结构体,有可能会得到多个
		EXIT_THREAD_DEBUG_INFOExitThread;//线程退出的信息结构体
		EXIT_PROCESS_DEBUG_INFOExitProcess;//进程退出的信息结构体
		LOAD_DLL_DEBUG_INFOLoadDll;//加载模块的信息结构体
		UNLOAD_DLL_DEBUG_INFOUnloadDll;//卸载模块的信息结构体
		OUTPUT_DEBUG_STRING_INFODebugString;//输出调试字串的信息结构体
		RIP_INFORipInfo;//系统调试错误时的信息结构体
	}u;//这是一个联合体,dwDebugEventCode决定联合体中哪个字段是有用的.
}DEBUG_EVENT,*LPDEBUG_EVENT;
	CREATE_PROCESS_DEBUG_EVENT创建进程之后发送此类调试事件,这是调试器收到的第一个调试事件。
	CREATE_THREAD_DEBUG_EVENT创建一个线程之后发送此类调试事件。
	EXCEPTION_DEBUG_EVENT发生异常时发送此类调试事件。
	EXIT_PROCESS_DEBUG_EVENT进程结束后发送此类调试事件。
	EXIT_THREAD_DEBUG_EVENT一个线程结束后发送此类调试事件。
	LOAD_DLL_DEBUG_EVENT装载一个DLL模块之后发送此类调试事件。
	OUTPUT_DEBUG_STRING_EVENT被调试进程调用OutputDebugString之类的函数时发送此类调试事件。
	RIP_EVENT发生系统调试错误时发送此类调试事件。
	UNLOAD_DLL_DEBUG_EVENT卸载一个DLL模块之后发送此类调试事件。
if(stcDeEvent.dwDebugEventCode==EXCEPTION_DEBUG_EVENT)
{
//做点事情
}
ContinueDebugEvent(
					stcDeEvent.dwProcessId,//指明是哪个被调试进程发的消息
					stcDeEvent.dwThreadId,//指明是哪个被调试进程下的线程发的消息
					DBG_CONTINUE
				);

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 3
支持
分享
最新回复 (27)
雪    币: 204
活跃值: (911)
能力值: (RANK:1324 )
在线值:
发帖
回帖
粉丝
2
好文章,学习了
2015-12-6 13:26
0
雪    币: 22
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这样原理性的文章就该多一些
2015-12-6 14:41
0
雪    币: 62
活跃值: (971)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
写得不错,学习了
2015-12-6 15:18
0
雪    币: 6
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习大神见解。
2015-12-6 19:58
0
雪    币: 60
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
喜欢这种“有理有锯”的帖子~
2015-12-6 20:38
0
雪    币: 764
活跃值: (147)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Good Article...
2015-12-7 01:06
0
雪    币: 768
活跃值: (530)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
8
幽默的原理解析,,,赞!!
2015-12-7 08:12
0
雪    币: 300
活跃值: (2477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
赞一个,mark
2015-12-7 08:17
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢分享,对我有帮助
2015-12-7 08:49
0
雪    币: 216
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
好文章,顶一个~
2015-12-7 11:11
0
雪    币: 393
活跃值: (224)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
12
写的还可以
2015-12-7 17:07
0
雪    币: 212
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kkx
13
好文章,学习了
2015-12-8 06:15
0
雪    币: 152
活跃值: (92)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
14
你是对的,TF标志位在第八个比特位
2015-12-8 07:18
0
雪    币: 207
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
果然是大神啊~~~~~~~~~~
2015-12-8 16:33
0
雪    币: 191
活跃值: (848)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
16
支持支持支持支持支持支持支持支持支持支持支持支持▓▓▓▓▓▓▓▓▓支持支持
支持支持支持支持支持支持支持支持支持支持支持支持▓▓▓▓▓▓▓▓▓支持支持
支持支持支持支持支持支持支持支持支持▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓支持支持
支持支持支持支持支持支持支持支▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓支持支持
支持支持支持支持支持支▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓支持支持支持支持支持
支持支持支持支持▓▓▓▓▓▓▓支▓▓▓支持▓▓▓▓▓支持支持支持支持支持支
支持支▓▓▓▓▓▓▓▓▓▓▓▓支持支持支持▓▓▓▓支持支持支持支持支持支持
支▓▓▓▓▓▓▓▓▓▓▓▓▓▓支持支持支持▓▓▓▓支持支持支持支持支持支持
支▓▓▓▓▓▓▓▓▓▓▓▓支持支持支持支▓▓▓▓▓▓▓▓▓▓▓支持支持支持
支▓▓▓▓▓▓▓▓▓▓▓▓支持支持支持▓▓▓▓▓▓▓▓▓▓▓▓▓▓支持支持
支持▓▓▓▓▓▓▓▓▓▓支持支持支▓▓▓▓▓▓支持支▓▓▓▓▓▓▓支持支持
支持支持支持支持▓▓▓▓支持支持支▓▓▓▓支持支持支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支持▓▓支持支▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支持▓▓▓▓支▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支持▓▓▓▓支▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支持▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支持▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支▓▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支▓▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支▓▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓▓支▓▓▓▓支持▓▓▓▓▓支持支持支
支持支持支持支持▓▓▓▓支持支持▓▓▓支持▓▓▓▓支持▓▓▓▓▓支持支持支
支持▓▓支持支▓▓▓▓▓支持支持▓▓▓支持▓▓▓支持支▓▓▓▓▓支持支持支
支持▓▓▓▓▓▓▓▓▓▓支持支持支▓▓支持▓▓支持支持▓▓▓▓▓支持支持支
支持支▓▓▓▓▓▓▓▓▓支持支持支持支持▓▓▓支持支持支▓▓▓▓支持支持支
支持支持支▓▓▓▓▓▓▓支持支持支持支持▓▓▓支▓▓▓▓支持支持支持支持支
支持支持支持▓▓▓▓▓▓支持支持支持支▓▓▓▓支持▓▓▓▓▓支持支持支持支
支持支持支持支持支▓▓▓支持支持支持▓▓▓▓▓支持支▓▓▓▓▓▓▓支持支持
支持支持支持支持支持支持支持支持▓▓▓▓▓▓支持支持支▓▓▓▓▓▓支持支持
支持支持支持支持支持支持支持支▓▓▓▓▓▓支持支持支持▓▓▓▓▓▓▓支持支
支持支持支持支持支持支持支持▓▓▓▓▓支持支持支持支持支▓▓▓▓▓▓支持支
支持支持支持支持支持支持支▓▓▓▓▓支持支持支持支持支持支▓▓▓▓支持支持
支持支持支持支持支持支持▓▓▓支持支持支持支持支持支持支持支▓▓▓支持支持
2015-12-17 20:34
0
雪    币: 9941
活跃值: (2143)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
15PB的培训搞得不错啊
2015-12-17 21:30
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
文章不错,学习了
2015-12-17 21:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
好文章学习了
2016-1-4 11:39
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
帖子写的生动有趣,看着不乏味,楼主这个可以有
2016-1-8 09:00
0
雪    币: 157
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
这个鞋的不错先马后学  楼主还挺风趣的
2016-1-8 13:38
0
雪    币: 151
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
支持一下写的不错
2016-1-14 08:31
0
雪    币: 160
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
楼主的幽默打动了握,要是大家都可以写一些这样的文章,我想我会很有兴趣学习的
2016-1-16 09:38
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
谢谢了.正好需要这个资料
2016-6-5 07:16
0
雪    币: 82
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
说得很详细,原理方面表示看懂了。
2016-6-16 13:13
0
游客
登录 | 注册 方可回帖
返回
//