一种Windows操作系统下钩子的检测方法

文档序号:6575067阅读:277来源:国知局
专利名称:一种Windows操作系统下钩子的检测方法
技术领域
本发明涉及恶意软件,具体涉及一种Windows操作系统下钩子的检测方法,属于信息 安全技术领域。
背景技术
Windows操作系统是目前使用最为广泛的计算机操作系统,根据调査,世界上有超过 90%的个人计算机以及大约66%的服务器使用的是Windows操作系统,由于Windows的 广泛使用,使得它成为了遭受黑客和病毒攻击最严重的操作系统,也使得它的安全问题成 为用户及计算机安全研究人员关注的焦点。最新的Windows操作系统为Windows Vista, 该操作系统由微软公司于2006年11月发布,在之后的一年多时间里,微软公司致力于Vista 系统的推广,Vista系统的使用人数正在并将持续增长。但是,尽管微软公司对包括Vista 在内的众多操作系统的安全进行改进,但这些操作系统仍然存在着较大的安全隐患。目前 我国计算机用户基本上使用的是Windows操作系统,以XP系统最为普遍,Vista系统在我 国的使用量也将会大幅度增加,所以更应对其安全问题足够重视。
目前对计算机上的病毒、木马等恶意软件的检测方法大致分为三种基于恶意软件特
征的检测、基于恶意软件行为的检测以及基于恶意软件实现技术的检测。前两种方法是目 前杀毒软件广泛釆取的方法,但是由于计算机恶意软件的种类繁多,行为各异,这两种方 法难以检测出所有的恶意软件;而且这两种方法都只能对已经出现并掌握其特征的恶意软 件进行检测,难以在未知恶意软件进入系统的初期进行检测。所以针对恶意软件实现技术 的检测逐渐发展起来。
恶意软件最常见的实现技术是钩子技术,通过使用钩子技术,恶意软件可以改变操作 系统正常的执行路径,从而破坏系统或者窃取用户信息。在不久前出现的恶意软件rootkit (一种恶意软件使用的具有"隐形"能力的工具包、库或者程序代码,用来隐藏或伪装恶意 软件使用的文件、目录和进程)中,更是大量地使用了钩子技术,达到隐藏恶意软件和攻 击者踪迹的效果。
根据运行环境的不同,钩子可以分为内核级钩子和用户级钩子,在Windows操作系统中,主要包含以下种类的钩子。
1. 内核级钩子
当用户进程调用API进入Windows内核后,通过系统服务描述符表(System Service Descriptor Table, SSDT),中断描述符表(Interrupt Descriptor Table, IDT)等跳转表进一 步调用不同的内核系统服务函数,所以恶意程序通过修改内核中的这些跳转表来设置不同 种类的内核钩子。在Windows内核中,恶意软件使用的钩子主要有
* IDT钩子
IDT中包含了异常和中断处理函数的入口地址,恶意软件修改IDT,把系统的处理程 序替换为其提供的非法程序。
* SSDT钩子
SSDT记录着所有内核系统服务函数的入口地址,恶意软件通过修改SSDT表项而改 变内核系统服务函数的处理过程。
* IRP函数表钩子
IRP函数是驱动程序用来处理用户各种请求的,例如读、写、查询等。IRP函数表里 记录这IRP函数的入口地址,攻击者也可以替换IRP函数表的一些表项达到恶意目的。
2. 用户级钩子
在Windows系统中,大多数进程都依赖于三个子系统Win32、 POSIX和OS\2子系 统,这些子系统由一些文件组成,它们以地址表的形式提供了一组应用程序编程接口 (API),用户进程可以通过地址表中的函数入口地址调用API请求操作系统的服务,所 以这些地址表所在的文件是恶意软件攻击的极佳目标。根据地址表的不同,恶意软件使用 的钩子可以分为导入地址表钩子、导出地址表钩子、内联函数钩子、系统可执行文件及DLL 钩子等,恶意软件一般在用户态下替换或修改包含这些地址表的文件来设置这些钩子。
目前针对内核级和用户级钩子的检测方法,使用执行指令数分析的技术,这种方法认 为如果在跳转表上设置了钩子,那么在执行某些常规的系统函数和库函数时,将会执行额 外的指令。于是这种方法通过比较待检测系统和正常系统在运行某个系统调用的指令数差 别来分析是否被设置了钩子。这种基于统计的方法,存在一定的误差,并且即使正常系统 多次执行某个系统调用的指令数也会有差别,造成了这种方法的误差较大。目前也存在对 内核钩子的检测方法,但是基本上只针对某一种跳转表进行检测,由于钩子种类繁多,这 种方法难以将所有钩子的检测覆盖全面。单就Windows Vista而言,由于其操作系统发行时间较短,目前尤其缺乏对其进行钩子检测的技术和工具。

