内核级rootkit技术入门

上传人:kms****20 文档编号:41027907 上传时间:2018-05-28 格式:DOC 页数:9 大小:33KB
返回 下载 相关 举报
内核级rootkit技术入门_第1页
第1页 / 共9页
内核级rootkit技术入门_第2页
第2页 / 共9页
内核级rootkit技术入门_第3页
第3页 / 共9页
内核级rootkit技术入门_第4页
第4页 / 共9页
内核级rootkit技术入门_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《内核级rootkit技术入门》由会员分享,可在线阅读,更多相关《内核级rootkit技术入门(9页珍藏版)》请在金锄头文库上搜索。

1、内核级内核级 RootkitRootkit 技术入门技术入门内核级 Rootkit 技术入门Rootkit 是一种奇特的程序,它具有隐身功能:无论静止时(作为文件存在) ,还是活动时, (作为进程存在) ,都不会被察觉。换句话说,这种程序可能一直存在于我们的计算机中,但我们却浑然不知,这一功能正是许多人梦寐以求的不论是计算机黑客,还是计算机取证人员。黑客可以在入侵后置入 Rootkit,秘密地窥探敏感信息,或等待时机,伺机而动;取证人员也可以利用 Rootkit 实时监控嫌疑人员的不法行为,它不仅能搜集证据,还有利于及时采取行动。而本文的目的,就是同读者一起踏上 Windows 内核级 Roo

2、tkit之旅!一、背景知识我们通常所说的智能机器,大至超级计算机,中到个人 PC,小至智能手机,通常都有两部分组成:硬件和软件。并且,设备的智能是通过软件来实现的。所有软件中,有一种是必不可少的,那就是操作系统。操作系统可以简单理解为一组高度复用的核心程序,一方面,它要管理低层的硬件设备,另一方面,为上层其它程序提供一个良好的运行环境。真是同人不同命,同为软件,操作系统却享有至高无上的特权:它不仅管理硬件,而且其他所有软件也都受制于它。因为在应用程序和硬件之间隔着操作系统,所以应用程序不能直接访问硬件,而是通过调用操作系统提供的接口来使用硬件。也就是说,对应用程序而言,硬件是不可见的。当然,凡

3、事是没有绝对的,应用程序绕过操作系统来直接访问硬件也不是不可能的,但这样做会付出高昂的代价。设想一个软件开发商在开发一款功能丰富的软件,功能本身就够他头痛得了,现在他还得操心某个数据在某个磁道的某个簇上,某个字符在某品牌显示器上的颜色的二进制代码等等繁琐的事情,不用说财力和物力,单说开发周期就是无法容忍的。所以,现在的应用程序都是使用操作系统提供的简单明了的服务来访问系统的,因为毕竟没有谁愿意自讨苦吃。二、内核的主要功能从上文中我们已经了解,内核在系统中处于核心枢纽的地位,下面我们具体介绍内核中与 Rootkit 紧密相关的几个主要功能,更重要的是这些功能对 Rootkit 的意义所在:进程管

4、理。进程可以简单理解为运行中的程序,它需要占用内存、CPU 时间等系统资源。现在的操作系统大多支持多用户多任务,也就是说系统要并行运行多个程序。为此,内核不仅要有专门代码来负责为进程或线程分配 CPU 时间,另一方面还要开辟一段内存区域存放用来记录这些进程详细情况的数据结构。内核是怎么知道系统中有多少进程、各进程的状态等信息的?就是通过这些数据结构,换句话说它们就是内核感知进程存在的依据。因此,只要修改这些数据结构,就能达到隐藏进程的目的。文件访问。文件系统是操作系统提供的最为重要的功能之一。内核中的驱动程序把设备的柱面、扇区等原始结构抽象成为更加易用的文件系统,并提供一个一致的接口供上层程序

5、调用。也就是说,这部分代码完全控制着对硬盘的访问,通过修改内核的这部分代码,攻击者能够隐藏文件和目录。安全控制。对大部分操作系统来说,因为系统中同时存在多个进程,为了避免各进程之间发生冲突,内核必须对各进程实施有效的隔离措施。比如,在 MS-Windows 系统中,每个进程都被强制规定了具体的权限和单独的内存范围。因此,对攻击者而言,只要对内核中负责安全事务的代码稍事修改,整个安全机制就会全线崩溃。内存管理。现在的硬件平台(比如英特尔的奔腾系列处理器)的内存管理机制已经复杂到可以将一个内存地址转换成多个物理地址的地步。举例来说,进程 A 按照地址 0x0030030 读取内存,它得到值的是“飞

