APP下载

内核态下的系统服务分配表挂钩主动防御技术

2014-04-29任李

电脑迷 2014年13期
关键词:防御

任李

摘 要 恶意程序利用内核态下的系统服务分配表挂钩可以隐藏进程,过滤数据等,严重威胁计算机系统安全。本文提出了一种针对系统服务分配表挂钩技术的主动防御技术,通过内核驱动程序,为系统关键内核服务函数添加自我保护功能,能在恶意程序挂钩相关服务函数系统服务分配表后,该服务函数能够立刻感知,及时修复相应表项值、报警,最后设计程序验证方案有效性。

关键词 挂钩 防御 系统服务

中图分类号:TP391 文献标识码:A

0引言

挂钩技术应用广泛,安全产品利用挂钩技术可以对软件行为进行分析过滤,阻止恶意程序进行威胁操作,例如,有的防火墙就用到了SPI和NDIS的挂钩技术。近年来,恶意程序作者对windows系统进行深入研究,使用的挂钩技术越来越先进,由于系统服务分配表(System Service Dispatch Table,SSDT)肩负着在用户模式的win32 API和内核模式下的内核API之间建立地址映射的使命,所以恶意程序作者常挂钩SSDT表,达到隐藏自身进程、过滤数据、对抗安全产品等目的,为此,本文提出了一种针对SSDT表挂钩的主动防御技术,给一些系统关键的服务函数添加自我保护的性质,使其一旦被SSDT表挂钩,能够及时察觉、修复、报警,较之于传统的静态似的枚举检测,本文提出的方法效率高,而且能在恶意程序给用户造成损失以前及时阻止。

图1 SSDT挂钩原理图

1系统服务调度原理及SSDT挂钩技术

系统服务函数是操作系统提供的一个函数集,应用程序通过调用API函数执行系统服务。对于应用层的API首先调用Ntdll.dll这个动态链接库转译成内核服务,Ntdll.dll中的包装函数做进入内核前的装备,如将服务号放入eax、将存放用户参数的用户栈指针放入edx、执行中断,进入到内核态。在Windows XP下,包装函数形式如下:

mov eax, ServiceID

lea edx, ParameterTable

call dword [ptr]edx

retn

其中ServiceID是将要调用内核服务的服务号。

内核层的系统服务分配表,该表存放了系统服务号和服务函数所对应的地址,进入中断后,内核根据所传的服务号(eax)在SSDT表中查找相对应的服务函数地址。

若要挂钩SSDT,只需修改表中服务号所对应的函数地址,使其指向自定义函数地址,在执行相应代码后再调用原系统服务函数代码。原理图如图1所示。

2相关SSDT表挂钩技术检测与恢复方法

2.1基于执行状态分析的检测方法

如果入侵者挂钩SSDT某个内核函数,该函数的一些执行状态(指令个数、寄存器状态、CPU状态等)将与正常的执行状态有所区别,通过对比可以大致检测出是否被挂钩。但该方法实现复杂,例如指令对比法。执行指令的数量不同,一定程度预示着该服务函数被挂钩了。但为了统计指令,系统必须处于单步追踪模式下,每执行一条指令就要触发一次中断,因此系统性能明显降低。而且,系统服务函数每次运行时指令个数不同,具有不确定性。

2.2基于对比的检测恢复方法

内核文件Ntosknl.exe中有个KiserviceTable,存放未重定位的服务地址,可以经过文献提出的方法,定位该表。通过这些地址可以计算出服务函数相对于基地址的偏移量。将其映射进内存中,将该文件中服务函数的偏移量加上正在运行的内核模块的基地址,可以得到各服务函数的虚拟地址。利用该地址可以产生新的SSDT,利用该表和运行的SSDT表进行对比,发现服务地址若有不同,就是被挂钩的地方,将其按新的SSDT表的内容经行恢复。该方法是静态的被动式的匹配检测,由于SSDT函数数量多,调用频繁,该检测方法会占用内存,CPU等资源进行不断的检测,发现异常再恢复,会严重影响系统性能。

2.3SSDT表挂钩主动防御技术

针对SSDT表挂钩,本文提出了一种主动防御技术,为系统一些关键服务函数添加保护性质,使其具有在被调用时先检测自己在SSDT表中的函数地址是否被挂钩的能力。由于多数恶意程序在挂钩SSDT表后,先执行自定义代码,再调用系统服务函数,所以本文提出的方法能够有效检测SSDT表的挂钩,如图2所示。要完成向系统服务函数添加检测功能,可以直接修改服务函数体和使用SSDT挂钩技术。但由于在内核直接修改函数代码,容易导致系统崩溃,而且由于Windows版本不同,内核也不同,兼容性较差。所以本文采用SSDT挂钩技术,达到给系统服务函数添加检测恢复功能的目的,以后恶意程序再挂钩SSDT表,将被及时检测恢复。本文以恶意程序经常挂钩的内核ZwQuerySystemlnformation函数说明,如何使其防止被SSDT挂钩。

图2 SSDT挂钩防御原理图

SSDT结构如下:

typedef struct _SYSTEM_SERVICE_TABLE{

PVOID ServiceTableBase;//系统服务函数分配表基地址

PULONG ServiceCounterTableBase;//服务表项被调用的次数

ULONG NumberOfService;//系统所支持服务个数

ULONG ParamTableBase;//指向系统服务参数表

};SYSTEM_SERVICE_TABLE,

*P SYSTEM_SERVICE_TABLE;

