WinDbg 与被调试机的通信过程

原文摘自百度百科,讲实话这是我在百科里看到的最良心的文,可惜百科也是抄的别人的 🙃。

WinDBG和用户调试器一点很大不同是内核调试器在一台机器上启动,通过串口调试另一个相联系的以Debug方式启动的系统,这个系统可以是虚拟机上的系统,也可以是另一台机器上的系统(当然也可以是本地内核调试,不需要第二台机器)。windbg 提供的调试功能并不是都集成在了程序本身,很多功能被 windows集成进了内核,WinDBG 只是用来作为 “通讯工具” ,来让被调试机器和本机保持联系。

当异常发生于内核态下,会调用KiDebugRoutine两次,异常发生于用户态下,会调用KiDebugRoutine一次。这些都是发生在异常刚产生的时候。

KdpStub
当 WinDBG 未被加载时 KiDebugRoutine 为 KdpStub 。KdpStub 主要负责处理由 int 0x2d 引起的异常(DbgPrint、DbgPrompt、加载卸载SYMBOLS 等),其中最重要的是把 eip++,跳过 int 0x2d 后面跟着的 int 0x3 指令。

KdpTrap
真正实现了 WinDBG 功能的函数是 KdpTrap ,责处理所有 STATUS_BREAKPOINT(断点) 和 STATUS_SINGLE_STEP(单步)异常,下面是常见的几种异常的处理方式:

  • DbgPrint:调用 KdpTrap 发送含有字符串的包。
  • DbgPrompt:先将含有字符串的包发送出去,再陷入循环等待接收来自调试器的含有回复字符串的包。
  • 加载卸载 symbol:调用 KdpReportSymbolsStateChange(来自 KdpSendWaitContinue
  • int 0x3 和 int 0x1:调用KdpReportExceptionStateChange(来自 KdpSendWaitContinue

KdpSendWaitContinue
KdpSendWaitContinue 负责各个功能的分派。这个函数向内核调试器发送要发送的信息,比如当前所有寄存器状态,每次单步后我们都可以发现寄存器的信息被更新,就是内核调试器接受它发出的包含最新机器状态的包。
KdpSendWaitContinue 可以 读写内存、搜索内存、设置/恢复断点、继续执行、重启等等,总体来说 windbg 的所有功能都由这个函数完成。

KiDispatchException
每次内核调试器接管系统是通过调用在 KiDispatchException 里调用 KiDebugRoutine(KdpTrace),但要让系统执行 KiDispatchException 必须是系统发生了异常,而内核调试器与被调试系统之间只是通过串口联系,串口只会发生中断,并不会让系统引发异常。
那么是怎么让系统产生一个异常呢 ? 答案就在 KeUpdateSystemTime 里,每当发生时钟中断后在 HalpClockInterrupt 做了一些底层处理后就会跳转到这个函数来更新系统时间,在 KeUpdateSystemTime 里会判断 KdDebuggerEnable 是否为 TRUE,若为 TRUE 则调用 KdPollBreakIn 判断是否有来自内核调试器的包含中断信息的包,有则调用 DbgBreakPointWithStatus ,执行一个int 0x3 指令。

被调试系统和内核调试器之间的通信
被调试系统和内核调试器之间通过串口发数据包进行通信,在被调试系统准备要向内核调试器发包之前先会调用 KdEnterDebugger 暂停其它处理器的运行并获取Com端口自旋锁,并设置端口标志为保存状态。发包结束后调用KdExitDebugger恢复。每个包就象网络上的数据包一样,包含包头和具体内容。包头的格式如下:

typedef struct _KD_PACKET {
	ULONG PacketLeader;
	USHORT PacketType;
	USHORT ByteCount;
	ULONG PacketId;
	ULONG Checksum;
} KD_PACKET,*PKD_PACKET;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值