首页
社区
课程
招聘
[原创] 没什么用之——R0下不一样的SSDT Hook
发表于: 2025-8-10 20:38 6405

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

2025-8-10 20:38
6405

一般的,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
{
            .....
            union
            {
                UCHAR DebugActive;                                          //0x3
                struct
                {
                    UCHAR ActiveDR7:1;                                      //0x3
                    UCHAR Instrumented:1;                                   //0x3
                    UCHAR Minimal:1;                                        //0x3
                    UCHAR Reserved4:2;                                      //0x3
                    UCHAR AltSyscall:1;                                     //0x3
                    UCHAR UmsScheduled:1;                                   //0x3
                    UCHAR UmsPrimary:1;                                     //0x3
                };
            };
        };
  
    };
    LONG SignalState;                                                       //0x4
    struct _LIST_ENTRY WaitListHead;                                        //0x8
};
struct _DISPATCHER_HEADER
{
            .....
            union
            {
                UCHAR DebugActive;                                          //0x3
                struct
                {
                    UCHAR ActiveDR7:1;                                      //0x3
                    UCHAR Instrumented:1;                                   //0x3
                    UCHAR Minimal:1;                                        //0x3
                    UCHAR Reserved4:2;                                      //0x3
                    UCHAR AltSyscall:1;                                     //0x3
                    UCHAR UmsScheduled:1;                                   //0x3
                    UCHAR UmsPrimary:1;                                     //0x3
                };
            };
        };
  
    };
    LONG SignalState;                                                       //0x4
    struct _LIST_ENTRY WaitListHead;                                        //0x8
};
struct
{
    ULONG Minimal : 1;                                                //0x87c
    ULONG ReplacingPageRoot : 1;                                      //0x87c
    ULONG Crashed : 1;                                                //0x87c
    ULONG JobVadsAreTracked : 1;                                      //0x87c
    ULONG VadTrackingDisabled : 1;                                    //0x87c
    ULONG AuxiliaryProcess : 1;                                       //0x87c
    ULONG SubsystemProcess : 1;                                       //0x87c
    ULONG IndirectCpuSets : 1;                                        //0x87c
    ULONG RelinquishedCommit : 1;                                     //0x87c
    ULONG HighGraphicsPriority : 1;                                   //0x87c
    ULONG CommitFailLogged : 1;                                       //0x87c
    ULONG ReserveFailLogged : 1;                                      //0x87c
    ULONG SystemProcess : 1;                                          //0x87c
    ULONG HideImageBaseAddresses : 1;                                 //0x87c
    ULONG AddressPolicyFrozen : 1;                                    //0x87c
    ULONG ProcessFirstResume : 1;                                     //0x87c
    ULONG ForegroundExternal : 1;                                     //0x87c
    ULONG ForegroundSystem : 1;                                       //0x87c
    ULONG HighMemoryPriority : 1;                                     //0x87c
    ULONG EnableProcessSuspendResumeLogging : 1;                      //0x87c
    ULONG EnableThreadSuspendResumeLogging : 1;                       //0x87c
    ULONG SecurityDomainChanged : 1;                                  //0x87c
    ULONG SecurityFreezeComplete : 1;                                 //0x87c
    ULONG VmProcessorHost : 1;                                        //0x87c
    ULONG VmProcessorHostTransition : 1;                              //0x87c
    ULONG AltSyscall : 1;                                             //0x87c
    ULONG TimerResolutionIgnore : 1;                                  //0x87c
    ULONG DisallowUserTerminate : 1;                                  //0x87c
};
struct
{
    ULONG Minimal : 1;                                                //0x87c
    ULONG ReplacingPageRoot : 1;                                      //0x87c
    ULONG Crashed : 1;                                                //0x87c
    ULONG JobVadsAreTracked : 1;                                      //0x87c
    ULONG VadTrackingDisabled : 1;                                    //0x87c
    ULONG AuxiliaryProcess : 1;                                       //0x87c
    ULONG SubsystemProcess : 1;                                       //0x87c
    ULONG IndirectCpuSets : 1;                                        //0x87c
    ULONG RelinquishedCommit : 1;                                     //0x87c
    ULONG HighGraphicsPriority : 1;                                   //0x87c
    ULONG CommitFailLogged : 1;                                       //0x87c
    ULONG ReserveFailLogged : 1;                                      //0x87c
    ULONG SystemProcess : 1;                                          //0x87c
    ULONG HideImageBaseAddresses : 1;                                 //0x87c
    ULONG AddressPolicyFrozen : 1;                                    //0x87c
    ULONG ProcessFirstResume : 1;                                     //0x87c
    ULONG ForegroundExternal : 1;                                     //0x87c
    ULONG ForegroundSystem : 1;                                       //0x87c
    ULONG HighMemoryPriority : 1;                                     //0x87c
    ULONG EnableProcessSuspendResumeLogging : 1;                      //0x87c
    ULONG EnableThreadSuspendResumeLogging : 1;                       //0x87c
    ULONG SecurityDomainChanged : 1;                                  //0x87c
    ULONG SecurityFreezeComplete : 1;                                 //0x87c
    ULONG VmProcessorHost : 1;                                        //0x87c
    ULONG VmProcessorHostTransition : 1;                              //0x87c
    ULONG AltSyscall : 1;                                             //0x87c
    ULONG TimerResolutionIgnore : 1;                                  //0x87c
    ULONG DisallowUserTerminate : 1;                                  //0x87c

[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!

收藏
免费 89
支持
分享
最新回复 (61)
雪    币: 3595
活跃值: (6301)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
2
学习了
2025-8-10 21:24
0
雪    币: 144
活跃值: (1993)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习了
2025-8-10 21:26
0
雪    币: 1046
活跃值: (1456)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
神墨水
2025-8-10 22:17
0
雪    币: 477
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
这个讨论对我很有帮助,谢谢!
2025-8-10 22:38
0
雪    币: 78
活跃值: (1484)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习学习
2025-8-10 22:55
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
学习
2025-8-10 23:35
0
雪    币: 2765
活跃值: (6278)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
666666666666666666666666
2025-8-11 08:53
0
雪    币: 2765
活跃值: (6278)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9

22h2,这两个值默认都不为零,我修改成功注册后没效果









2025-8-11 10:01
0
雪    币: 7589
活跃值: (3406)
能力值: (RANK:166 )
在线值:
发帖
回帖
粉丝
10
逆向爱好者 22h2,这两个值默认都不为零,我修改成功注册后没效果
看看是不是有什么驱动抢先注册了,第二个默认是0的
2025-8-11 10:36
0
雪    币: 2765
活跃值: (6278)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
11
moshuiD 看看是不是有什么驱动抢先注册了,第二个默认是0的
这个加零是一个函数,加8是八字节的1,函数是系统nto模块里面的。
2025-8-11 12:30
0
雪    币: 4523
活跃值: (5022)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
感谢分享。
2025-8-11 12:46
0
雪    币: 7589
活跃值: (3406)
能力值: (RANK:166 )
在线值:
发帖
回帖
粉丝
13
逆向爱好者 这个加零是一个函数,加8是八字节的1,函数是系统nto模块里面的。
1.确保系统是win10 且干净
2.加0就是系统自己的函数,这个是系统启动的时候设置的。
3.加8默认是0,如果有东西应该是其他驱动捣的鬼
2025-8-11 14:06
0
雪    币: 519
活跃值: (2905)
能力值: ( LV4,RANK:42 )
在线值:
发帖
回帖
粉丝
14
谢谢分享
2025-8-11 15:19
0
雪    币: 204
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
15
谢谢分享
2025-8-11 15:26
0
雪    币: 1404
活跃值: (6863)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
16
1
2025-8-11 18:11
0
雪    币: 378
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
666
2025-8-11 18:19
0
雪    币: 1116
活跃值: (1301)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
18
666学习一下
2025-8-11 19:30
0
雪    币: 0
活跃值: (3490)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
谢谢分享
2025-8-11 19:45
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
逆向爱好者 666666666666666666666666
可以私?
2025-8-11 20:27
0
雪    币: 8184
活跃值: (6654)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
学习一下
2025-8-12 08:04
0
雪    币: 207
活跃值: (618)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
学习一下
2025-8-12 08:32
0
雪    币: 364
活跃值: (2612)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
23
55555
2025-8-12 17:58
0
雪    币: 0
活跃值: (286)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
学习一下
2025-8-12 18:28
0
雪    币: 4689
活跃值: (7498)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
25
学习一下
2025-8-12 21:39
0
游客
登录 | 注册 方可回帖
返回