<格蠹汇编>_第16章_探寻唤醒失败的原因

寻找突破口

         关于唤醒失败一般存在于内核态,可有两个突破口:

  • 1.使用!pcr查看处理器控制区,了解CPU状态
  • 2.使用!locks寻找可能存在的系统死锁

         通过查看当前线程和Idle.exe线程ID不同的处理器,但是该处理器处于用户态,而挂死一般是处于内核态,我们换个思路,利用!locks寻找存在的对象死锁。

         在执行!locks命令发现线程87474da8线程拥有多个资源

关键线程

         查看线程信息,切换线程,然后查看栈回溯,发现用于睡眠的函数NtSetSystemPowerState和用于通知设备驱动的程序

了解驱动

         使用!drvobj查看驱动的相关信息。然后利用dt _DRIVER_OBJECT XXXXXXX来获取_DRIVER_OBJECT结构的信息。

         为了了解设备接入方式可以使用!drvstack来描述设备栈的设备对象的地址,驱动名称等信息。

解析参数

         在之前栈回溯中可以发现多个驱动函数被反复调用,但是我们没有驱动的符号信息,只能利用已知函数去推测未知函数的功能

         利用已经公开的函数,PoCallDriver来判断,我们知道该函数第一个参数是设备对象,第二个参数是IRP IO请求包(需要调用的驱动程序)利用!devobj查看第一个参数,利用!IRP查看IRP。