一种Windows隐蔽性恶意软件检测方法

文档序号:6615715阅读:157来源:国知局
专利名称:一种Windows隐蔽性恶意软件检测方法
技术领域
本发明属于计算机系统安全领域,涉及一种Windows隐蔽性恶意软件检测方法,用于 检测系统中存在的隐蔽性恶意软件(即Rootkit)。
背景技术
所谓Rootkit就是指特洛依木马后门工具,它通过修改现有的操作系统软件使攻击者 获得访问权限,并隐藏在计算机中。Rootkit起源于Unix的Root帐号攻击,它与普通的 特洛依木马的区别是前者执行在操作系统执行层而普通的特洛依木马执行在应用层。 Rootkit目前按照运行等级分为用户态和内核态两大类,其宗旨是隐藏在系统中,获得特 定权限,窃取各种秘密数据,而且通过各种隐藏手段不被发现,对系统安全和数据安全具 有很大的危害性。
Rootkit目前为了不让系统用户发现自己, 一般会隐藏自己的进程、驱动等。目前 Rootkit的隐藏手段分为
1. Hook系统査询函数目前Hook技术主要分为应用态IAT表Hook、API Inline Hook、 DLL注入,内核态SSDTHook、 IDT Hook等,这些Hook技术的共同特征就是拦截 正常的API,过滤其中与自己有关的数据信息,达到隐藏自己而不被发现的目的。
2. DK0M (Direct Kernel Object Manipulate):直接内核对象操纵。所谓DK0M就 是将内核对象从一个管理它的双向链表中删除掉(但是,内核对象本身无法删除, 依然存在于内存之中),以此逃避枚举检测的目的。
要避开Rootkit的隐藏技术,检测其隐藏行为,必须满足两个条件
1. 不能再使用Windows API,因为它已经不再可靠
2. 不能再遍历内核对象双向链表,因为此时的双向链表可能已经被采用DKOM技术的 Rootkit修改。
目前,用户都只能通过微软自身提供的进程査看器(taskmgr.exe)或者第三方的进 程查看软件(如procview)进行系统的安全检査,而第三方软件也只是调用微软的API进 行系统信息的查看,通用的杀毒软件没有査看进程的选项。因此,目前通用的对进程等系 统信息的査看方法,无法满足前面提到的两个必要条件,因此都无法捕捉到Rootkit的隐 藏。
尽管API可能被Hook 了,双向链表被断开了,但是,其内核对象本身依然存在于系统之 中,并没有消失。因此,如果通过一种特殊的办法找到这些内核对象,弄清该内核对象的 结构,并根据此结构读出其中的数据信息,那么Rootkit的隐藏办法也就失去了作用,从 而达到成功检测的目的。

发明内容
本发明克服了上述现有技术的不足,提供了一种绕开Windows自身API查询函数 库,而利用Windows内核对象搜索检测出系统中的恶意隐藏软件的方法。 本发明的方法包括以下步骤
(1) 调试Windows内核系统,获得所有内核对象的数据结构;
(2) 确定内核对象在系统内存区的存储区域;
(3) 创建每一类内核对象头的标志;
(4) 用内核对象头标志搜索步骤(2)中的内存区域,得到与内核对象头标志匹配内 核对象的起始地址;
(5) 记录内核对象的起始地址,并根据所述步骤(1)获得的内核对象结构,读出其 中内核对象体数据信息;
(6) 调用Windows API,获取系统的内核对象数据信息;
(7) 比较所述步骤(5)和所述步骤(6)得到的信息,如果存在步骤(6)中没有的 数据,判定该WINDOWS系统包含隐蔽性恶意软件。
所述步骤(1)调试Windows不同版本下的内核系统,获得所述所有内核对象的数 据结构。
所述步骤(1)中Windows系统通过Windbg软件结合Windows的内核符号表,利 用结构查看命令获得内核对象的数据结构。
所述步骤(1)中得到的内核对象数据结构包括对象头、对象体及对象体内数据成 员的偏移信息。
所述步骤(2)通过在系统内存不变的内存地址0ffdff034h位置査询数据结构 PKDDEBUGGER_DATA64,从其数据结构中得到系统未导出变量MraNonPagedPoolStart, 即为内核对象存储区域的起始地址。
所述步骤(3)每一类内核对象头都位于系统内核对象类型管理目录下。 所述步骤(3)利用内核对象打开操作函数0b0pen0bjectByName〇和内核对象
引用操作函数ObReferenceObjectByHandle ()方法建立某一类内核对象头标志。
所述步骤(4)搜索时按照4字节对齐方式进行处理,从内核对象的存储起始地址
起每次搜索递增4个字节。
所述步骤(5)通过定义内核对象的起始位置i、内核对象的数据成员的类型type、
内核对象内数据的偏移offset,将i类型转换为(type) (i+offset)读出对象体中的
数据信息。
所述步骤(6)调用Windows进程枚举库函数EnumProcesses()查看进程列表信息, 调用Windows驱动枚举库函数EnumDeviceDrivers()査看驱动列表信息。
与现有技术相比,本发明的有益效果在于通过对内核对象的搜索实现了对系统中 非常隐蔽的Rootkit的检测,提高了系统的安全性。


