进程隐藏的各种方法 以及分析比较以及实现链接
典型进程隐藏技术
1 基于系统服务的进程隐藏技术
在 W I N 9X 系列操作系统中, 系统进程列表中不能看到任何系统服务进程, 因此只需要将指定进程注册为系统服务就能够使该进程从系统进程列表中隐形
在win9x下用RegisterServiceProcess函数隐藏进程,NT架构下用不了 即win2000 xp等什么的用不了此方法。
2 基于API HOOK的进程隐藏技术
API HOOK指的是通过特殊的编程手段截获WINDOWS系统调用的API函数,并将其丢弃或者进行替换。 通过API
HOOK编程方法,截获系统遍历进程函数并对其进行替换,可以实现对任意进程的隐藏
3 基于 DLL 的进程隐藏技术:远程注入Dll技术
DLL文件没有程序逻辑,不能独立运行,由进程加载并调用,所以在进程列表中不会出现DLL文件。如果是一个以DLL形式存在的程序,通过某个
已有进程进行加载, 即可实现程序的进程隐藏。在windows系统中, 每个进程都有自己的私有地址空间, 进程不能创建属于另一个进程的内存指针
。而远程线程技术正是通过特殊的内核编程手段, 打破进程界限来访问另一进程的地址空间, 以达到对自身 进行隐藏的目的。
远程线程注入DLL技术指的是通过在某进程中创建远程线程的方法进入该进程的内存空间, 然后在其内存空间中加载启动DLL程序。
4 基于远程线程注入代码的进程隐藏技术
这种方法与远程线程注入 DLL 的原理一样,都是通过在某进程中创建远程线程来共享该进程的内存空间。所不同的是,远程线程注入代码通过直接
拷贝程序代码到某进程的内存空间来达到注入的目的。因为程序代码存在于内存中, 不仅进程列表中无法检测, 即使遍历进程加载的内存模块也无法
找到被隐藏程序的踪迹。
5 Rootkit方式
Intel CPU 有4 个特权级别: Ring 0, Ring 1, Ring 2, Ring 3。Windows 只使用了其中的 Ring 0 和 Ring 3 两个级别。
操作系统分为内核和外壳两部分:内核运行在Ring0级,通常称为核心态(或内核态),用于实现最底层的管理功能,在内核态
可以访问系统数据和硬件,包括处理机调度、内存管理、设备管理、文件管理等;外壳运行在 Ring 3 级,通常称为用户态,
是基于内核提供的交互功能而存在的界面,它负责指令传递和解释。通常情况下,用户态的应用程序没有权限访问核心态的地址空间。
Rootkit 是攻击者用来隐藏自己的踪迹和保留 root 访问权限的工具,它能使攻击者一直保持对目标机器的访问,以实施对目标计算机的控制[1]。从 Rootkit 运行的环境来看,可将
其分为用户级 Rootkit 和内核级 Rootkit。
用户态下,应用程序会调用 Wi n32 子系统动态库(包括Kernel32.dll, User32.dll, Gdi32.dll等) 提供的Win32 API函数,
它们是 Windows 提供给应用程序与操作系统的接口,运行在Ring 3 级。用户级 Rootkit 通常就是通过拦截 Win32 API,建立系统钩子,插入自己的代码,从而控制检测工具对进程或服务的遍历调用,实现隐藏功能。
内核级 R o o t k it 是指利用驱动程序技术或其它相关技术进入Windows 操作系统内核,通过对 Windows 操作系统内核相关的数据结构或对象进行篡改,以实现隐藏功能。
由于Rootkit 运行在 Ring 0 级别,甚至进入内核空间,因而可以对内核指令进行修改,而用户级检测却无法发现内核操作被拦
截。
下面介绍两种使用 Rootkit 技术来实现进程隐藏的方法。册表来实现启动,因而易于被检测出来。显然,要增强进程的隐蔽性,关键在于增强加载程序文件的隐藏性。
<1> SSDT Hook
参考本文最下面的链接
<2> DKOM (Direct Kernel Object Manipulation,直接内核对象操作)
使用DKOM方法进行进程隐藏。在Windows操作系统中,系统会为每一个活动进程创建一个进程对象EPROCESS,为进程中的每一个线程创建一个线程对象 ETHREAD。
在 EPROCESS 进程结构中有个双向链表 LIST_ENTRY,LIST_ENTRY结构中有FLINK 和BLINK 两个成员指针,分别指向当前进程的前驱进程和后继进程。
如果要隐藏当前进程,只需把当前进程的前驱进程的BLINK 修改为当前进程的BLINK,再把当前进程的后继进程的FLINK修改为当前进程的FLINK。
进程隐藏方法 隐蔽性 健壮性 实现难度 加载方式 进程存在方式 操作系统
注册系统服务 较差 很好 简单 简单 存在于系统服务 win9x 系列
API HOOK 很好 很好 较难 简单 仍以进程存在 win NT及以上
注册表注入DLL 一般 很差 简单 简单 以DLL形式存在于所有加载user32.dll的进程中 winNT及以上
Rundll32加载DLL 一般 好 简单 简单 以DLL形式存在于Rundll32.exe进程中 winNT及以上
远程线程注入DLL 较好 很好 较难 较复杂 以DLL形式存在于任一进程中,包括系统进程 winNT及以上
远程线程注入代码很好 较好 很难 很复杂 存在于任一进程的内存空间中,包括系统进程 winNT及以上