发明内容
本发明的目的在于克服现有技术中存在的问题,提供一种Windows操作系统下针对内 核级钩子的检测方法和恢复方法,从而有效地防护基于钩子的计算机恶意软件。同时,本 发明还提供针对用户级钩子的检测和恢复方法。
具体来说,本发明针对内核级钩子的检测与恢复方法包括下列步骤(检测方法包括步 骤i-iv,恢复方法包括步骤i-v):
i. 对于待检测操作系统,获得系统内核中巳加载的所有模块的信息,所述信息包括 所述模块加载到内存中的起始地址和终止地址;
优选地,通过使用系统调用NtQuerySystemlnformation获得系统内核中已加载的所有 模块的信息。
ii. 获得系统内核中的跳转表的基地址,从而获得所述跳转表;
优选地,通过系统内核未导出的数据结构或汇编指令获得所述内核跳转表的基地址。
iii. 遍历所述跳转表中的各个表项,对于每个表项,获得所述表项指向的地址,并根 据步骤i所述起始地址和终止地址判断所述地址所属的内核模块;
iv. 若所述内核模块不是合法的系统模块,则所述地址不合法,则所述待检测操作系 统被设置了钩子,其原因在于系统内核中跳转表的每个表项均指向一些固定的模块,如 SSDT的表项全部位于ntoskrnal.exe内核模块中,irp表的表项指向改irp所属的驱动程序 等,当这样的指向关系和常规不符时,被认为是不合法的。
优选将本歩骤的检测结果保存于日志,以供系统管理员进行分析。
v. 通过系统调用号或中断向量号,在提供系统调用或中断处理函数的系统模块中获 得正确的系统调用或中断处理函数的入口地址,并用所述入口地址替换所述表项的不合法 的地址。
同样优选将本步骤的替换结果保存于日志,以供系统管理员进行分析。 在上述步骤ii中,所述跳转表优选为系统服务描述符表(SSDT),中断描述符表(IDT) 和/或I/O请求包表。当所述跳转表为系统服务描述符表时,步骤ii通过 KeServiceDescriptorTable或KeServieDescriptorTableShadow得到所述系统服务描述符表的
基地址;当所述跳转表为中断描述符表时,步骤ii通 sidt指令得到所述中断描述符表的基地址;当所述跳转表为1/0请求包表,步骤ii通过IoGetDeviceObjectPointer函数获得设 备的对象指针,然后通过访问该对象的MajorFuction数组获得I/O请求处理函数的地址得 到所述I/O请求包表的基地址。
进一步,本发明针对用户级钩子的检测与恢复方法包括下列步骤(检测方法包括步骤 a和b,恢复方法包括步骤a, b和c):
a) 计算标准操作系统的一个或多个设定的系统文件的hash值并储存,若某个系统文 件存在多个版本,则分别计算各个版本文件的hash值并储存。
所述"设定的系统文件"可以是,比如,Windows系统目录下System32和System目录 中的全部文件或者一部分重要系统文件。
所述hash值优选通过下列hash算法中的任意一种获得MD5、 SHA-l、 RIPEMD-160、 或画AC。
所述hash值优选以XML的格式储存于本地,或通过http或ftp协议储存于远程服务器。
b) 计算待检测操作系统的所述系统文件的hash值,若某个系统文件的hash值和对应 的歩骤a所述一个或多个版本的hash值都不相同,则所述系统文件被设置了钩子,从而可 以断定所述待检测操作系统被设置了钩子。
也就是说,在本步骤的比较过程中,只要某个系统文件的hash值和步骤a中的多版本 hash值中的其中一个匹配即可;采用这种方式可以有效地避免因系统文件的版本不同带来 的问题。
为了提高hash值比较过程的效率,可考虑将hash值储存于同一目录作顺序排列,在 比较时使用宽度优先方式进行系统目录的遍历。
优选将本步骤的检测(比较)结果保存于日志,以供系统管理员进行分析。
c) 用标准操作系统的相应版本的系统文件替换步骤b所述被设置了钩子的系统文件。 同样优选将本步骤的替换结果保存于日志,以供系统管理员进行分析。 本发明所述Windows操作系统可以是各个版本的Windows XP操作系统或Windows
Vista操作系统等。其中对于Windows XP操作系统,其版本包括Windows XP Home Edition(家庭版),Windows XP Professional Edition(专业版),Windows XP 64-Bit Edition(64 位版);对于Windows Vista操作系统,其版本包括Windows Vista Starter 2007 (初级版 本),Windows Vista Home Basic (初级家庭版),Windows Vista Home Premium (增强家庭版),Windows Vista Ultimate (终极版),Windows Vista Small Business (小型商务 版),Windows Vista Business (商务版),Windows Vista Enterprise (企业版)。
本发明根据不同种类钩子的特点,分别在内核态和用户态进行钩子检测及恢复,具有 两个优点, 一是对钩子进行全面检测;二是考虑到用户和内核交互的整个过程,对这个过 程中可能出现的所有类型钩子进行检测,防止恶意软件通过在某个环节设置钩子来破坏系统。


图1表示本发明实施例的钩子检测和恢复设备结构示意图2表示内核跳转表结构图3表示内核级钩子检测和恢复方法流程图4表示用户级钩子检测和恢复方法流程图。
具体实施例方式
下面结合附图,通过实施例对本发明作进一步描述。
图l表示本发明实施例的钩子检测和恢复设备结构示意图。如图1所示,用户级钩子
检测恢复模块、管理模块和日志模块运行于Windows Vista操作系统用户态(ring 3),内 核级钩子检测恢复模块运行于操作系统内核态(ring0)。用户级钩子检测恢复模块和内核 级钩子检测恢复模块分别对用户级钩子和内核级钩子进行检测和恢复;日志模块负责对检 测和恢复日志进行记录和管理;管理模块负责加载内核钩子检测恢复模块到操作系统内 核,并接收内核钩子检测恢复模块的检测结果,将该结果传送到日志模块;管理模块和内 核钩子检测恢复模块通过通信模块进行通信,通信模块使用DeviceloControl实现。 1、内核级钩子的检测和恢复方法
内核跳转表(如图2所示)的每个表项包含一个地址,这个地址指向了处理该表项所 在编号的系统服务、中断处理程序等程序的位置。每个跳转表中的所有地址一般在内核的 某个或若干个内核模块中,本发明利用这个特点,通过分析这些地址的可信性来分析是否
被设置了钩子。
如图3所示,内核级钩子的检测和恢复的具体步骤描述如下1) 管理模块将内核钩子检测恢复模块加载到内核。将内核钩子检测恢复模块实现为 Windows驱动程序形式,使用Windows提供的API将其导入到内核执行。
2) 初始化内核和用户通信模块。通信模块使用DeviceIoControl接口将内核获得的信
息传送至用户态。
3) 获取己加载到内核中的模块的信息。定义一个结构来存放系统模块信息 typedef struct —SYSTEM—MODULE—INFORMATION
PVOID Base; ULONG Size;
CHAR ImageName[256]; 〃模块名 } SYSTEM_MODULE—INFORMATION, *PSYSTEM—MODULE—INFORMATION; 其中Base为模块导入到内存中的基地址,Size为模块大小,该内核模块位于[Base, Base 屮Size]之间。
调用NtQuerySystemlnformation函数获得已加载内核模块的信息。
4) 获得内核跳转表的地址。通过一些Windows内核未导出的数据结构或某些汇编指 令获得内核跳转表的基地址。如使用Windows内核未导出的数据结构 KeServiceDescriptionTable可以获得SSDT的基地址;使用sidt指令可以获得IDT的基地址; 使用IoGetDeviceObjectPointer函数获得设备的对象指针,然后通过访问该对象的 MajorFuction数组获得I/O请求处理函数的地址。
5) 遍历跳转表的表项,分析表项中的地址是否合法,从而可以检测出该跳转表是否 被设置了钩子。
6) 如果设置了钩子,进行恢复的步骤如下
a) 通过系统调用号或中断向量号,在提供系统调用或中断处理函数的系统模块中 得出原系统调用或中断处理函数的地址;
b) 用该入口地址替换所述表项中不合法的地址。
7) 将检测和替换结果写入曰志。
2、用户级钩子检测和恢复方法
用户级钩子检测和恢复模块采用了 hash (在此以MD5算法为例)来获取和校验系统文件的数字指纹,使用xml文件来保存在不同的版本和补丁影响下每个Windows Vista系 统文件的标准MD5值,并针对Windows补丁发布的特点设计了 Windows补丁追踪系统来 即时更新最新发布补丁的MD5值;在发现系统文件被设置了钩子之后,从服务器下载对 应版本的系统文件对本地文件进行替换。从而实现用户级钩子的检测和恢复,具体步骤如

