记录下过*P的内核调试(蓝屏 无法显示进程)的问题

本文详细介绍了Windows启动过程中涉及的内核调试初始化步骤,包括关键全局变量的作用及设置方法,如KdPitchDebugger、KdDeBuggerEnabled等,并提供了一种禁用调试的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根据软件调试书上所说,windows启动过程中系统需要调用两次 KdInitSystem()函数。

第一次调用KdInitSystem()的时候会初始化一些全局变量包括:

1,KdPitchDebugger : 布尔类型,用来表示是否抑制内核调试。当启动选项中包含/DEBUG选项的时候,这个变量会       被置为假。

2,KdDeBuggerEnabled: 布尔类型,用来表示内核调试是否被启用。当启动选项中包含/DEBUG或                                  者/DEBUGPORT,而且不包含/NODEBUG时,这个变量会被置为真。

3,KiDebugRoutine: 函数指针类型,用来记录内核调试引擎异常处理回调函数,当内核调试引擎活动时,指向                 kdpTrap函数,否则指向KdpStub函数。

                      

4,KdpBreakpointTable: 结构数据类型,用来记录代码断点,每一个元素为 BREAKPOINT_ENTRY结构,用来描述         一 个断点,包括断点地址。

5,KdDebuggerNotPresent: 布尔类型,用于在内核调试器对话过程中,接受到复位包之后,会将此全局变量设置为0

6,KdEnteredDebugger: 布尔类型,当内核调试器收到复位包之后清零KdDebuggerNotPresent冻结内核的时候,k         KdEnterDebugger函数会赋值KdEnteredDebugger = TRUE。

      

      所以这里可以直接patch掉,eb 8065f7f1 c7 05 c4 d6 54 80 00

      同时可以通过在KdEnterDebugger函数下断点来追踪 *p的调用。



总结:综上所述如果要在双击调试*P的话,首先需要做如下几件事:

          KdPitchDebugger  = TRUE

          KiDebugRoutine  指向 KdpStub

          KdDeBuggerEnabled = 0

          KdDebuggerNotPresent =  TRUE

          patch 以下 KdEnterDebugger 函数

          

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值