一、调试概述
调试相当于我们看医生,医生会看出我们身体上的问题
windows提供DebugActiveProcess函数来附加目标进程调试进程,参数是进程ID,调试成功返回true,失败返回false。
返回false可以使用GetLastError获取错误
由于不知道什么时候会传来调试信息,所以用一个死循环一直等待目标进程发送调试信息给调试器
用循环中WaitForDebugEvent来等待目标进程传来调试信息
调试信息包括创建进程,创建线程,加载模块等等。。
WaitForDebugEvent第一个参数为反馈的调试信息结构体,第二个参数为等待的时间
DEBUG_EVENT中的union根据不同的调试信息选择不同的结构体
WaitForDebugEvent捕获了一个调试事件后,目标进程会暂停运行,调试器处理信息,处理完后要恢复目标进程,让它继续运行,需要使用ContinueDebugEvent
当调试器附加进程时,调试器会把进程所有的创建进程,创建线程,加载模块等收集起来告诉调试器
二、用户层调试执行流程分析
ZwDebugActiveProcess函数存在于ntdll.dll模块中,参数是进程ID,传入-1时调试的是csrss.exe进程
DebugActiveProcess中调用DbgUiConnectToDbg函数
DbgUiConnectToDbg函数先初始化一个OBJECT_ATTRIBUTES结构
获取_TEB结构体中0xF20中的DbgSsReserved,这个成员是个数组,判断这个数组中的值是否为0