通过对系统分派表的直接还原,防御内核本地api钩子

通过对系统分派表的直接还原,防御内核本地api钩子

ID:30451608

大小:83.98 KB

页数:12页

时间:2018-12-30

通过对系统分派表的直接还原,防御内核本地api钩子_第1页
通过对系统分派表的直接还原,防御内核本地api钩子_第2页
通过对系统分派表的直接还原,防御内核本地api钩子_第3页
通过对系统分派表的直接还原,防御内核本地api钩子_第4页
通过对系统分派表的直接还原,防御内核本地api钩子_第5页
资源描述:

《通过对系统分派表的直接还原,防御内核本地api钩子》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、通过对系统分派表的直接还原,防御内核本地API钩子通过对系统分派表的直接还原,防御内核本地API钩子(翻译)2011-01-0715:01通过对系统分派表的直接还原,防御内核本地API钩子介绍win32内核rootkit通过挂钩本地内核的API去修改系统的行为。这项技术通常是通过修改内核中的系统服务分派表(SystemServiceDispatchTable)来实现的。这样的修改确保了通过rootkit安装的一个钩子函数先于本地原始的API被调用。钩子函数通常调用本地原始的API并在返回给用户空间程序之前修改其输出。这项技术允许内核rootkit去隐藏文件,进程和预防恶意进程的结束。

2、本文章将对本地内核API挂钩进行一个简短的介绍,并为通过对修改系统服务分派表而挂钩本地API的内核rootkit防御提供一些建议。所建议的技术是从用户空间中直接恢复系统服务分派表,并且不再要求加载一个内核驱动。通过修改系统服务分派表挂钩本地内核API在windows中,用户空间的应用程序,通过调用由相关dll所导出的API去请求系统服务。比如,要向一个打开的文件,管道或设备中写入数据,通常会使用由kernel32.dll所导出的APIWriteFile。在kernel32.dll内部,APIWriteFile则将依次去执行由ntdll.dll所导出的本地APIZwWriteFile。

3、而由ZwWriteFile所做的工作实际上是执行在内核空间内。因此在ntdll.dll中ZwWriteFile所执行的仅仅是很少的一段代码,是使用0X2E中断转入内核空间中。ZwWriteFile在win2k上的反汇编代码如下:1-MOVEAX,0ED2-LEAEDX,DWORDPTRSS:[ESP+4]3-INT2E4-RETN24其中1行中的0ED是ZwWriteFile在win2k上服务号。在内核系统服务分派表(SSDT)中作为索引值使用,用于定位实际执行写文件,管道或设备的系统函数代码的地址。SSDT的地址可以在系统描述符表(ServiceDescriptorTable,SD

4、T)中找到。SDT可以使用KeServiceDiscriptorTable符号进行参考,它由ntoskrnl.exe导出。它的结构定义如下:typedefstructServiceDescriptorTable{SDEServiceDescriptor[4];}SDT;typedefstructServiceDescriptorEntry{PDWORDKiServiceTable;PDWORDCounterTableBase;DWORDServiceLimit;PBYTEArgumentTable;}SDE;结构的第一个成员,SDT.ServiceDescriptor[0].KiSe

5、rviceTable,包含了一个指向由ntoskrnl.exe实现了的系统服务的SSDT。就像先前所提到的,SSDT包含了一个函数指针数组,其中函数指针指向处理本地API调用的服务函数。ServiceLimit成员给出了在SSDT中入口的数量。在KiServiceTable[0xED]中给出的DWORD值是指向NtWriteFile函数指针,其中包含了写文件,管道或设备的实际代码。因此,要修改用户空间中WriteFileAPI的行为,一个简单的事情是需要写一个钩子(替换)函数,以驱动的方式加载到内核空间中,并修改KiServiceTable[0xED],使其指向钩子函数。钩子函数需要

6、持有原始函数指针(KiServiceTable[0xED]的原始值)值的一个复本,以便原始函数可被调用执行其原有的任务。下面的例子示例了如何使用挂钩本地内核API去修改特定API的行为。例子1:通过挂钩ZwQuerySystemInformation隐藏进程用户空间的程序可以使用由ToolHelpDLL导出的API获取所有正在运行的进程的列表。API依次调用由ntdll.dll导出的本地APIZwQuerySystemInformation指定其第一个参数为(SystemProcessAndThreadInformation)来获取正在运行的进程的列表。要隐藏进程,一个win2k的内

7、核空间的rootkit,它以一个驱动加载,可以修改在KiServiceTable[0x97](ZwQuerySystemInformation)的函数指针,使其转向一个钩子函数调用。钩子函数首先调用原始的ZwQuerySystemInformationAPI来获取一个包含有所有正在运行的进程信息的数组。接着在返回的数组中去删的进程的结点。最后,将修改的结果返回给用户空间程序。这样就有效的防止用户空间的程序"看到"隐藏的进程。例子2:通过挂钩ZwQueryS

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。