论文部分内容阅读
【摘 要】随着技术的发展,计算机系统已经通过特定程序可实现任意操作,微软的windows是使用最广泛的系统之一,其中,Rootkit技术在windows下最常见的实现方式当属驱动级的内存技术对抗,它被广泛的应用于游戏保护,杀毒软件防护等方面。
【关键词】对抗 驱动 Windows API Hook
一、Intel X86处理器
Intel的X86处理器是通过Ring级别来控制访问权限的,级别共分4层,从Ring0到Ring3(后面简称R0,R1,R2,R3)。R0层拥有最高的权限,R3层拥有最低权限。而现在的操作系统,包括Windows和Linux都没有采用4层权限,而只是使用了2层—R0层和R3层,分别用来存放操作系统数据和应用程序数据。
二、用户模式和内核模式
Windows从总体上分为内核模式(Kernel Mode)和用户模式(User Mode),Windows将内核模式运行在CPU的R0层,而将用户模式运行在CPU的R3层。而驱动程序一旦加载,就运行在R0层,就拥有了和操作系统同样的权限,可以做任何事情。
三、WIN32子系统
Win32是Windows的一个子系统,还有另外的子系统如OS/2、POSIX、WOW等。不同的子系统系统提供了不同的编程接口,即API,一般说的API指的就是Win32 API。Win32子系统是最纯正的Windows子系统,提供了大量的API函数,程序员只需要熟练的使用这些API就可以写出Windows应用程序,当然程序员也可以考虑第三方库,如VC提供的MFC,但这些库不过是在应用程序和Win32子系统中间加了一层封装而以,没有本质的区别。Windows API 分为三类 分别是USER函数,GDI函数,和KERNEL函数。USER函数(user32.dll):这类函数管理窗口,菜单,对话框和控件;GDI函数(gdi32.dll):这类函数在物理设备上执行绘图操作;KERNEL函数(kernel32.dll):这类函数管理非GUI资源,如进程、线程和同步服务等。
四、Native API(Ntdll.dll)
大部分Win32子系统的API都是通过Native API实现的。Native API的函数一般都是在Win32 API上加上Nt两个字母。Native API 是可由用户模式和内核模式程序调用的NT系统服务集接口,它们直接由操作系统实现。
五、SSDT
SSDT的全称是System Services Descriptor Table,系统服务描述符表。这个表就是一个把R3的Win32 API和R0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数個数等。系统服务是由操作系统提供的一个函数集,这些函数可以帮助调用者实现系统的各种功能。用户态的应用程序可以通过API函数间接地调用系统服务。在内核态中,系统通过服务描述符表寻找相应系统服务函数。在系统中有2个描述符表(SYSTEM_DESCRIPTOR_TABLE 结构):(1)KeServiceDescriptorTable,由ntosknl.exe导出,主要为KERNEL32和ADVAPI32中的API提供服务;(2)KeServiceDescriptorTable Shadow,未被导出,主要完成USER32/GUI32中的请求。每个描述符表由4个连续的系统服务表(System Service Table, SST)的表项组成,每项可以描述一组服务。每组服务由一个系统服务分发表(System Service Dispatch Table, SSDT)和一个系统服务参数表(System Service Parameter Table, SSPT)组成,分别对服务的入口地址和所需参数进行索引。每个服务有一个服务序号,系统根据这个序号查找2个表,最终可找到相应的服务函数和参数信息。
六、sysenter和sysexit指令
从R3切换到R0层,早期的操作系统一般通过中断来实现,如Linux下的 int 80h,Windows NT和Windows2000下的 int 2Eh。而在Windows XP以后则使用了快速系统调用sysenter和sysexist来进行系统调用和返回。
七、驱动文件
亦为PE格式的一种,含有用户模式驱动、文件系统驱动等,各类驱动配合操作系统内核组成了庞大的windows系统,用户层应用程序调用API,该API对应用程序提供的参数进行校验再将所有东西转化为unicode,然后调用ntdll.dll中的KiFastSystemCall函数切换入内核,如将服务序号放入eax、将存放参数的用户栈指针放入edx,再切换到内核态。当程序的处理流程进入R0之后,系统会根据服务号(eax)在SSDT这个系统服务描述符表中查找对应的表项,这个找到的表项就是系统服务函数的真正地址。之后,系统会根据这个地址调用相应的系统服务函数,并把结果原路返回给ntdll.dll中的API。在调用sysenter或int 2Eh之后,Windows系统将会捕获你的这个调用,然后进入ring0层,调用内核服务函数NtOpenProcess。由此,如果驱动程序在内核态Hook住了NtOpenProcess函数,通过对传入参数的进行过滤,如果是被保护的程序则返回参数为0,即可实现对程序的简单保护。
八、SSDT HOOK的简单实现
(环境 Windows XP sp3 32bit)驱动层代码t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase;SSDT_Adr=(PLONG)(t_addr+0x23*4); //SSDT表索引值0x23(即NtOpenProcess)SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr; RealNtOpenAddress = *SSDT_Adr; //保留原始地址RealNtOpenProcess = ( NTOPENPROCESS *)RealNtOpenAddress; __asm //去掉页面保护。在驱动入口DriverEntry()派遣函数中调用Hook(),从exe文件中传入进程PID,设置SSDT Hook,实现对进程的简单保护。
九、结语
在内核下存在着我们看不到的战争,随着技术的发展,先前颇为流行的窗口挂钩、inline hook、API挂钩、进程注入等技术已然成为昨日黄花,大有逐渐淡出之势,取而代之的,则是更狠毒、更为赤裸裸的词汇:驱动、隐藏进程、Rootkit……驱动级的对抗技术如今已被广泛应用到了杀毒软件的主动防御、各种软件的自我保护以及游戏的保护、反外挂等技术中去。如360的驱动加载拦截,就是创建了一个LoadImage()的系统回调函数,用XueTr删除后发现其他程序加载驱动后360就无再提示,进入了Ring0态可以完成任何操作,如结束掉杀毒软件等为下一步利用计算机做准备;将合理利用驱动还可以实现提示用户有恶意程序结束掉可信赖的程序,并给出程序名称与路径等关键信息,为进一步查杀病毒提供了便利;监视注册表;监视磁盘读取;系统还原等。正因为Ring0如此重要的地位,使其成了兵家必争之地,可以说谁抢占了先机,凌驾Ring3之上,谁就在这场战争中增加了胜算。
参考文献:
[1]《天书夜读-从汇编语言到Windows内核编程》.电子工业出版社 2009
[2]《Windows驱动开发技术详解》.电子工业出版社 2009
[3]《内核态下的系统服务挂钩对抗》.计算机工程 2010
[4]《多态技术加壳软件的实现》.甘肃科技 2010
【关键词】对抗 驱动 Windows API Hook
一、Intel X86处理器
Intel的X86处理器是通过Ring级别来控制访问权限的,级别共分4层,从Ring0到Ring3(后面简称R0,R1,R2,R3)。R0层拥有最高的权限,R3层拥有最低权限。而现在的操作系统,包括Windows和Linux都没有采用4层权限,而只是使用了2层—R0层和R3层,分别用来存放操作系统数据和应用程序数据。
二、用户模式和内核模式
Windows从总体上分为内核模式(Kernel Mode)和用户模式(User Mode),Windows将内核模式运行在CPU的R0层,而将用户模式运行在CPU的R3层。而驱动程序一旦加载,就运行在R0层,就拥有了和操作系统同样的权限,可以做任何事情。
三、WIN32子系统
Win32是Windows的一个子系统,还有另外的子系统如OS/2、POSIX、WOW等。不同的子系统系统提供了不同的编程接口,即API,一般说的API指的就是Win32 API。Win32子系统是最纯正的Windows子系统,提供了大量的API函数,程序员只需要熟练的使用这些API就可以写出Windows应用程序,当然程序员也可以考虑第三方库,如VC提供的MFC,但这些库不过是在应用程序和Win32子系统中间加了一层封装而以,没有本质的区别。Windows API 分为三类 分别是USER函数,GDI函数,和KERNEL函数。USER函数(user32.dll):这类函数管理窗口,菜单,对话框和控件;GDI函数(gdi32.dll):这类函数在物理设备上执行绘图操作;KERNEL函数(kernel32.dll):这类函数管理非GUI资源,如进程、线程和同步服务等。
四、Native API(Ntdll.dll)
大部分Win32子系统的API都是通过Native API实现的。Native API的函数一般都是在Win32 API上加上Nt两个字母。Native API 是可由用户模式和内核模式程序调用的NT系统服务集接口,它们直接由操作系统实现。
五、SSDT
SSDT的全称是System Services Descriptor Table,系统服务描述符表。这个表就是一个把R3的Win32 API和R0的内核API联系起来。SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基地址、服务函数個数等。系统服务是由操作系统提供的一个函数集,这些函数可以帮助调用者实现系统的各种功能。用户态的应用程序可以通过API函数间接地调用系统服务。在内核态中,系统通过服务描述符表寻找相应系统服务函数。在系统中有2个描述符表(SYSTEM_DESCRIPTOR_TABLE 结构):(1)KeServiceDescriptorTable,由ntosknl.exe导出,主要为KERNEL32和ADVAPI32中的API提供服务;(2)KeServiceDescriptorTable Shadow,未被导出,主要完成USER32/GUI32中的请求。每个描述符表由4个连续的系统服务表(System Service Table, SST)的表项组成,每项可以描述一组服务。每组服务由一个系统服务分发表(System Service Dispatch Table, SSDT)和一个系统服务参数表(System Service Parameter Table, SSPT)组成,分别对服务的入口地址和所需参数进行索引。每个服务有一个服务序号,系统根据这个序号查找2个表,最终可找到相应的服务函数和参数信息。
六、sysenter和sysexit指令
从R3切换到R0层,早期的操作系统一般通过中断来实现,如Linux下的 int 80h,Windows NT和Windows2000下的 int 2Eh。而在Windows XP以后则使用了快速系统调用sysenter和sysexist来进行系统调用和返回。
七、驱动文件
亦为PE格式的一种,含有用户模式驱动、文件系统驱动等,各类驱动配合操作系统内核组成了庞大的windows系统,用户层应用程序调用API,该API对应用程序提供的参数进行校验再将所有东西转化为unicode,然后调用ntdll.dll中的KiFastSystemCall函数切换入内核,如将服务序号放入eax、将存放参数的用户栈指针放入edx,再切换到内核态。当程序的处理流程进入R0之后,系统会根据服务号(eax)在SSDT这个系统服务描述符表中查找对应的表项,这个找到的表项就是系统服务函数的真正地址。之后,系统会根据这个地址调用相应的系统服务函数,并把结果原路返回给ntdll.dll中的API。在调用sysenter或int 2Eh之后,Windows系统将会捕获你的这个调用,然后进入ring0层,调用内核服务函数NtOpenProcess。由此,如果驱动程序在内核态Hook住了NtOpenProcess函数,通过对传入参数的进行过滤,如果是被保护的程序则返回参数为0,即可实现对程序的简单保护。
八、SSDT HOOK的简单实现
(环境 Windows XP sp3 32bit)驱动层代码t_addr=(LONG)KeServiceDescriptorTable->ServiceTableBase;SSDT_Adr=(PLONG)(t_addr+0x23*4); //SSDT表索引值0x23(即NtOpenProcess)SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr; RealNtOpenAddress = *SSDT_Adr; //保留原始地址RealNtOpenProcess = ( NTOPENPROCESS *)RealNtOpenAddress; __asm //去掉页面保护。在驱动入口DriverEntry()派遣函数中调用Hook(),从exe文件中传入进程PID,设置SSDT Hook,实现对进程的简单保护。
九、结语
在内核下存在着我们看不到的战争,随着技术的发展,先前颇为流行的窗口挂钩、inline hook、API挂钩、进程注入等技术已然成为昨日黄花,大有逐渐淡出之势,取而代之的,则是更狠毒、更为赤裸裸的词汇:驱动、隐藏进程、Rootkit……驱动级的对抗技术如今已被广泛应用到了杀毒软件的主动防御、各种软件的自我保护以及游戏的保护、反外挂等技术中去。如360的驱动加载拦截,就是创建了一个LoadImage()的系统回调函数,用XueTr删除后发现其他程序加载驱动后360就无再提示,进入了Ring0态可以完成任何操作,如结束掉杀毒软件等为下一步利用计算机做准备;将合理利用驱动还可以实现提示用户有恶意程序结束掉可信赖的程序,并给出程序名称与路径等关键信息,为进一步查杀病毒提供了便利;监视注册表;监视磁盘读取;系统还原等。正因为Ring0如此重要的地位,使其成了兵家必争之地,可以说谁抢占了先机,凌驾Ring3之上,谁就在这场战争中增加了胜算。
参考文献:
[1]《天书夜读-从汇编语言到Windows内核编程》.电子工业出版社 2009
[2]《Windows驱动开发技术详解》.电子工业出版社 2009
[3]《内核态下的系统服务挂钩对抗》.计算机工程 2010
[4]《多态技术加壳软件的实现》.甘肃科技 2010