发现Process Explorer一个很恶心的Bug

   procexp的驱动在调用ZwQuerySystemInformation之前调用了KfRaiseIrql,并且传入NewIrql为DISPATCH_LEVEL,而nt!NtQuerySystemInformation是分页的,会有蓝屏的风险,这也就算了,更雷人的是,调用这个函数失败后,它不判断具体的错误码,武断的认为是内存大小不够,释放掉调用前分配的内存增大大小重新分配,然后又直接jmp到调用ZwQuerySystemInformation的call那里了,是jmp啊,不会退出死循环!!!!!!!
发现过程
    忘记了自己对驱动挂了verifier,感觉系统有些慢,就用procxp看看explorer慢在哪里,打开explorer占用率最高的线程,双击要看它的栈,结果蓝屏了,报崩溃是我的驱动。
    抓了看dump是由于我的驱动hook了nt!NtQuerySystemInformation函数,而且hook函数里操作了ERESOURCE,而当前IRQL为DISPATCH_LEVEL,导致内存错误。
    感到很奇怪往上翻了下调用栈发现procxp查看线程栈的时候去call ZwQuerySystemInformation,call之前提升了irql,无语,算了谁让我自己判断不严,加个过滤高于APC_LEVEL直接抛给原函数我不管了。
    重新编译再次测试通过procxp查看线程栈的时候还是蓝屏,而且我什么也没有动,原封不动抛给nt!NtQuerySystemInformation了,好崩溃,继续往上看调用栈,发现我驱动上面一层给我的NtQuerySystemInformation的ssdt hook函数给inline了,操什么世道啊,看那个函数也没有动参数应该不会出问题,此时开始怀疑nt!NtQuerySystemInformation,翻了翻wrk发现不知这个函数还有好多未公开的函数都被微软给设置text属性是page了,怪不得会蓝屏。
    但是还是相兼容下,就在自己函数里对IRQL过高的直接返回access_violation,重新测试下,居然死机了,还不是真死,鼠标动不了界面动不了,发现还有线程在跑。怀疑出问题的那一留栈没有正确处理irql升降,但是想想自己是双核机器,就算一个核不调度了,也不至于我的鼠标都被卡住了吧。没办法只好继续看procxp驱动的调用栈,貌似它也从NtQuerySystemInformation退出了,可是看它的调用栈中它自己的函数偏移和前两次差别不大,反汇编看过去,当场雷倒。它就判断下返回值是不是0,不是0就重新分配内存jmp到调用NtQuerySystemInformation的地方去再次调用,由于我返回的一直是access_violation,所以它就不停分配内存死循环,搞得系统没有内存了。
    真是无语了,我没看我的procxp版本,不知道有最新的修改过没。不过想了想这个函数用的这么频繁,应该所占内存基本上不会被切换出去,所以挂verifier挂不到这么特殊的地方估计还发现不了procxp这个问题呢。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值