1) 在标准Windows Vista操作系统上选取若干重要的系统文件,使用MD5 hash算法 生成各个版本系统文件的hash值。此处所述的系统文件,包括C:\Windows\System32和 C:\Windows\System下的所有文件;所述版本包括Windows Vista的各个版本,如Windows Vista Ultimate , Windows Vista Business等。
在得到所有版本的系统文件MD5值之后,需要将其组织起来以方便查找,可以使用 XML (全称为extension Markup Language)文件来存放每一个系统文件可能的MD5值。
在保存MD5值的xml文件中,应该为每个系统文件建立一个节点,这个节点应该包 括如下信息
系统文件的全路径名,如C:\WINNT\system\SHELL32.dll。 系统文件可缺失标识yes为可缺失,no为不可缺失。
系统文件MD5值列表即为一个变长的列表,把该文件在正常系统中可能出现的所 有MD5列出来。
根据以上的描述,设计出来的xml的DTD描述如下 〈!ELEMENT file (path,叩tional,MD5" >
〈!ELEMENT path (#PCDATA) > <!—full path name of a system file —> 〈!ELEMENT optional (#PCDATA) > <!--if this system file is necessary 〈!ELEMENT MD5 (弁PCDATA) > <!— MD5 value of this file —> 根据该DTD,所生成的xml文件示例如下 <file>
<path>WINDOWS\system32\oobe\msobcomm.dll</path> <optional>yes</optional>
<MD5>727178fd589e 15ffc8beceeb037d6128</MD5> <MD5>fl d4bbae611 ff716b4af73b8affe95d8</MD5> </file>
2) 用户级钩子检测恢复模块遍历上述步骤1所选取的重要系统文件。为了提高MD5 值查找效率,将相同目录下的文件的MD5值顺序排列,并使用宽度优先策略进行搜索。在遍历的过程中,计算遍历到的文件的MD5值,然后和从服务器下载到的标准值进行比 较,从而检测到被修改的系统文件。结合图4,具体检测和恢复的步骤描述如下
(1) 开始检测前,从服务器上下载系统文件的标准MD5值文件。
(2) 创建一个队列(TC—Queue)来保存待处理的目录,并将要遍历的根目录(rootDir) 添加到队列中。
(3) 如果队列为空,则遍历结束进入(6),否则进入(4)处理下一个目录。
(4) 取出当前队列头的目录节点(tempDir),依次取出该目录所有下一级元素 (tempElem)(子目录或文件),取到tempElem就进入(5);否则说明tempDir已经处理
完毕,进入(3)继续进行。
(5) 处理tempElem,如果tempElem是子目录就进入a);否则进入a)。
a) 将tempElem加入到TC_Stack中,便于将来处理;
b) 对tempElem文件进行MD5校验,并记录日志;
c) 如果校验值不符合,删除此系统文件;
d) 从服务器下载对应系统文件进行替换,恢复原有系统。
(6) 结束遍历,进入下一步统计处理工作。
(7) 以上步骤的检测结果和替换结果保存于日志,以供系统管理员进行分析。
权利要求
1.一种Windows操作系统下钩子的检测方法,包括下列内核级检测方法i.对于待检测操作系统,获得系统内核中已加载的所有模块的信息,所述信息包括所述模块加载到内存中的起始地址和终止地址;ii.获得系统内核中的跳转表的基地址,从而获得所述跳转表;iii.遍历所述跳转表中的各个表项,对于每个表项,获得所述表项中的地址,并根据步骤i所述的起始地址和终止地址判断所述地址所属的内核模块;iv.若所述内核模块不是合法的系统模块,则所述地址不合法,则所述待检测操作系统被设置了钩子。
2. 如权利要求1所述的检测方法,其特征在于,还包括V.通过系统调用号或中断向量号,在提供系统调用或中断处理函数的系统模块中获 得正确的系统调用或中断处理函数的入口地址,并用所述入口地址替换所述表项的不合法 的地址。
3. 如权利要求1或2所述的检测方法,其特征在于,步骤i通过使用系统调用 NtQuerySystemlnformation获得系统内核中已加载的所有模块的信息。
4. 如权利要求1或2所述的检测方法,其特征在于,所述跳转表选自系统服务描述符表, 中断描述符表和/或I/O请求包表。
5. 如权利要求4所述的检测方法,其特征在于,所述跳转表为系统服务描述符表,步骤 ii通过KeServiceDescriptorTable或KeServieDescriptorTableShadow得到所述系统服务描述 符表的基地址。
6. 如权利要求4所述的检测方法,其特征在于,所述跳转表为中断描述符表,步骤ii通 过sidt指令得到所述中断描述符表的基地址。
7. 如权利要求4所述的检测方法,其特征在于,所述跳转表为I/0请求包表,步骤ii通 过IoGetDeviceObjectPointer函数获得设备的对象指针,然后通过访问该对象的 MajorFuction数组获得I/O请求处理函数的地址得到所述I/O请求包表的基地址。
8. 如权利要求2所述的检测方法,其特征在于,将歩骤iv的检测结果和步骤v的替换结 果保存于日志。
9. 如权利要求1或2所述的检测方法,其特征在于,还包括下列用户级检测方法a) 计算标准操作系统的一个或多个设定的系统文件的hash值并储存,若某个系统文 件存在多个版本,则分别计算各个版本文件的hash值并储存;b) 计算待检测操作系统的所述系统文件的hash值,若某个系统文件的hash值和对应的歩骤a所述一个或多个版本的hash值都不相同,则所述系统文件被设置了钩子,则所述待检测操作系统被设置了钩子。
10.如权利要求9所述的检测方法,其特征在于,所述用户级检测方法还包括c)用标准操作系统的相应版本的系统文件替换步骤b所述被设置了钩子的系统文件。
全文摘要
本发明公开了一种Windows操作系统下钩子的检测方法,属于信息安全技术领域。本发明方法包括i.对于待检测操作系统,获得系统内核中已加载的所有模块的信息,包括模块加载到内存中的起始地址和终止地址;ii.获得系统内核跳转表;iii.遍历跳转表中的各个表项,获得表项中的地址,并根据步骤i所述的起始地址和终止地址判断所述地址所属的内核模块;iv.若所述内核模块不是合法的系统模块,则所述地址不合法,则所述待检测操作系统被设置了钩子。本发明方法还可包括v.用正确的系统调用或中断处理函数的入口地址替换所述不合法地址。本发明方法可用于在Windows操作系统下检测基于钩子技术的恶意软件。
文档编号G06F21/00GK101620658SQ20091008825
公开日2010年1月6日 申请日期2009年7月14日 优先权日2009年7月14日
发明者白光冬, 霞 赵, 耀 郭, 陈向群 申请人:北京大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1