最近电脑突然蓝屏了。错误码为0x3B: SYSTEM_SERVICE_EXCEPTION(https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/bug-check-0x3b–system-service-exception)。
发生这种情况的原因可能是取消引用 NULL 指针或访问了随机的错误地址。这可能是由于内存过早释放或数据结构损坏引起的。
于是我打开蓝屏dmp查看崩溃时堆栈,可以看到是360的一个文件系统过滤驱动(360FsFlt.sys)在调用内核API。
于是我打开了ida,逆向了一下360这个驱动,定位到伪代码如下,对比windbg的参数,发现第一个参数也就是Token为0。
那么这里结合windg和ida的现象,初步认为该蓝屏是360驱动在调用SeQueryInformationToken的时候,抛出了一个错误为访问了非法内存。而直接原因是因为token的值不对,那么token的值为什么不对呢?到底是360驱动本身的bug,还是我们的驱动给他改掉了?不确定,继续往下排查。
github上有个开源项目reactos,是一个开源的windows内核系统,有很多值得借鉴的地方。于是我们在这个项目里面查看SeQueryInformationToken的编码实现,通过IDA逆向nt内核模块计算偏移计算定位到这里。
然后查看UserAndGroupCount,holyshit,这个值怎么这么大,明显不合理啊。
这时候好像没法查了,不知道这个值被谁改的。没办法,只能找360的社区问问了。(问题链接:https://bbs.360.cn/thread-16093498-1-1.html?openid=ZYxwVgs4hBgA08%2BQfRuNbYdAUyTjq%2BQjcVX8fzgUl2k%3D&ticket=gQGO7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyNEthVlFicHdhTWUxZ3MzYnhCYy0AAgQM9UplAwQQDgAA)
结果技术工程师说他们驱动没问题,就是被别人改了,然后我重试了三十次都没复现。
虽然最后没查出来根因,但是蓝屏的时候我们的驱动已经卸载掉了,而且也没有我们申请的内存(没有我们的tag)。所以基本可以自证清白。