-
-
[原创]windbg 调试 中断过程
-
发表于: 2025-2-10 13:53 1389
-
在 WinDbg 中调试中断处理程序需要深入理解操作系统的中断机制和内核调试技巧。以下是分步骤的详细指南:
1. 准备工作
内核调试环境:确保已通过 KDNET、串口或 1394 建立内核调试连接
符号配置:使用
.symfix
和.reload
正确加载符号目标系统状态:建议在测试机器上操作,避免生产环境中断
2. 查看中断描述符表(IDT)
windbg
复制
!idt -a
输出示例:
复制
00: fffff80012345678 nt!KiDivideErrorFault ... 0e: fffff8001234abcd nt!KiPageFault ... 80: fffff8001234cafe nt!KiSystemCall64
这里可以看到:
0x00 对应除零错误
0x0E 是页面故障
0x80 是系统调用入口
3. 设置硬件断点
对于不可屏蔽中断(NMI)处理:
windbg
复制
bp nt!KiHandleNMI "kb; g"
关键参数说明:
kb
显示调用栈g
自动继续执行防止系统卡死
4. 软件中断调试示例(系统调用)
windbg
复制
bm /a nt!KiSystemCall64
断点触发后:
复制
r @rip // 查看指令指针 r @rcx // 查看第一个参数(32位系统看 ebx) !process // 显示当前进程
5. 异常中断调试技巧
调试页面故障(0x0E):
windbg
复制
!exchain // 查看异常链 .cxr @ContextRecord // 加载上下文 !analyze -v // 自动分析故障原因
6. 单步调试注意事项
使用:
复制
t = 单步进入 p = 单步跳过
但需注意:
必须禁用中断
!idt -e
后操作可能导致时钟中断丢失引发系统挂起
建议在虚拟机环境操作
7. 中断上下文分析
关键寄存器:
CR2:页面故障线性地址(仅限#PF)
DR6:调试状态寄存器
RFLAGS:中断标志位
8. 实战案例:调试IRQL_NOT_LESS_OR_EQUAL
触发蓝屏后中断到调试器
执行
.bugcheck
查看停止代码使用
!irql
验证当前中断级别分析栈回溯:
复制
kv
检查内存访问:
复制
!pte @cr2 !pool @rax
9. 安全注意事项
始终在非生产环境操作
使用 QEMU/KVM 或 Hyper-V 等虚拟化方案
定期创建系统快照
避免在 DPC 例程长时间断点
10. 高级技巧
条件断点:
windbg
复制
bp /t 0 nt!KeBugCheckEx "j (poi(@rcx) == 0x109) 'kb'; 'gc'"
追踪中断频率:
windbg
复制
bp nt!HalpClockInterrupt "r $t0=@$t0+1; .printf \"/1000 interrupts: %d\\n\", @$t0; gc"
通过以上方法,可以深入分析Windows内核的中断处理机制。调试时要注意中断上下文的特殊性(如栈切换、CR3变更等),建议结合《Windows Internals》和 Intel SDM 第6卷进行原理学习。
赞赏
他的文章
赞赏
雪币:
留言: