论坛首页 逆向工程技术区 阅读主题

[原创] 没什么用之——R0下不一样的SSDT Hook

405 浏览 20 回复
#1 楼主 2026-06-01 21:08:56
一般的,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
#17 2026-06-01 21:08:56
学习
#18 2026-06-01 21:08:56
学习学习
#19 2026-06-01 21:08:56
这个讨论对我很有帮助,谢谢!
#20 2026-06-01 21:08:56
神墨水
#21 2026-06-01 21:08:56
学习了
‹ 上一页 1 2 下一页 ›

请登录后参与讨论

立即登录 注册账号