12. 高级热Hook技术隐藏Windows任务管理器中的进程

1.前言

对于一些病毒、以及保护软件的安全开发领域,常常需要实现这样一个需求:隐藏进程。

也就是让用户无法察觉到这个进程,自然也就无法轻易的去关闭掉进程了。

而实现这一目的最佳的方案当然是进行驱动开发、从内核下手,但这样做难度会立刻增大,因为驱动开发是一个较为底层的领域,你需要进一步学习更多的东西。

但如果仅仅是简单的隐藏进程需求,最简单的方式还是直接从win api下手,因为任务管理器本质上也是在调用一些win api遍历系统所有进程,只要我们能hook掉关键函数,让其跳过我们的进程不显示,就能轻松实现进程隐藏的效果了。

2.技术前瞻

所以关键技术点就来到了hook任务管理器中的win api函数,通过在网上搜寻,你很容易就能找到,任务管理器底层调用了一个叫做ZwQuerySystemInformation名字的win api,通过它来查询进程信息的。

这是一个底层的、windows官方甚至在官网没有明确说明的一个win api,大概率是前人逆向分析出来的结果。

而我们只需要利用这份成果,hook这个函数即可。

常见的hook方式是dll注入,但这样做很容易被人分析察觉,很多工具都是可以直接分析一个进程加载了哪些外部dll的。

所以本文将讲述一种更加高级的hook方式,也就是热hook,动态注入代码,其基础技术细节可以参考文章:动态代码注入技术详解

实现逻辑比较简单:

sequenceDiagram
	participant A as hook进程
	participant B as 任务管理器
	A->>B: 注入初始化函数
	A->>B: 注入替换hook函数
	A->>B: 执行初始化函数,将调用更换到hook函数
	B-->>B: 每当调用查询函数,都会进入我们的hook函数

具体的代码细节已经在动态代码注入文章中介绍过了,所以这里不再详细介绍,只大概讲解一下要点,并提供项目源码供下载学习,如有需要可以去文末下载。

3.代码介绍

整个项目代码大约在400来行,不算多,我们首先从整体上来看一下:

image.png

除却最前方的各种函数指针定义外,我们直接看下方的代码部分。

首先是参数注入结构,这个结构比较简单,就是有哪些我们所需要写入任务管理器中的数据:

image.png

其它目前是固定的,当然如果你读懂了整套代码,也可以自行更改,主要是上面箭头指向的参数,这个参数是我们要进行隐藏的进程名字,实际上也就是当前项目生成的可执行文件名。

最终执行后的效果就是,当我们用管理员权限运行本项目生成的可执行文件后,在任务管理器中是看不到这个进程的。

然后来到第二个位置,也就是我们要hook的替代函数,当任务管理器调用原生的ZwQuerySystemInformation时,会先跳到这个函数执行,然后在这个函数中,我们再去调用原生的ZwQuerySystemInformation函数,取出其中的结果,如果判断是我们的进程名,就将其跳过。

image.png

这个函数中首先要注意的点就是参数的传入,因为这个函数的参数要和原winapi保持一致,所以已经写死了,我们不能再传入我们自定义的参数,因此使用了动态代码注入中讲解的技术,实现动态插入参数,不会的可以先回去看看。

然后第二步就是调用参数中的原生函数地址,拿到其执行的结果。

至于后面代码其它逻辑,不用管,这都是前人研究出来的成功,我们直接用就行了,主要关注其中的比较部分:

image.png

如果进程名和我们要隐藏的名字一致,这里就会将其跳过,因为进程列表实际上就是一条链表,这里整个代码结构实际上就是在遍历这条链表,而我们这里所做的,便是从链表中删除我们想要隐藏的进程。

因此虽然第二步函数很重要,是hook函数,但实际上真正的逻辑并不复杂:插入参数、遍历链表、隐藏进程。

然后来到第三步函数:

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux