当前位置:首页 > ssdt hook 实现进程隐藏二 - 图文
42: //将当前这个进程(即要隐藏的进程)从 SystemInformation 中摘除(更改链表偏移指针实现)
43: pPrevProcessInfo->NextEntryOffset
+= pCurrProcessInfo->NextEntryOffset;
44: } 45: else
46: {//说明当前要隐藏的这个进程是进程链表中的最后一个 //9,三种情况, 二:被查的
ID在信息链的末尾
47: pPrevProcessInfo->NextEntryOffset = 0;
48: 49: } 50: } 51: else 52: {
53: //第一个遍历到得进程就是需要隐藏的进程 54: //10,三种情况, 三:被查的
ID在信息链的开始——又分——
if(pCurrProcessInfo->NextEntryOffset)
55: {//11,后面有节点
56: (PCHAR)SystemInformation
+=pCurrProcessInfo->NextEntryOffset;
57: } 58: else
59: {//12,后面没节点
60: SystemInformation = NULL;//所有的连都为NULL。。。
61: } 62: } 63: } 64:
65: //遍历下一个 SYSTEM_PROCESS_INFORMATION 节点 66: pPrevProcessInfo = pCurrProcessInfo;
67:
68: //遍历结束
//13,个人认为应该叫该信息节点审阅完毕,下一个
69: if(pCurrProcessInfo->NextEntryOffset) 70: {
71: pCurrProcessInfo =
(PSYSTEM_PROCESS_INFORMATION)
72: (((PCHAR)pCurrProcessInfo) +
pCurrProcessInfo->NextEntryOffset);
73: } 74: else 75: {
76: pCurrProcessInfo = NULL; 77: } 78: } 79: } 80: }
81: return rtStatus; 82: }
既然有了自己的 Hook NtQuerySystemInformation 了,自然我们就可以通过利用 SSDT 框架来实现 Hook 了,这部分的代码其实是最简单的,因为我只需要在 DriverEntry 中 Hook 掉 NtQuerySystemInformation 即可,这里需要注意的是,在执行 Hook 之前需要备份一次 SSDT,即在 DriverEntry 中最先需要备份 SSDT ~
当然为了保证系统的安全以及其他诸多方面,我们在 DriverUnload 中会将 Hook 解除掉 ~ 从下面的代码中,我们看到在安装 Hook 和解除 Hook 时参数传递进去的是 ZwQuerySystemInformation,
这样很有可能会让很多朋友认为我们在 Ring0 下的 Hook 的是 ZwQuerySystemInformation,
如果你这样认为的话,那就大错特错了,确实在 Google 上搜索出的一大堆关于 SSDT Hook 中,很多文章都说是 Hook 的 ZwQuerySystemInformation,而事实上这是大错特错的,
我们这里传入 ZwQuerySystemInformation ,是因为我们需要调用 SYS_INDEX(ZwQuerySystemInformation)
来获得 NtQuerySystemInformation 在 SSDT 中的地址所在的索引号, 然后我们根据这个索引号来 Hook NtQuerySystemInformation, 认识到这一点是非常重要的,因为我一开始也认为是 Hook 的
ZwQuerySystemInformation,从而导致蓝屏了 n 次,在这里非常鄙视那些把文章从别处拷贝过来也不加验证就乱发表的 ~ 害死人 ~ 当然也要怪自己懒 ~
5. Ring0 实现进程保护:
有了上面实现进程隐藏的基础,要再来实现进程保护,其实也就是过过场子了 ~ 进程保护呢,上面也说了,是要 Hook NtTermianteProcess 这个系统服务 ~ 由于 ZwTerminateProcess 呢,在 ntddk.h 中已经声明了,
所以在我们自己的代码中就不需要声明 ZwTermianteProcess 了,(只需要定义一个函数指针用就可以了)
而只需要声明 NtTerminateProcess 以及 Hook 函数就 OK 了 ~ 1: typedef NTSTATUS (* NTTERMINATEPROCESS)( 2: __in_opt HANDLE ProcessHandle, 3: __in NTSTATUS ExitStatus 4: ); 5:
6: NTSTATUS HookNtTerminateProcess( 7: __in_opt HANDLE ProcessHandle, 8: __in NTSTATUS ExitStatus 9: ); 10:
11: NTTERMINATEPROCESS pOldNtTerminateProcess;
至于安装 Hook 以及卸载 Hook ,都可以根据进程隐藏中的代码来完成,因为有了 SSDT Hook 框架,这一切也就变得很简单了,只要在 DriverEntry 中 InstallHook ,然后再在 DriverUnload 中 UnInstallHook 即 OK ~
下面我们重点来看一看我们自己的 Hook NtTerminateProcess 中是如何实现进程保护的 ~
进程保护呢其实也是比较简单的,因为从上面一层的调用会传递一个进程句柄下来,
而后我们可以根据这个进程句柄来获得进程的 EPROCESS 对象(进程位于执行体层得对象), 通过这个 EPROCESS 对象,我们就可以获得这个请求被结束的进程的 PID,
我们再判断这个 PID 是否是我们已经保护了的 PID,如果是的话,直接返回一个请求被拒绝即可,而如果这个 PID 未被保护,自然我们就交给原来的 NtTerminateProcess 处理即可 ~
共分享92篇相关文档