根据软件调试书上所说,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 函数