介绍:
SSDT DPC Hook 其实是建立在SSDT Hook的基础上的,建立一个定时器,然后设置触发时间,反复去 SSDT Hook,这样会使直接进行SSDT UnHook的无法恢复,在学习过程中,算不上是一种全新的Hook,算是SSDT Hook 的一种升级版。
(一)
⚪建立定时器,定时回调函数为SSDTHook 函数,反复Hook。
⚪首先找到全局导出的KeServiceDescriptorTable。
⚪然后从ntdll.dll的导出表中获取ZwOpenProcess函数地址。
⚪从ZwOpenProcess中获取序号。
⚪将SSDT所在页属性改为可读可写的状态。
⚪将自己写好的Fake函数地址替换进去即可。
(二)
SSDTHook 代码可以看之前的文章,有详细的介绍。
NTSTATUS DPC_SSDTHook(BOOLEAN IsOk);
VOID DelayProcedureCall
(
_In_ struct _KPDC *DPC,
_In_opt_ PVOID DeferredCpntext,
_In_opt_ PVOID SystemArgument1,
_In_opt_ PVOID SystemArgument2
);
KTIMER __Timer = { 0 };
LARGE_INTEGER __Interval = { 0 };
KDPC __DPC = {0};
NTSTATUS DPC_SSDTHook(BOOLEAN IsOk)
{
NTSTATUS Status = STATUS_UNSUCCESSFUL;
if (IsOk)
{
Status = SSDTHook(IsOk);
//初始化时钟
KeInitializeTimer(&__Timer);
//构建DPC
KeInitializeDpc(&__DPC, (PKDEFERRED_ROUTINE)DelayProcedureCall, NULL);
__Interval = RtlConvertLongToLargeInteger(1000000 * -10);
//设置时钟
KeSetTimer(&__Timer, __Interval, &__DPC);
}
else
{
KeCancelTimer(&__Timer);
Status = SSDTHook(IsOk);
}
return Status;
}
VOID DelayProcedureCall
(
_In_ struct _KPDC *Dpc,
_In_opt_ PVOID DeferredCpntext,
_In_opt_ PVOID SystemArgument1,
_In_opt_ PVOID SystemArgument2
)
{
SSDTHook(TRUE);
KeSetTimer(&__Timer, __Interval, Dpc);
}