Windows NT下挂接SSDT隐藏进程的原理

2022-11-16 02:16王玉红
电子技术与软件工程 2022年16期
关键词:驱动程序内核调用

王玉红

(赤峰学院数学与计算机科学学院 内蒙古自治区赤峰市 024000)

部分程序具有特殊目的,因此需要进行隐藏进程设计,隐藏进程的方法多种多样,基于用户模式对部分查询进程信息API 函数进行挂接处理,同时借助远程线程、DLL 等技术,还可以基于内核模式展开隐藏进程处理。随着单元不断接近底层,隐藏进程效果也不断提升。SSDT 就是系统服务描述符表,SSDT 在内核API 函数与用户模式Win32 API 函数之间构建地址映射。SSDT 涵盖地址索引表、服务函数的数量以及基地址等。基于Intel 平台,处理器能够提供Ring0、Ring1、Ring2、Ring3 处理器,不同模式的操作权限存在一定差异,Windows 系统主要选择ring3 模式与ring0 模式。基于内核模式对系统资源进行访问,应该进行驱动程序开发。

1 Windows结构简介

Windows NT 是Windows 重要分支,由于NT 内核是现阶段主流Windows 系统,因此本文所提Windows 均为NT系统。NT 系统具有完整性、庞大性等特点,其选择分层结构,见图1。

图1 为Windows 体系整体结构,主要涵盖用户模式与内核模式2 部分,内核模式为内存空间,受到保护,其基本上可以被驱动程序与以其他代码共享。

图1:Windows 核心结构

CPU 中各个指令涵盖非特权指令与特权指令两种类型,特权指令具有较大危险性,例如设置时钟以及清内存等,若是出现错用,则会造成系统崩溃问题。若是各个程序均可以对这些指令进行访问,则会导致计算机经常出现宕机问题。因为若是特权指令,仅可以被操作系统以及有关模块运行,在普通应用程序中,其尽可以使用非特权指令。通俗来讲,非特权指令主要指老少皆宜内容,而特权指令则为少儿不宜内容[1]。

X86 处理器展开访问控制,其选择的方法主要是借助Ring 完成级别划分工作,分为Ring0—Ring3 级别,Ring3权限最低、Ring0 权限最高。根据Intel 原构想,Ring3 层是应用程序主要运行场所,Ring1 与Ring2 层为驱动程序运行场所,各层仅可以对本层与更低权限层数据进行访问。然而操作系统主要涵盖Linux、Windows 均使用Ring3 层与Ring0 层,分别对程序数据应用以及系统数据存放。所以,若是加载了驱动,则操作系统运行于Ring0 层中完成所有事情。因为系统中Ring0 特权最大,入侵者声称在Ring0 运行自己的代码非常光荣。见图2。

图2:CPU 特全程与用户模式中内核模式的对应图

由CPU 向各个环分配相应软件内存以及代码,另外,CPU 促使不同环的访问得到强制。一般,所有软件均被指派相应环号,同时无法对环号更低环境进行访问。若是Ring3中程序想要对Ring0 内存进行访问,CPU 即抛出中断。基于用户模式,应用程序对1 个系统服务进行调用过程中,处理器对该调用进行补货,之后对调用线程进行内核模式切换处理。在该系统完成服务之后,操作系统向用户模式进行切换,执行人员可以继续执行。例如,加载打印驱动进入内核,需要Ring3 层程序对加载的驱动进行访问。

操作系统选择分层设计具有较多优点,在某个应用程序出现不当操作之后,因为用户模式设置了相应保护措施,此种不当操作仅会对该应用程序造成影响,并不会影响整体系统。Windows 系统将4GB 私有虚拟空间分配给各个进程,同时把其分为2 部分,即内核地址与用户地址。

虚拟地址中,低2GB 空间即用户空间,地址由0 至0X7FFFFFFFF,基于用户模式,仅能够对该虚拟地址进行访问。因此,用户进程处于运行状态时,其范围在0—2GB内,地址超出2GB 则不可访问,另外各个进程仅可以对自身用户地址空间内容进行修改。其他部分为由0X80000000至0XFFFFFFF,就是内核地址空间,仅有内核模式程序可以访问此段地址,用户程序不可访问。即代码处于运行状态时,其虚拟地址在2GB—4GB 范围内,映射到高2GB 系统代码并未出现变化,各个进程均可以共享该地址空间。如此划分内存空间,可以减少各个进程的影响程度,充分提升系统稳定性。系统为了指示相应页面能够基于何种模式被允许访问,虚拟内存均会对各个页面进行标记处理。页面在内核空间中被标记为只有基于内核模式才允许访问,页面在用户空间被标记为基于用户模式允许访问。在内核模式条件下,驱动程序能够对内核对象直接访问,可以对系统内存进行访问。因为对于基于内核模式的访问控制存在不足,部分内核级后门程序借助对驱动程序进行加载,对系统内存进行访问,对内核数据直接修改,进而实现隐藏信息目标。