6、机” ;然而,进程 B 也是按照同样的地址 0x0030030 来读取内存,但它取得的值却是“大炮” 。像上面这样,同一个地址指向截然不同的两个物理内存位置,并且每个位置存放不同的数据这种现象并不足以为怪只不过是两个进程对虚拟地址到物理地址进行了不同的映射而已。如果这一点利用好了,我们可以让 Rootkit 躲避调试程序和取证软件的追踪。上面介绍了内核的主要功能,以及它们对 Rootkit 的重大意义。说到这里,我们就要切入正题了,即:只要我们颠覆(即修改)了操作系统的核心服务(即内核) ,那么整个系统包括各种应用就完全处于我们的掌控之下了。要想颠覆内核,前提条件是能把我们的代码导入内核。三、

7、将代码导入内核的方法所有应用程序都是运行在用户模式下的,而操作系统是运行在内核模式下的,所以应用程序根本没有机会来修改内核程序。要想颠覆内核,前提是设法让我们的代码也运行在内核模式下,即将我们的代码导入内核。设想一下当我们的代码通过驱动程序进入内核后的情形:我们的代码一旦在内核运行,就能访问内核的所有特权内存空间和系统进程有了这样的内核级访问特权,我们就能任意修改系统中的任何代码和数据了!将代码导入内核的方法很多,但我们要介绍的是利用设备驱动程序将代码导入内核的方式。内核驱动程序有多种叫法,有时候又称为内核驱动程序,或者可加载模块。我们之所以利用设备驱动程序将代码导入到内核,主要考虑到两点:1

8、.简单性。能够让我们的代码运行在内核模式之的方法有多种,例如把我们的代码做成设备驱动程序、设法修改正在内存运行的内核、覆盖硬盘中的内核映像等等。其中,利用设备驱动程序是最为简单的一种。2.适用性。现在,绝大多数的操作系统都允许第三方的硬件厂商加载为其硬件产品制作的内核扩展,从而使得操作系统能够支持它们的硬件产品。这的确是一个双赢之举,只有这样,操作系统开发商才能不断巩固和扩大其用户群。因此,各个操作系统开发商不仅提供该系统下的开发设备驱动程序的详尽帮助文档,而且还提供了相应的开发工具包。 虽然我们已经找到将我们的代码导入到内核模式的路径,但还有一个问题需要回答:除了与硬件打交道的代码外,其它代

9、码是否也能写进设备驱动程序?答案是肯定的。尽管这里的“设备”一词容易误导我们,实际上任何代码都可以写成设备驱动程序。迄今为止,我们已经回答了利用设备驱动程序来打造内核级别的Rootkit 可行性问题,也就是说,内核级 Rootkit 大门已经打开了一扇,为了打开另一扇,我们要解决的是“how to”的问题。并且,我们第一个必须解决的“how to”问题就是如何编写 Windows 设备驱动程序。四、Windows 设备驱动程序下面我们介绍如何在 Windows XP 平台上开发一个简单的设备驱动程序。在此过程中,我们要用到设备驱动程序开发包 DDK。需要注意的是,微软为不同的 Windows

10、版本提供了不同的 DDK。就目前来说,我们可以使用 Windows 2003 DDK,因为该版本能够支持 Windows 2000、Windows XP 和 Windows 2003 等三个平台下的设备驱动程序的开发。1. 驱动程序源文件首先在 C 盘根目录下新建一个目录,本例为 C:myrootkit,此后向相应文件都存放在该目录之下。然后可以在 VC+下建立一个 C 源文件,让其内容如下所示:/一个简单的驱动程序实例#include “ntddk.h“NTSTATUS DriverEntry ( IN PDRIVER_OBJECT theDriverObject,IN PUNICODE_S

