本帖最后由 零五零八 于 2020-9-30 13:58 编辑
一、通过内核态调试器重定向用户态调试器
在内核态调试会话中控制用户态调试器,并将用户态会话与系统行为同步起来。
在控制用户态调试器时,系统的行为是冻结的,所输入的指令会由用户态调试器执行,执行命令的时候系统是运行的,指令执行过程中输出的信息会打印在内核态调试器上,指令执行完后会冻结系统回到内核态调试器等待下一个输入,并且随时可以与内核态调试来回切换。
切换到用户态调试时,会显示用户态提示符Input>,切换到内核态调试时,会显示内核态提示符kd>。 需要注意的是,切换到内核态调试时,当前进程是调试器进程,不是被调试的目标进程。
二、使用场景:
1、在系统启动的早期阶段或者系统关闭的后期阶段当不存在交互式的控制台时调试进程; 2、分析进程间通信问题;
三、搭建步骤:
1、使用windbg内核态调试目标机器;
2、目标机器上用管理员权限以参数-d启动用户态调试器(调试器进程要有SeDebugPrivilege权限,所以要以管理员权限启动); ntsd -d <Process Path> ntsd -d -p <PID> 3、命令执行完后,自动切换到windbg内核调试器,显示的是用户态提示符Input>;
三、操作方法:
1、用户态提示符切换到内核态提示符: (1)输入.breakin;
(2)在要求用户态调试器执行一个很长时间的指令后(比如.sleep 10000会休眠4s),通过Ctrl+C、Ctrl+PrtScr或Ctrl+break引发一个中断,内核态调试器会将其解释为一个内核事件;
2、内核态提示符切换到用户态提示符: 通过扩展命令!bpid <pid>重新获得用户态提示符;(需要等很长一段时间)
3、系统运行状态下直接获得用户态调试器的控制权: 目标机器上运行breakin.exe <pid>,之后系统直接切换到用户态提示符;
|