2 基于SSDT的进程隐藏原理

Windows 关键模块主要在内核模式中运行,同时对OS/2、POSIX、Win32 等子系统提供本地化支持。此类系统服务存在于内存结构SSDT 中。SSDT 能够通过函数地址中系统调用号进行索引。SSDT 就是将Ring0 内核Ring0 与Ring3 中Win32 API 进行关联的纽带。SSPT(系统服务参数),主要定义各个系统函数参数字节数。

SSDT 是进入内核唯一通道,操作系统函数实现地址通过SSDT 进行记录,这些地址与Ntoskrnl.Exe 中NtXXX 函数相对应。如果要通过SSDT 挂接重定向函数,对SSDT 中某系统函数入口地址进行修改,即对与服务号相对应地址进行修改,让地址指向自定义函数的地址,之后对原始系统地址位置代码予以执行,例如枚举进程是Psapi 库、HhlpTool库中函数,均是借助对 ZwQuery Systemlnforation 函数进行调用实现。Number Of Services 代表系统支持服务数量,Number Of Service*4 代表地址表大小。Param Table Base 指向SSPT,SSPT 涵盖所有服务所需参数的字节数。

内核中描述符表数量为2 个,1 个表为Keervice Descriptor Table,其通过ntoskrnl.exe 导出,是内核中SSDT 数据实体,其中涵盖2 个指针,一个指针指向SSDT 中涵盖通过Ntoskrnl.exe 提供核心服务的部分,另一个指针直接指向SSPT。另一个表为KeServie Descriptor Table Shadow,其涵盖GDI、USER 服务地址,此表未导出。借助SSTD 隐藏进程过程中,如果进程开头位于链表,那么对前一节点Next Entry Delta 与隐藏节点ext Entry Delta 数值进行相加处理。如果进程位于链表尾部位置,那么设置前一节点偏移量设置为0。

3 驱动系统和应用系统之间通信

3.1 应用程序和驱动程序

基于Windows,应用程序主要借助以下方法和驱动程序实现通信,应用程序借助Create File 将设备开启,之后借助Device Io Control 开始通信,涵盖将数据书写给驱动与通过驱动读数据两种情况,同时可以借助Create File 通过驱动读数据,或是借助Write File,将数据写给驱动。在退出应用程序之后,借助Close Handle 将设备关闭。Driver Entry 完成设备创建之后,应该将派遣函数填充到相应IRP 中,IRP与Win32 函数对应关系为:

一般,通过符号连接符与GUID 接口将设备打开,符号连接符属于一种快捷方法。在借助Create File 通过驱动读数据,或是借助Write File,将数据写给驱动过程中,驱动程序结合设备特征标志,确定采用何种方法对应用程序缓冲区地址进行获取。Device Io Control 涵盖同步以及异步两种调用方法。其中,异步调用,主要是应用程序完成Device Io Control 调用后,及时返回,对下一操作执行。完成驱动程序后,会选择相应策略向应用程序进行通知,应用程序及完成和驱动通信。而同步调用,应用程序对Device Io Control进行调用,会被堵塞,完成驱动程序传输数据之后,才可以开展下步操作。

需要注意:调用Device Io Control 时,能够产生以下结果:

(1)TRUE,说明驱动排线成立可以马上OK。

(2)FALSE,同时利用Get Last Error 获得ERORj0_PENDING,说明驱动派遣例程向STATUS‐PENDING 返回,同时该控制操作推迟完成。

(3)FALSE,同时利用Get Last Error 获得一个并非ERORj0_PENDING,说明真正错误。

3.2 驱动程序和应用程序通信

在驱动程序对中断等特点事件捕捉之后,和应用程序进行通信。驱动程序主要借助Win32 事件与Device Io Control两种方式完成通信。在应用程序对Device Io Control 函数进行调用过程中,驱动程序对此TRP 进行保留,之后向STATUS_PENDING 中返回。在发生相关事件时,驱动程序可以将该IRP 完成。因为IRP 处于未决状态,因此需要保存该IPR,在退出应用程序后,如果没有发生IRP,那么应该将该IPR 取消。

对于Win32,主要是应用程序建立相应事件,向驱动程序直接传递相应句柄,之后让驱动程序将事件信息传递出来。在驱动程序得到指针后,基于IRQL<=DISPATCH_LEVEL级别例程对事件的信号状态进行科学设置,将应用程序触发。

4 驱动程序与应用程序实现

4.1 驱动程序实现

借助进SSDT 隐藏进程过程中,如果被隐藏进程位于链表开头,同时链表中涵盖一个节点,那么链表首地址选择NULL。如果被隐藏进程位于链表中部,那么前一节点Next Entry Delta 与被隐藏节点Next Entry Delta 值相加。如果被隐藏进程位于链表尾部,那么节点偏移量设置为O。部分同名字进程数量较多,因此,需要遍历链表,对于驱动程序,在入口函数中对函数地址进行重定向处理,为New Zw Query System Information,同时向原函数地址返回。若是需要在卸载驱动过程中将原函数地址恢复,只要位于On Load例程执行

Interlocked Exchange((PLONG) Ke Service Descriptor Table.

Service Table Base [*(PULONG)((PUCHAR) (ZwQuery System‐Information)+1)],

(LONG) Real Zw Query System Information);

完成驱动程序编写工作后,借助DDK 的编译环境,把代码转换为.sys 文件,通过指定目录价进行存放。

4.2 应用程序实现

基于权限良好情况下,可以借助SC 管理器对驱动程序进行加载处理。对一个服务进行加载、运行的步骤为对Open SCManager()进行调用,获得管理器的句柄,对Create Service()进行调用,让一个服务运行,对Start Service()进行调用,将服务句柄、管理器释放。其中,lpFile Name 是驱动程序绝对路径,若是需要将服务关闭,对驱动程序进行卸载处理,进行一下处理:

Control Service(h Service,SERVICE_CONTROL_STOP,&ss);

通过Control Service()对服务状态进行合理设置,此处代表先将服务停止,之后进行删除处理;对Delete Service(h Service)进行调用处理,将服务删除[2]。

5 测试运行结果

5.1 Hacker Defende

对于Hacker Defender,是在T4.0,2000,X 环境运行的用户模式Windows rootkit,其能够隐藏注册表项、进程、开放端口、隐藏文件、系统服务以及注册表键值等信息,同时可以对磁盘空闲空间值进行修改。Hacker Defender 选择函数代码区修改技术,与一些系统所提供API 函数挂钩,比如,借 助Ntdll.Nt Enumerate Key、Ntdll.Nt Enumerate Value Key 枚举子健、指定键实际兼职,进而隐藏注册表键。

借助对函数体直接修改,Hacker Defender 让应用程序对上述函数进行调用过程中,进入Hacker Defender 挂钩函数展开运行处理。Hacker Defender 提供的挂钩函数能够过滤关键信息,利用挂钩函数进行处理后,注册表项、文件、进程名等均得到有效隐藏。应用程序难以得到有关Hacker Defender 的信息。

Hacker Defender 的安装,首先对开始、运行、cmd 按钮进行点击处理,向hxdefl00.Exe(Hacker Defender 生成文件)所在目录进行切换处理。其次,将xdefl00.exe hxdefl00.ini;输入其中。Hacker Defender 运行,之后发现hxdef(Hacker Defender)所在目录不见。同时,基于hxdef 名称的文件夹、文件均不见,任务管理器内该进程不可见。借助相应程序检测Hacker Defender 机器,发现以下状况:hxdefl 00.exe(进程名)是隐藏进程,前缀名是xdef 的文件获得隐藏,同时注册表已经被修改,注册表项隐藏如下:

5.2 He4Hook

对于He4Hook,属于以内核模式为基础的Windows rootkit,可以在T4.0,2000 环境下运行。对于rootkit 网站来讲,He4Hook 的源代码较为完整。He4Hook 执行文件涵盖以下内容,即tr01.exe 以及v.sys。其中,v.sys 主要用于通信控制台,tr01.exe 用于驱动内核模式。

基于内核条件下,He4Hook 将He4HookSST(新系统服务表)设置在SSDT 与SSDTShadow(影子表),He4HookSST 和原服务表之间没有关联,也不会产生影响。在SSDT 中table3 部位放置He4HookSST,其指向的地址表函数的数量为5 个,函数均为He4Hook 自身所使用,He4Hook 向He4Hook 所提供的Hook Io Create File 函数直接指向Io Create File 入口点。同时与其它系统服务,比如,Zw Open File 以及Zw Create File 等,借助与上述服务系统进行挂钩处理,He4Hook 就可以隐藏文件。

开展He4HookBoot 加载处理,其属于Application,要想将该服务启动,需要对注册表键值进行修改,比如s YSTEM、Control 等, 需要将He4HookBoot 添加到Autocheck Autochk*的后面,同时在system32 的目录中放置He4HookBoot。在DRIVERS 的目录中放置Inv.sys 文件。将Contr01.exe 启动、运行,其属于He4Hook 控制系统,借助My File—c:R 命令行对所保护文件相应属性进行合理设置。进行运行操作,最终发现充分隐藏My File 文件夹,另外,对于注册表来讲,无法寻找He4Hook 建。

5.3 Hide Process Hook MDL

该服务为开源代码包,可以借助Hide Process Hook MDL.zip 网页下载该代码包,驱动程序设置于代码包中,可以将root 开头各类进程进行隐藏。相关人员需要借助应用程序对MDL.sys 进行加载处理,并以root test.exe 命名应用程序。将杀毒软件关闭或是暂停,之后将root test.exe 应用程序启动、运行。将系统任务管理器启动,root test.exe进程不在里面。

5.4 Nt Rootkit

该服务属于自愿者与Greg Hoglund 共同创建的驱动程序,是在T4.0,2000 环境下运行的程序。其为后门程序(系统级),种植者通过Nt Rootkit,对受感染设备进行隐蔽控制,现阶段源代码是公开的,其能够进行一下操作:

(1)能够在远程客户端中进行命令接受操作,其能够使用rootkit 主机在子网中的未使用地址,在源代码中硬编码处理其IP 地址以及MAC,之后借助该地址与rootkit 之间建立TCP 连接,该连接能够满足所有端口需求。

(2)可以实现自我保护,其能够将root 保护对象隐藏,可以对处于运行状态进程展开重定向处理。能够将进程、注册表项、服务、目录以及文件登记隐藏。

(3)其与服务地址表充分挂钩。

Nt Rootkit 属于Rootkit 重要类型之一,为内核级,其基于内核模式运行,能够借助Ki Service Table 手段与相关系统服务之间进行挂钩处理,比如Zw Creat e Key、Zw Query Key、Zw Open Key、Zw Open Fi le、Nt Create Fi le 等。

借助rew 目录对Nt Rootkit 的服务器端进行存放,分别点击“开始”“运行”以及“ cmd”,向rewt 进行切换处理,将rtclient.exe 输入其中进行Nt Rootkit 安装操作。ntrootki t—i运行于服务器端,该指令主要是对 Nt Rootkit进行升级处理。在客户端分别对“开始”“运行”以及“ cmd”进行点击处理,借助开的139 端口进行连接构建,并结合提示对IP 地址进行确定,进而促使客户端和服务器端建立通信,以此借助相应命令进行相关操作。

Nt Rootkit 能够对root 目录以及文件进行隐藏处理,Nt Rootkit 主要控制root 目录以及文件的属性。程序可以发现Nt Rootkit 对于root 文件的访问行为,但是其他程序并不能够开展访问操作,即能够判断Windows Rootldt 安装于系统。

6 结语

综上所述,如果想要实用、复杂功能,例如借助进程D对进程隐藏处理,接受应用程序参数,进而隐藏指定进程等。基于本文代码展开扩充即能够实现。本文主要目的是为了引导人们对此种隐藏进程技术原理进行充分理解,进而便于使用此类技术有效防御以及处理木马病毒。

猜你喜欢
驱动程序内核调用
强化『高新』内核 打造农业『硅谷』
核电项目物项调用管理的应用研究
基于嵌入式Linux内核的自恢复设计
Linux内核mmap保护机制研究
LabWindows/CVI下基于ActiveX技术的Excel调用
计算机硬件设备驱动程序分析
基于系统调用的恶意软件检测技术研究
基于MPC8280的CPU单元与内部总线驱动程序设计
利用RFC技术实现SAP系统接口通信