11、TRING theRegistryPath )DbgPrint(“I am a driver!“);return STATUS_SUCCESS; 之后,将其保存在我们的 C:myrootkit 目录下,并且该文件命名为mydriver.c。下面对上面的代码作简要的解释:DriverEntry 是该驱动程序的入口点,即当该驱动程序启动时,操作系统会首先调用该函数。它相当于一般 C/C+程序中的 main 或Winmain 函数。另外,我们看到 DriverEntry 的两个参数中都含有一个关键词 IN,说明这两个参数只能用于输入。第一个参数指向应被初始化的当前驱动程序的驱动对象;第二个参数是设备

12、服务键的键名。该驱动程序实在太简单了,它只是在内核运行时,利用调试语句给出一则消息:“I am a driver!” 。不过,和一般程序不同,该消息不会显示在标准输出设备上,也就是说,我们在屏幕上看不到这则消失,关于调试输出的处理我们会在后文中加以详细介绍。有一点需要指出,那就是上面的驱动程序没有设置卸载例程。尽管卸载例程不是必需的,但有时它却非常有用:启动驱动程序时,系统会将参数 theDriverObject 传递给该驱动程序的主函数,这个参数指向的数据结构含有许多函数指针,其中一个指针称为“unload routine” 。如果我们设置该指针,就能从内存中卸载驱动程序;如果不设置该指针的

13、话,除非重新启动机器,否则无法将载入内存的驱动程序卸载掉。同时,驱动程序在开发过程中,会不断添加或改变功能,所以要经常装载以及卸载它们。为了避免每次测试新版本的驱动程序时都必须重启系统,我们应当设置“unload routine”指针。事实上,设置该指针并不是什么难事:先建立一个卸载例程,就可以设置该卸载指针了。现在以前面的驱动程序为例,介绍如何为其添加卸载例程:/一个简单的驱动程序实例#include “ntddk.h“/ 这里是我们的卸载函数VOID MyUnload( IN PDRIVER_OBJECT DriverObject )DbgPrint(“MyUnload calledn“)

14、;NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject,IN PUNICODE_STRING theRegistryPath)DbgPrint(“I am a driver and I loaded!“);/ 初始化 DriverObject 对象中指向卸载函数的指针theDriverObject-DriverUnload = MyUnload;return STATUS_SUCCESS;这样一来,我们用重启系统就能方便地装载和卸载驱动程序了。2. SOURCES 文件要想构建设备驱动程序,仅有驱动程序源文件还是不够的,我们还需另外两个文

15、件:SOURCES 和 MAKEFILE 文件。我们先来介绍 SOURCES 文件,此文件的名称必须使用大写字母,并且不带任何扩展名,它的内容应当包含:TARGETNAME=MYDRIVERTARGETPATH=OBJTARGETTYPE=DRIVERSOURCES=mydriver.c其中,第一个变量 TARGETNAME 的作用是为我们的驱动程序命名。在本例中,我们的设备驱动程序在编译后被命名为 MYDRIVER。需要注意的是,变量 TARGETNAME 指定的名称会被嵌入到二进制代码之中,所以在写 Rootkit 时,千万不要用该变量为其指定容易被人猜中的名称。即使把二进制文件本身改名,

16、但其内部的名字是无法改变的。最好用一些迷惑性较强的名称来为这些 Rootkit 命名,方法是根据系统中已有的驱动程序名,在此基础上少做手脚,一个上佳的Rootkit 名便诞生了。第二个变量 TARGETPATH 的作用是指定驱动程序编译后的存放位置,该变量通常设为 OBJ。一般来说,驱动程序文件被放在目录objchk_xxx/i386 下面,例如本文驱动程序,作者在 Windows XP 下构建后的文件将位于 C:myrootkitobjchk_wxp_x86i386。第三个变量 TARGETTYPE 用来指定要编译的文件类型。对于设备驱动程序,该变量设为 DRIVER。第四个变量 SOURCES 用来指定源文件。该变量可以指定多个源文件,这时每行一个文件,并且除最后一行外,在每行末尾都要放上一个反斜杠,如下例所示:SOURCES= myfile1.c myfile2.c myfile3.c /*注意,最后一行没有反斜杠*/除了上面几个必选的变量外,还有一些可选变量。变量 INCLUDES 便是可选变量之一,它用以规

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号