在32系统下, 例如我们要HOOK SSDT表,那么直接讲CR0的内存保护属性去掉. 直接讲表的地址修改即可.
但是在64位系统下,不可以这样操作了.
第一是因为 SSDT表加密了.
第二是 SSDT表你就算解密了. 那么你的API的地址也会放的很远. SSDT表放不下4G以外的地址. 所以也不能放.
而现在.试想一下, 杀毒软件也要在内核中做点手脚. 如果不能HOOK了,它们该怎么发展那?
所以到了win7 (64位)系统下, 微软被玩怕了. 直接告诉你. 你想HOOK那个API,我帮你做. 你不用动手做. 而且我的还稳定.不会蓝屏.
所以x64下的HOOK都是很简单的
比如 xxx杀毒软件要监视进程的创建. 那么微软就说.我给你API调用,你提供回调. 当创建的时候我就通知你. 返回值也是你说了算.
这样我们就可以使用它的API了. 线程. 模块都是这样的.
API:
PsSetCreateProcessNotifyRoutineEx
函数原型
这个函数的作用就是 当进程创建的时候会通知你.
参数一回调函数原型
进程额外信息结构体
我们如果对返回状态进行操作. 那么如果你返回值给失败,那么进程就不会创建. 也就实现了我们阻止进程的创建了.
内核 代码实际操作 阻止calc计算器的创建.
initHook函数代码.
回调函数代码.
回调卸载函数.
代码图片:
其中UnInstallHook则是调用卸载回调的函数.
驱动入口点调用initHook即可.
拦截图片:
编译好我们的驱动.去x64加载. 打开计算机则会被拦截.
原理:
如果想知道原理,那么就要看Wrk源码.而在Wrk中,并没有这个API,这个API是64位才有的.但是在32下有一个,有一个不带EX版本的.我们可以参考一下.
通过源码可以发现.是操作数组.且这个数组里面是我们填写的回调.操作系统会依次调用回调.
跟随数组查看.
跟随查看,发现是个定长数组.里面只有八项.但是在32位,没人会使用这个API.所以8项正好,但是在64位系统下,数组变为了64
也就是说.我们可以通过找到数组首地址,进行HOOK里面的回调.那么我们的就会执行.当然我们也可以自己注册.
线程拦截和进程拦截相似.但是在64位下,微软提供的HOOK函数没有这么强大.
并没有带有EX的.
所以我们只能用原来的.
线程监控API
监控: PsSetCreateThreadNotifyRoutine
取消监控: PsRemoveCreateThreadNotifyRoutine
监控原型:
卸载函数原型:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-2-1 17:09
被admin编辑
,原因: