admin管理员组

文章数量:1532173

2023年12月29日发(作者:)

经验与交流 计算机与信息技术 ·73·

Windows Rootkit隐藏技术研究

杨平 罗红 乔向东

(空军工程大学 电讯工程学院,陕西 西安,710077)

摘 要 Rootkit是黑客为了隐藏其入侵痕迹、保留入侵权限而采用的一种技术。由于具有隐藏性好、难以检测的特点,Rootkit在Windows操作系统中的应用越来越广泛,并逐渐与病毒、木马、间谍软件等应用软件相结合,给网络信息安全带了严重危害。深入研究Windows操作系统中Rootkit的工作原理,对于防范其对网络安全造成的破坏有着重要的意义。

关键词

Rootkit;隐藏;挂钩

1 引言

Rootkit原本是UNIX系统上非法入侵者为了隐藏其活动痕迹而使用的一组工具。随着Windows操作系统的广泛应用,Rootkit在该系列操作系统中应用也越来越广泛,危害也越来越大。和其它的恶意软件不同,Rootkit的主要功能和目的是隐藏,即隐藏其在系统中的各种表现,如进程、文件、注册表项和键值、端口以及服务等。正因为其在隐藏技术上的突出表现,Rootkit与木马等恶意软件有逐渐结合的趋势,随着影响范围不断扩大,对网络信息安全可能带来的危害也逐步增强。

更大。

3 Rootkit原理分析

Rootkit的首要特征和最终目的是实现隐藏,其内容包括隐藏进程、服务、文件、注册表项和键值以及通信端口。为了达到目的,它一般通过以下两种途径实施其功能:一类是通过调用系统函数的执行路径,篡改调用函数的返回值达到向用户隐藏攻击信息的目的;另一类是通过修改系统内核的数据结构从而返回错误的信息来隐藏攻击信息。

3.1 修改函数的执行路径

Windows操作系统为了扩展其功能采用了挂钩(hook)技术。Rootkit同样利用该技术或采用修改系统函数的方法劫持程序和系统函数调用的执行路径,通过篡改调用函数的返回值实现隐藏功能。这种技术常采用的方法是替换DLL文件、修改内存中DLL文件的API函数或者挂钩各类系统服务如SSDT、IDT和IRP表等。

(1)导入地址表钩子(IAT-Import Address Table

hooking)。IAT表是输入地址表,它记录着程序调用了哪些系统函数以及输出这些函数的DLL文件。程序在调用函数时,系统会根据该表中函数的实际地址处的执行代码执行函数调用。如果Rootkit用编写的函数地址代替了表中要执行函数的地址,则目标程序进行函数调用后执行的是攻击者定义的函数。在Rootkit代码中实现对返回信息的过滤就可以实现对指定内容的隐藏。

(2)挂钩中断描述表(IDT-Interrupt Descriptor Table)。系统通过INT 2E指令或SYSENTER指令向CPU发出中断信号进入内核模式。CPU根据中断号在IDT中寻找相应的程序处理中断。如果Rootkit修改了IDT,则其将能控制整个系统的内核函数。虽然挂钩IDT后不能重新获得控制权过滤信息,但它可以表示或者堵塞某些程序的函数调用,如防火墙、入侵防御系统等从而使其失效。

(3)修改IRP函数表。Windows内核中的驱动程序通过I/O请求包IRP的缓冲区数据结构与用户程序沟通并完成各2 Rootkit的分类

操作系统是由内核(Kernel)和外壳(Shell)两部分组成的。内核负责一切实际的工作,包括CPU任务调度、内存分配管理、设备管理、文件操作等;外壳是基于内核提供的交互功能而存在的界面,它负责指令传递和解释。根据内核和外壳处理任务的不同,系统为它们设定了不同的工作环境,称为运行级别(Ring)。虽然Intel和AMD的CPU都支持4种特权模式,但在实际应用中,Windows只实现了两个运行模式,即用户模式(Ring3)和内核模式(Ring0)。同样,Windows Rootkit也分为两类,分别对应处理器的用户模式和内核模式。

用户模式Rootkit可以作为一个单独的程序运行,也可以改动某个现有程序、运行在一个已经存在的程序里。用户模式的Rootkit通过挂钩与请求信息的软件程序相关的Windows

API来过滤信息,因为其实现比较容易,且可以在不同Windows系统间移植,因此被攻击者广泛使用。

内核级Rootkit是指入侵到操作系统内核层的Rootkit,它通常会修改最底层的操作系统内核,比如中断处理函数、系统调用、文件系统等。内核模式的Rootkit拥有操作系统的所有权力,通过截获来自用户空间中应用程序的系统调用来过滤信息。与应用级Rootkit相比,内核级Rootkit的破坏性更大,而且它能逃避任何应用层的检测,预防和检测的难度

·74· 计算机与信息技术 经验与交流

种功能。IRP可以处理包括读、写、查询等在内的多种类型的请求。所有的IRP函数组成一个IRP函数表供系统调用。通过替换该表中的表项如文件系统或TCP查询的函数来实现文件、端口等的隐藏。

(4)挂钩系统服务描述表(SSDT-System Service

Dispatch Table)。Windows操作系统中,本地系统服务的地址由内核中的SSDT来维护。该表可以基于系统调用编号定位函数的内存地址。如果攻击者修改了某些函数的地址使其指向自己的函数,他就控制了函数的处理过程以及返回结果,在其自定义的代码中过滤相关信息则可以实现对特定内容的隐藏。

3.2 直接内核对象操作(DKOM-- Direct Kernel Object

Manipulation)

Windows操作系统通常采用结构或者对象在内存中存储信息,当用户进程请求操作系统信息时,这些对象被报告给用户。DKOM方法通过直接修改内核对象的数据结构来影响API函数的返回结果实现隐藏功能。当用户程序向内核查询某些信息时,被Rootkit修改过的内核对象传递给系统函数一个错误的结果,用户程序也将得不到想要的正确信息。最常见的一种情况就是通过解开活动进程双向链表上想要隐藏进程的链接来实现对进程的隐藏。同样,可以通过修改任意进程的令牌在不调用任何进程或令牌API的情况下获得系统或管理员密码,也可以通过修改令牌中的相应项错误记录事件发生进程的属主用户名。

驱动实现隐藏。

3)隐藏注册表项及键值

系统通过ZwEnumerateKey和ZwEnumerateValueKey来枚举注册表项和键值。其隐藏原理与文件/目录隐藏原理相同,通过调用原始函数,检查返回结果是否为要隐藏的键或键值,如果是,则将索引值加上偏移量得到新索引,再次调用函数实现隐藏。

4)隐藏端口

端口枚举是通过中的ZwDeviceIoControlFile函数来实现的。该函数发送一个特定的IRP包获取端口列表。通过挂钩该函数并修改其返回值就可以实现端口隐藏。同时,可以通过端口复用技术,在不打开新端口的情况下,在常用的知名端口的通信中隐藏通信流量,从而使用户无法检测到可用的端口。

5 结论

随着人们对Windows操作系统内核的逐步了解,Rootkit在内核模式下的应用越来越广泛,其采用的隐藏手段更趋于系统的底层,例如在DKOM技术上发展起来的内核对象挂钩(KOH)技术等。Rootkit利用系统内核机制实现了巧妙的隐藏,增加了查杀的难度,给网络信息安全防护提出了更高的要求。本文对Rootkit原理进行了分析,介绍了其隐藏方法,通过对Rootkit原理的了解,就可以根据Rootkit的表现及执行方式进行针对性地检测和预防,从而减少其带来的危害。

参考文献

[1] Hoglund G,Butler ts:Subverting the Windows

Kernel[M].Addison-Wesley Professional

[2] 朱文杰.隐藏性后门程序设计与实践[D].北京邮电大学工程硕士研究生学位论文,2006

[3] 康治平,向宏,胡海波.Windows系统Rootkit隐藏技术研究与实践[J].计算机工程与设计,2007.07,28(14):3337-3340

[4] 丁亮,谢余强,舒辉.Windows操作系统下内核级Rootkit隐藏技术研究 [J].计算机工程与设计,2006.10,27(19):3616-3618

[5] 王 峰,董亮卫. Windows(2000/XP)下隐藏进程的检测机制[J].计算机工程,2006,32(20):95-96

收稿日期:12月1日 修改日期:12月24日

作者简介:杨平(1982-),男,甘肃天水人,硕士研究生,主要研究方向:网络与信息安全;罗红(1963-),男,陕西西安人,副教授,博士,主要研究方向:网络与信息安全;乔向东(1970-),男,陕西佳县人,副教授,博士,主要研究方向:信息融合与信息安全。

4 Windows Rootkit实现方法

1)隐藏进程

(1)用户态查询系统信息的API最终都是通过调用ZwQuerySystemInformation函数来实现。在该函数中包括两个涉及进程信息的服务类型(5和16),通过挂钩这两类信息的查询就可以实现进程信息的隐藏。

(2)在每个进程的EPROCESS结构中包含一个双向链表——活动进程双向链表,可以通过将要隐藏的进程在该链表中脱开的方式来进行隐藏。由于Windows执行是基于线程的,所以该方法不会影响被隐藏进程的执行。

2)隐藏文件/目录

(1)系统通过ZwQueryDirectoryFile函数对文件和目录进行枚举。Rootkit通过修改该函数的地址从而在文件查询时获取控制权,在调用原始函数获得的信息中查找是否包含需隐藏的文件,通过修改FileInformation删除相应的信息从而实现对文件的隐藏。

(2)通过拦截文件驱动的派遣例程完成I/O控制。在内存中捕获DriverObject->MajorFunction和FastIoDispatch结构,对其进行监控和修改,将修改后的数据减缓给文件系统

本文标签: 隐藏函数系统内核信息