一般的,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;
struct
{
UCHAR ActiveDR7:1;
UCHAR Instrumented:1;
UCHAR Minimal:1;
UCHAR Reserved4:2;
UCHAR AltSyscall:1;
UCHAR UmsScheduled:1;
UCHAR UmsPrimary:1;
};
};
};
};
LONG SignalState;
struct _LIST_ENTRY WaitListHead;
};
struct _DISPATCHER_HEADER
{
.....
union
{
UCHAR DebugActive;
struct
{
UCHAR ActiveDR7:1;
UCHAR Instrumented:1;
UCHAR Minimal:1;
UCHAR Reserved4:2;
UCHAR AltSyscall:1;
UCHAR UmsScheduled:1;
UCHAR UmsPrimary:1;
};
};
};
};
LONG SignalState;
struct _LIST_ENTRY WaitListHead;
};
struct
{
ULONG Minimal : 1;
ULONG ReplacingPageRoot : 1;
ULONG Crashed : 1;
ULONG JobVadsAreTracked : 1;
ULONG VadTrackingDisabled : 1;
ULONG AuxiliaryProcess : 1;
ULONG SubsystemProcess : 1;
ULONG IndirectCpuSets : 1;
ULONG RelinquishedCommit : 1;
ULONG HighGraphicsPriority : 1;
ULONG CommitFailLogged : 1;
ULONG ReserveFailLogged : 1;
ULONG SystemProcess : 1;
ULONG HideImageBaseAddresses : 1;
ULONG AddressPolicyFrozen : 1;
ULONG ProcessFirstResume : 1;
ULONG ForegroundExternal : 1;
ULONG ForegroundSystem : 1;
ULONG HighMemoryPriority : 1;
ULONG EnableProcessSuspendResumeLogging : 1;
ULONG EnableThreadSuspendResumeLogging : 1;
ULONG SecurityDomainChanged : 1;
ULONG SecurityFreezeComplete : 1;
ULONG VmProcessorHost : 1;
ULONG VmProcessorHostTransition : 1;
ULONG AltSyscall : 1;
ULONG TimerResolutionIgnore : 1;
ULONG DisallowUserTerminate : 1;
};
struct
{
ULONG Minimal : 1;
ULONG ReplacingPageRoot : 1;
ULONG Crashed : 1;
ULONG JobVadsAreTracked : 1;
ULONG VadTrackingDisabled : 1;
ULONG AuxiliaryProcess : 1;
ULONG SubsystemProcess : 1;
ULONG IndirectCpuSets : 1;
ULONG RelinquishedCommit : 1;
ULONG HighGraphicsPriority : 1;
ULONG CommitFailLogged : 1;
ULONG ReserveFailLogged : 1;
ULONG SystemProcess : 1;
ULONG HideImageBaseAddresses : 1;
ULONG AddressPolicyFrozen : 1;
ULONG ProcessFirstResume : 1;
ULONG ForegroundExternal : 1;
ULONG ForegroundSystem : 1;
ULONG HighMemoryPriority : 1;
ULONG EnableProcessSuspendResumeLogging : 1;
ULONG EnableThreadSuspendResumeLogging : 1;
ULONG SecurityDomainChanged : 1;
ULONG SecurityFreezeComplete : 1;
ULONG VmProcessorHost : 1;
ULONG VmProcessorHostTransition : 1;
ULONG AltSyscall : 1;
ULONG TimerResolutionIgnore : 1;
ULONG DisallowUserTerminate : 1;
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!