一般的,SSDT hook会采用直接修改SSDT表的方式来进行,或者采用ETW hook来做,这两种办法都不错。那么我说一种比较水的办法来HOOK,可以针对特定进程进行SSDT hook,其是利用Alt系统来做的。 如果探究过API R3进R0过程的人,肯定会逆向KiSystemCall64函数,不过详细观察该函数,会发现一个奇怪的函数PsAltSystemCallDispatch。该函数会在进程设置某些标志位的情况下调用,并且获得TrapFrame。
通过图片上给出的汇编不难看出,该函数传入的是TrapFrame,我们可以转进去看一下。
会发现里面竟然从PsAltSystemCallHandlers地址处拿指针并执行(_guard_dispatch_icall就是个检查一下指针然后call过去)。
此处这个ida的结构体有问题,我们可以看一下真实结构(_KTHREAD第一个结构是_DISPATCHER_HEADER):这里判断4也就是(Minimal)。继续往后看看。 有指针,果断交叉引用一下快快会不会有什么地方写入,会发现竟然有写指针的函数,和开启该功能的函数。
通过该函数可以发现,PsAltSystemCallHandlers只有2个成员,且通过调用该函数可以直接注册回调函数。
通过图片的分析我们可以看出来,如果设置的index有回调函数了,就会蓝屏,也就是意味着如果设置了就无法覆盖。
好消息是该函数是导出的函数。
所以我们可以直接调用的。 通过分析该函数的传入参数不难看出,其主要是设置了程序执行体和线程执行体上的标志位。
这里可以从结构中看出,主要是设置了AltSyscall开启。但是很遗憾该函数并未导出,但是天无绝人之路,可以直接用NtSetInformationProcess开启。
可以设置ProcessInformationClass的值为0x64来开启,其中发现ProcessInformation的值没用过,只要不是0就可以了。 直接调用这个函数就可以了,第一个参数传入pid,第二个是回调函数。 最重要的事情是:这个东西在win10上可行,win11已经进行了修改。 。
第二重要的是:注册过回调之后无法再次注册,意味着如果对某个进程开启监控时无法停止,也不能卸载驱动,除非进程结束。struct _DISPATCHER_HEADER
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-287965.htm