[原创]这两天对某P双机调试的学习及成果
首先感谢15PB各位老师给予我学习的帮助
,通过在15PB的学习我也感觉到了自己的进步
,算是打个广告,嘿嘿
下面进入正题,新手首次发这种帖子,忘大神高抬贵手~
关于*P双机调试的学习
一:相关基础知识:
根据软件调试这本书上说的,Windows启动过程如下图:
系统一共调用了两次KdInitSystem()函数。
第一次调用KdInitSystem会初始化一下全局变量:
1.KdPitchDebugger:布尔类型,用来表示是否显式抑制内核调试。当启动选项中包含/DEBUG选项时,这个变量会被设置为真。
2.KdDeBuggerEnable:布尔类型,用来表示内核调试是否被启用。当启动选项中包含/DEBUG或者/DEBUGPORT 而且不包含/NODEBUG时,这个变量会被设置为真。
3.KiDebugRoutine:函数指针类型,用来记录内核调试引擎的异常处理回调函数,当内核调试引擎活动时,只想KdpTrap函数,否则指向KdpStub函数。
4.KdpBreakpointTable:结构数组类型,用来记录代码断点,每一个元素为BREAKPOINT_ENTRY结构,用来描述一个断点,包括断点地址。
5.
可见KdDebuggerNotPresent也是一个判断是否是内核调试状态的标志。
6.根据先前大牛写的这个帖子http://bbs.pediy.com/showthread.php?t=186091
讲过KdEnteredDebugger也是一个判断是否为内核调试状态的标志。
7.如果是内核调试状态,KiDebugRoutine指向KdpTrap函数,如果不是内核调试状态则指向KdpStub函数。
综合上述,上述7点中的任何一点可以判断是否处于内核调试状态。
二:接下来看一下*P对内核做的手脚。
1.解决*P加载蓝屏的方法:
根据上面提到的帖子上有给出解决方案,因为*P会访问KdEnteredDebugger的内容所以Hook IoAllocMdl,当访问KdEnteredDebugger的时候让他去访问其他始终为0的地址。具体可以看上面帖子的地址。
2.解决完1之后,在虚拟机启动*P就不会蓝屏了,*P会有两个IAT Hook 两个通讯函数:KdSendPacket 和KdReceivePacket,反汇编一下这两个函数:
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
复制成功