typedef struct _SERVICE_DESCRIPTOR_TABLE{

SYSTEM_SERVICE_TABLE ntoskrnl.exe;

//ntoskrnl.exe的服务函数

SYSTEM_SERVICE_TABLE win32k;

//win32k.sys的服务函数

SYSTEM_SERVICE_TABLE null1;//未使用

SYSTEM_SERVICE_TABLE null2;//未使用

} SERVICE_DESCRIPTOR_TABLE,

*PSERVICE_DESCRIPTOR_TABLE;

KeserviceDescriptorTable是由内核Ntoskrnl.exe导出的内核实体,该表包含指向SSDT表的指针。因此只要定位该表,就可以定位SSDT表的基地址Base,而函数的服务号ServiceID也可通过KeserviceDescriptorTable获得,从而可以得到其地址Addr=Base+ServiceID*4,修改该地址中内容,使其指向新定义的函数。

SSDT位于windows系统内核空间中,要修改SSDT的内容必须使用设备驱动程序,而且在Windows XP操作系统中对SSDT所在内存区域启用了写保护机制,要修改SSDT表中内容,需要绕过内存保护机制。

定义新的函数HookZwQuerySystemlnformation,易定位该函数内存地址为nAddress,在驱动程序的入口函数中将函数的地址重定向到HookZwQuerySystemlnformation并返回原函数地址sAddress。

定义PTR_ZwQuery为ZwQuerySystemInformation函数指针。

NTSTATUS DriverEntry( IN PDRIVER_OBJECT

theDriverObject, IN PUNICODE_STRING theRegistryPath )

{ _asm

{

push eax

mov eax,CR0

and eax,0FFFEFFFFh

mov CR0,eax

pop eax

}//关闭写保护

sAddress=(PTR_ZwQuery)InterlockedExchange((PLONG) KeServiceDescriptorTable.ServiceTableBase[*(PULONG) ((PUCHAR)(PTR_ZwQuery)+1)],(LONG)

HookZwQuerySystemInformation );

_asm

{

push eax

mov eax,CR0

or eax, NOT 0FFFEFFFFh

mov CR0,eax

pop eax

}//开启写保护

}

恶意程序挂钩ZwQuerySystemlnformation函数,实际挂钩HookZwQuerySystemlnformation函数,该函数被调用时先检查nAddress和该函数ServiceID所对应的SSDT表项中的值是否相等,如果不相等,判定函数被挂钩,恢复该表项的值后报警,如果相等,继续执行ZwQuerySystemlnformation函数。该函数伪代码如下:

TypeX HookZwQuerySystemlnformation(…)

{if(地址相等)

return sAddress;//执行原函数

else

virusAddress=(PTR_ZwQuery)InterlockedExchange((PLONG) KeServiceDescriptorTable.ServiceTableBase[*(PULONG) ((PUCHAR)(PTR_ZwQuery)+1)],(LONG)

HookZwQuerySystemInformation );//恢复表项值,返回病毒地址

return value _of_TypeX;//返回报警值

}

在实际中,需要保护多个函数时,可以将驱动程序的加载、病毒报警及处理等模块抽象为公共模块处理,以节省系统资源。Nguye等人通过监测文件访问和进程活动构建了系统调用层次模版。我们可以对系统之间的调用关系抽象成调用图,赋予各个函数不同权值,找寻关键服务函数进行保护,以此提高效率。

3实验结果与分析

操作系统:Windows 7,CPU Intel Core2,2.0Ghz;内存:2GB; 虚拟机VMvare WorkStation7.0;虚拟机 (下转第37页)(上接第33页)操作系统:Windows 7;编译工具VS2010、DDK2003;在此环境下测试Hook_ZwQuerySystemlnformation病毒,该病毒通过Hook掉SSDT表中的ZwQuerySystemlnformation函数来改变进程链表结构,从而达到隐藏自身的目的。文提出的方法能够在函数被挂钩后立即检测恢复并且报警。

4结论

本文提出的针对SSDT挂钩技术的主动防御方法,赋予了关键函数自我保护的性质,一旦函数被挂钩、调用能及时发现恢复。较之其它静态式的被动检测方法,本方法能够及时发现并且阻止恶意程序,而且由于函数在被调用时才占用资源,所以资源占用量少,效率高,但随着保护函数数量的增加,效率会降低,因此找寻系统关键函数进行保护显得尤为重要。同时针对直接修改函数内核体的挂钩技术,怎么提取病毒特征,使函数具有自我保护性质,怎么使函数具有自我保护性质,还需进一步探索。

参考文献

[1] 韩芳.基于可执行路径分析的隐藏进程检测方法[J].计算机与数字工程,2009,1.

[2] 左黎明,蒋兆峰等.Windows Rootkit隐藏技术与综合检测方法[J].计算机工程,2009, 35(10).

[3] 何耀彬,李祥和等.二次跳转的SSDT挂钩及检测方法研究[J].计算机工程与应用,2012, 48(6).

[4] 李伟,苏璞瑞.基于内核驱动的恶意代码动态检测技术[J].中国科学院研究生院学报:2010, 27(5).

[5] Richter J, Nasarre C.Windows核心编程[M].5版.北京:清华大学出版社,2008.

[6] lyer A, Ngo H Q. Towards a theory of insider threat assessment[C]//proceedings of the 2005 International Conference on Dependable Systems and Networks,2005:108-117.

猜你喜欢

防御
数据挖掘在计算机网络病毒防御中的应用
论校园无线局域网的攻击与防御
计算机网络安全与防御研究
计算机网络安全与防御
基于鱼叉式网络钓鱼攻击的防御研究
刍议新局势下计算机病毒防御技术
网络型病毒与网络安全防御研究
乌拉特草原近40年白灾危害与防御
APT攻击的特征分析与防御策略