图l: Windows内核对象结构
图2:内核对象的组织形式
图3:内核对象搜索示意图
图4:基于内核对象的Rootkit检测方法框图
图5: —类内核对象搜索检测Rootkit方法流程图
具体实施例方式
下面参照本发明的附图,详细描述本发明。如图4为基于内核对象的Rootkit检测方 法框图,图5为一类内核对象搜索检测Rootkit方法流程图,以一类内核对象搜索为例, 说明基于内核对象搜索的Rootkit检测方法。为了实现通过内核对象检测Rootkit等恶意 隐藏软件,可采取如下步骤
1、调试Windows内核系统,获得进程、驱动等不同内核对象在不同版本下的结构。 图1为Windows内核对象结构。如图1所示,在Windows系统中,无论是进程和线程,还 是驱动等都是以内核对象形式存在的。内核对象实际上是一个结构体数据结构,共分为对 象头和对象体两部分。对象头包含了内核对象的分类信息,以此区分进程、线程或驱动等 内核对象。对象体中的数据成员与该对象的具体分类有关,比如是进程的内核对象就包含 了进程的ID,父进程ID,映像名称等等。
本发明中Windows系统是通过Windbg(—种可用于内核调试的工具)软件结合Windows 的内核符号表(可在微软官方网站下载),利用结构査看命令获得各种内核对象的结构定
下面是调试得出的进程内核对象在Windows2000下的部分结构定义: typedef struct —EPROCESS
/*088*/ LARGE_INTEGER A090*/ LARGE—INTEGER /*09C*/ DWORD /*14C*/ DWORD /*1FC*/ BYTE
EPROCESS, * PEPROCESS, 林PPEPROCESS;
得到对象体中的信息包括进程ID、父进程ID、映像名称,其中进程ID的偏移为 0X9C,父进程ID的偏移为0xl4c,映像名称偏移Oxlfc。内核结构对象在各个版 本中,可能会有细小差别,所以,必须每个版本都要调试。
2、确定内核对象在系统内存区的存储位置。
该存储位置一般处于[MmNonPagedPoolStart, 0x90000000]范围内。其中全局变 量MmNonPagedPoolStart是Windows未导出系统变量,它定义了系统内核对象的存储 起始位置,需要通过Windows调试数据结构PKDDEBUGGER—DATA64获得。而Windows 调试数据结构PKDDEBUGGER—DATA64 —般位于0ffdff034h位置,且在系统中的位置是 固定不变的。
—asm
mov eax, 0ffdff034h;
mov eax, [eax];
mov pKdVersionBlock, eax;
CreateTime; ExitTime; UniqueProcessId; Parentld:
ImageFileName [16]; pListBlock= (LIST—ENTRY64 氺)pKdVersionBlock-〉DebuggerDataList; 上面代码即可获得PKDDEBUGGER—DATA64结构。
3、 生成要搜索的每一类内核对象头的对象头标志。
在Windows系统中每一类内核对象头都位于系统内核对象类型管理目录 "\\0bjectTypesW"下,对于某类内核对象A,其内核对象的对象头为 "\\0bjectTypesWA "。可以打开该目录,利用内核对象打开操作函数
0b0pen0bjectByName O和内核对象引用操作函数0bReference0bjectByHandle ()
方法建立该类内核对象头标志。
4、 如图3所示,利用进程、驱动等内核对象的对象头标志,遍历第2步所获得的内 存区域,将该区域内逐一与内核对象头标志进行匹配,发现匹配上了的,就是要找的 目标内核对象。
for(i=MmNonpagedPoolStart;i〈=0x90000000;i+=4)
If ((P0BJECT—TYPE) 1==结构对象头标志) 内核对象找到(i为起始地址);
其中,内核对象的存储起始地址我们按照4字节对齐方式进行处理,所以,在这 个位置,我们每次搜索递增4个字节。
5、找到了目标内核对象后,记录该目标内核对象的起始地址,并根据第1步获得的 内核对象结构定义,解析读出其中内核对象体数据信息。将此数据信息放入一个链表 之中。获取方式如下
定义i为内核对象的起始位置,type为内核对象的数据成员的类型,offset为 内核对象内数据成员的偏移,则将i类型转换为(type) (i+offset)即为我们要获取 的数据信息。
6、 调用Windows API获得系统关于进程,驱动等的査询数据。图2为内核对象的组 织形式。如图2所示,各类内核对象以双向链表的形式存在于系统内存之中。Windows API函数在査询时通过遍历此表,逐一枚举各类系统信息,如进程、驱动等。用于系 统数据信息查看的API,进程是由Windows进程枚举库函数EnumProcesses(),驱动 是由Windows驱动枚举库函数EnumDeviceDrivers()。
7、 将通过内核对象搜索的方法获得的数据即第5步中査询获得的数据与第6步中获 得的数据进行比较,如果发现存在第6步中没有的数据,该数据即为隐藏的Rootkit 中的数据,判定该WINDOWS系统包含隐蔽性恶意软件
设数组l[n]为第5步中的数据集合,数组h[m]为第6步数据的集合,其中n和m 分别为两个数组的元素个数。Find()为査找函数,如果未找到返回FALSE,否则为 彻E。
for(i=0;i〈n;i++)
If (!Find(l[i],h[m])) L[i]为Rootkit隐藏数据;
如上所述,本发明通过基于内核对象搜索的Windows Rootkit检测方法,检测系统中 存在的隐蔽性恶意软件,准确快速高效。本发明适用于检测目前已知的著名Rootkit以及 一些釆用了各种复杂隐藏技术的未知Rootkit,具适用于Windows各个版本,具有很好的 实用性,准确度高,方法稳定可靠。
本发明要求保护的范围以权利要求书界定的范围为准。
权利要求
1、一种Windows隐蔽性恶意软件检测方法,其步骤包括(1)调试Windows内核系统,获得所有内核对象的数据结构;(2)确定内核对象在系统内存区的存储区域;(3)创建每一类内核对象头的标志;(4)搜索步骤(2)中的内存区域,得到与内核对象头标志匹配内核对象的起始地址;(5)记录内核对象的起始地址,并根据所述步骤(1)获得的内核对象结构,读出其中内核对象体数据信息;(6)调用Windows API,获取系统的内核对象数据信息;(7)比较所述步骤(5)和所述步骤(6)得到的信息,如果存在步骤(6)中没有的数据,判定该WINDOWS系统包含隐蔽性恶意软件。
2、 如权利要求1所述的Windows隐蔽性恶意软件检测方法,其特征在于所述步骤(1) 调试Windows不同版本下的内核系统,获得所述所有内核对象的数据结构。
3、 如权利要求1所述的Windows隐蔽性恶意软件检测方法,其特征在于所述步骤(1) 中Windows系统通过内核调试工具Windbg软件结合Windows的内核符号表,利用结构査 看命令获得内核对象的数据结构。
4、 如权利要求2或3所述的Windows隐蔽性恶意软件检测方法,其特征在于所述内 核对象数据结构包括对象头、对象体及对象体内数据成员的偏移信息。
5、 如权利要求1所述的Windows隐蔽性恶意软件检测方法,其特征在于所述步骤(2) 在系统内存不变的内存地址0ffdff034h位置査询Window调试数据结构 PKDDEBUGGER_DATA64,从其数据结构中得到系统未导出变量,即为内核对象存储区域的起 始地址。
6、 如权利要求1所述的Windows隐蔽性恶意软件检测方法,其特征在于所述步骤(3) 每一类内核对象头都位于系统内核对象类型管理目录下。
7.如权利要求1所述的Windows隐蔽性恶意软件检测方法,其特征在于所述步骤(3) 用内核对象打开操作函数和内核对象引用操作函数方法建立某一类内核对象头标志。
8、 如权利要求1所述的Windows隐蔽性恶意软件检测方法,其特征在于所述步骤(4) 搜索时按照4字节对齐方式进行处理,从内核对象的存储起始地址起每次搜索递增4个字 节。
9、 如权利要求1所述的Windows隐蔽性恶意软件检测方法,其特征在于所述步骤(5)通过定义内核对象的起始位置i、内核对象的数据成员的类型type、内核对象内数据的偏 移offset,将i类型转换为(type) (i+offset)读出对象体中的数据信息。
10、如权利要求1所述的Windows隐蔽性恶意软件检测方法,其特征在于所述步骤(6) 调用Windows进程枚举库函数査看进程列表信息,调用Windows驱动枚举库函数査看驱动 列表信息。
全文摘要
本发明公开了一种Windows隐蔽性恶意软件检测方法,其步骤包括(1)调试Windows内核系统,获得所有内核对象的数据结构;(2)确定内核对象在系统的内存区域;(3)创建每一类内核对象头标志;(4)搜索步骤(2)中的内存区域,得到与对象头标志匹配内核对象的起始地址;(5)记录起始地址,根据步骤(1)获得的内核对象结构,读出内核对象体数据信息;(6)调用Windows API,获取系统的内核对象数据信息;(7)比较步骤(5)和(6)得到的信息,如果存在步骤(6)中没有的数据,判定该WINDOWS系统包含隐蔽性恶意软件。本发明适用于Windows各个版本,准确度高,方法稳定可靠。
文档编号G06F21/22GK101183418SQ20071030408
公开日2008年5月21日 申请日期2007年12月25日 优先权日2007年12月25日
发明者周扬荣, 张行功, 维 邹, 陆腾飞, 韩心慧 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1