寻找突破口
关于唤醒失败一般存在于内核态,可有两个突破口:
通过查看当前线程和Idle.exe线程ID不同的处理器,但是该处理器处于用户态,而挂死一般是处于内核态,我们换个思路,利用!locks
寻找存在的对象死锁。
在执行!locks命令发现线程87474da8线程拥有多个资源
关键线程
查看线程信息,切换线程,然后查看栈回溯,发现用于睡眠的函数NtSetSystemPowerState
和用于通知设备驱动的程序
了解驱动
使用!drvobj
查看驱动的相关信息。然后利用dt _DRIVER_OBJECT XXXXXXX
来获取_DRIVER_OBJECT结构的信息。
为了了解设备接入方式可以使用!drvstack
来描述设备栈的设备对象的地址,驱动名称等信息。
解析参数
在之前栈回溯中可以发现多个驱动函数被反复调用,但是我们没有驱动的符号信息,只能利用已知函数去推测未知函数的功能
利用已经公开的函数,PoCallDriver来判断,我们知道该函数第一个参数是设备对象,第二个参数是IRP IO请求包(需要调用的驱动程序)利用!devobj
查看第一个参数,利用!IRP
查看IRP。