先感谢“梦想的天空”提供这么优秀的学习资料
废话不多说,直接上疑问,仔细阅读原文第二篇
原文中间部分有这么一段话
从下面的代码中,我们看到在安装 Hook 和解除 Hook 时参数传递进去的是 ZwQuerySystemInformation,
这样很有可能会让很多朋友认为我们在 Ring0 下的 Hook 的是 ZwQuerySystemInformation,
如果你这样认为的话,那就大错特错了,确实在 Google 上搜索出的一大堆关于 SSDT Hook 中,
很多文章都说是 Hook 的 ZwQuerySystemInformation,而事实上这是大错特错的,
我们这里传入 ZwQuerySystemInformation ,是因为我们需要调用 SYS_INDEX(ZwQuerySystemInformation)
来获得 NtQuerySystemInformation 在 SSDT 中的地址所在的索引号,
然后我们根据这个索引号来 Hook NtQuerySystemInformation,
认识到这一点是非常重要的,因为我一开始也认为是 Hook 的 ZwQuerySystemInformation,
从而导致蓝屏了 n 次,在这里非常鄙视那些把文章从别处拷贝过来也不加验证就乱发表的 ~ 害死人 ~ 当然也要怪自己懒 ~
从上面两端代码来看,installsysservicehook()以及uninstallsysservicehook()这两个函数的参数确实是传的ZwQuerySystemInformation,作者原文(我们这里传入 ZwQuerySystemInformation ,是因为我们需要调用 SYS_INDEX(ZwQuerySystemInformation)),不理解!跟进查看到底是怎么获取Nt系列函数在SSDT内的索引号
代码 77 是一个宏,继续跟进
代码 52 行的注释我感觉应该是 根据 zw 函数获取 nt 函数在SSDT中所对应的服务索引号,疑问来了,
从DriverEntry开始一路跟进查看,我们知道,ServiceFunction其实就是ZwQuerySystemInformation函数的地址
*(地址)怎么就能取出 nt 系列函数的索引号呢?
解决问题的方法就是实践,我们先来查看ZwQuerySystemInformation函数的地址
查看内存 804feff8,看见下面的 ad 是不是感觉很亲切~~~
*(PULONG)((unsigned char *)804feff8 + 1) 就是 00 00 00 ad !
同理,验证一下 ZwTerminateProcess
*(PULONG)((unsigned char *)804feff8 + 1) 就是 00 00 01 01 是不是也感觉很亲切啊~~~