HOOK集合----SSDTDPC Hook(X86 win7)
介绍:
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); }

浙公网安备 33010602011771号