首页
论坛
专栏
课程

[原创]谈谈对于SSDT中的API进行双层HOOK的通用处理模式

2008-5-13 16:32 6790

[原创]谈谈对于SSDT中的API进行双层HOOK的通用处理模式

HSQ
8
2008-5-13 16:32
6790
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 //////////////////////////////////////////


  自己也做了个过RKU,IceSword 1.22,SnipeSword,wsyscheck0223的动画,有与体积太大将近5M,也就不传上来了,免得浪费论坛资源。

[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

上传的附件:
最新回复 (12)
hfyy 2 2008-5-13 16:47
2
0
学习了
为什么还用ssdt hook呢 直接inline hook不可以吗 感觉ssdt太显眼了
HSQ 8 2008-5-13 17:05
3
0
   ssdt是故意做样子的,迷惑而已. 真正的目的是用inline hook, 由于我的inline hook无法检测
出来,让人检测到ssdt HOOK狂喜,而忘了还有真正的HOOK在该是,这应该是技术上的欺骗吧
aigozi 2008-5-13 17:21
4
0
感觉这个办法,欺骗得了点白痴类型的,对于玩电脑,
可能就不好办了.但是你的思路很不错..我也学习过ROKKIT
if(HookSSDTZwQuerySystemInformation!=TempCheckInSSDTSpace)
这也太明显了吧,处理得不怎么样.
hfyy 2 2008-5-13 17:47
5
0
这是心里战.........
感觉现在还是inline hook比较难弄 楼主在哪inline hook? 前5个nop么 还是深层inline hook
whtyy 1 2008-5-13 17:47
6
0
这么厉害的INLINE?
memcmp检测不出来的inline hook?
挂了缺页中断?
HSQ 8 2008-5-14 18:57
7
0
其实,我处理inline hook是借助一个反汇编引擎,自己动态解析被挂钩API内部指令,进行更深层次的HOOK,于是memcmp检测不出来那是很自然的事。也没有什么神奇的,就是进入更深层次的HOOK,不再停留于表面。有时间的话,我打算让他支持inline层次基本设置,通过动态调整层次级别,尽量让他能通用于所有API。 我觉得通用是最重要的,要是得为每个要inline hook重新编码,HOOK多了,人可受不了。

“ if(HookSSDTZwQuerySystemInformation!=TempCheckInSSDTSpace)
这也太明显了吧,处理得不怎么样.”
置于这个也没太在意, 要是显眼的话,简单的XOR下不就解决了,我不可能手把手的教,有些东西
需要我们自己去领悟和创新,不要局限于他人的表面之词。^_^
whtyy 1 2008-5-14 19:17
8
0
无非就是使用里面的调用(比如CALL指令)来进行所谓“深层次”的HOOK吧。
你自己把ANIT ROOTKIT作者想得太傻了,早就有ROOTKIT用过了,ANIT-ROOTKIT当然也就会有防范。
本人自用的HOOK检测引擎(已经实现),是递归检测指定代码,对比被执行的前M条指令、N层深的CALL涉及的代码,另外使用VM来虚拟执行待检测代码目标代码前X条指令来检查执行流异常转移,你那种小把戏早就测试过,基本废掉
更不用说其他专业点的ANIT-ROOTKIT作者
洋洋洒洒 2008-5-14 20:17
9
0
映射目标文件 对比代码..检测 恢复 都简单着
whtyy 1 2008-5-14 20:46
10
0
原始文件可能打不开或者内容明显错误,你的程序就不工作了?
HSQ 8 2008-5-14 20:49
11
0
原来是这样,再一次火星人了
洋洋洒洒 2008-5-14 22:50
12
0
不能打开 内容明显错误
都有猫腻 就算检测到了  
whtyy 1 2008-5-14 23:33
13
0
给你伪造个内核文件,去检测吧
游客
登录 | 注册 方可回帖
返回