内核级Rootkit的加载和调试Zz

【导读】本文向读者介绍加载和调试内核级Rootkit的一些简易方法和工具,其中具体介绍了InstDrv和DebugView这两款小工具的使用。实际上,这些方法只适合于开发期间的简单调试,对于更加复杂的调试工作,我们可以使用SoftIce 或WinDbg之类的调试程序;对于“产品级”的Rootkit的加载,我们需要更加高级的技术,我们将会在后面的文章中详细介绍。

本文将向读者介绍如何将编译好的驱动程序运行起来并察看它的调试语句给出的消息。换句话说,我们要做的是最简单的调试工作。

一、驱动程序的加载和执行

当我们开发Rootkit的时候,经常需要改变其功能,这时经常重复加载、运行、测试、停止和卸载这一系列的动作。加载和运行驱动程序的方法很多,我们这里介绍的是最简单的一种——利用工具软件InstDrv。

InstDrv是一款非常小巧的工具,它的.zip压缩包只有189KB。该工具可以动态地加载、运行、停止和卸载内核级驱动程序。该工具可以从网上下载,为了读者方便使用,该工具可以到论坛

下载

下面我们以上篇《

内核级Rootkit技术入门

》文章中编译好的驱动程序为例子,来说明如何利用InstDrv加载和卸载内核级驱动程序。InstDrv有两种使用模式,一种模式称为交互模式,它是图形用户界面;另一种模式是命令行模式,在命令行中使用。下面我们首先介绍交互模式的使用方法。

 

先将InstDrv压缩包抽取到合适的目录,例如C:\。然后在在 C:\ InstDrv目录中会看到一个绿色的InstDrv图标,双击该图标打开此程序,如下图所示:

图1 InstDrv程序的交互模式

在交互模式下,首先在“Full path of the driver”下面的文字框中输入要加载的驱动程序的绝对路径,对于本例而言,该地址是C:\myrootkit\objchk_wxp_x86\i386\mydriver.sys,然后就可以利用文字框下面的“Install”、“Start”、“Stop”和“Remove”按钮分别进行驱动程序的安装、运行、停止和卸载操作了。

图2  运行我们的驱动程序

当我们单击“Install”和“Start”按钮后,利用Win0bj程序(

论坛下载地址

)可以在\Driver目录中看到我们的驱动程序mydriver,如下图所示:

图3 利用Win0bj程序查看驱动程序(注意加红色下划线部分)

现在开始介绍InstDrv的命令行模式下的使用方法。在该模式下,我们同样需要使用驱动程序的绝对路径。此外,还有几个选项可用,这些选项的作用如下所示:

 /i      该选项用于安装驱动程序

 /u      该选项用于卸载驱动程序

 /s      使用该选项后,不会弹出任何消息,即使出错也如此。

 /?      显式帮助信息

下面用一个例子来说明命令模式的用法:

instdrv /i /s C:\myrootkit\objchk_wxp_x86\i386\mydriver.sys

该命令的作用是安静地安装驱动程序,并运行它。上面的命令行中使用了选项/i ,InstDrv将以“自动运行”的方式来安装该驱动程序,这意味着每次系统重启后该驱动程序将自动运行。这一点与交互模式下的安装截然相反,在交互模式下安装的驱动程序,系统重启后它不会自动运行,相反,我们必须手工运行驱动程序。

对于InstDrv而言,如果直接在命令行中输入该程序名的话,它会切换到交互模式。此外,如果InstDrv以命令行模式运行时遇到错误的话,一般也会切换到交互模式。但如果我们使用了/s选项的话,它就不会这样做了。因此,/s选项的作用是用于安静的安装一个驱动程序。

二、查看调试语句的输出

大多数操作系统都提供了可用作调试之用的函数,例如在Linux下,可加载模块能用printk()函数来打印调试信息,以及Windows内核级日志函数,例如DbgPrint()等。我们可以在某行代码后面加上这些调试语句,例如:

DbgPrint(

消息字符串

);

当我们收到这样的消息时,至少说明某行代码已经执行,此外还能给出更多的描述信息。虽然这种调试方法计较简陋,但却很方便。像SoftIce 或WinDbg之类的调试程序的配置和使用是很麻烦的,尽管它们功能很强大。使用调试语句时,返回码能打印出来,对于出错情况也有较为详细的描述。我们可以利用这些函数给出驱动程序执行期间的重要信息,然后使用适当的调试消息捕获工具记录下这些消息,从而进行简单的调试。

我们这里介绍的是一个常见的调试语句捕获工具:Debug View,到51CTO论坛

下载

我们说过,这和一般程序不同,驱动程序消息不会显示在标准输出设备上,也就是说,我们在屏幕上看不到这则消息。下面我们还是以上篇“内核级Rootkit技术入门”文章中编译好的驱动程序为例子,来说明如何利用Debug View来记录调试消息。我们的驱动程序非常简单,它只是在内核运行时,利用调试语句给出一则消息:“I am a driver and I loaded!”,然后卸载时给出消息“MyUnload called”。下面具体介绍如何利用专门的工具Debug View查看这些调试消息。

DebugView是一款本地调试软件,它能捕获驱动程序的调试输出信息。DebugView不仅能够捕获用户模式的应用程序产生的调试输出,而且还能捕获Windows内核本身或/和内核模式设备驱动程序所产生的调试输出信息。对于后者,我们需要选中“Capture”菜单中的“Capture Kernel”选项,或者在工具栏中单击齿轮形状的“Capture Kernel”按钮(如果该按钮上有一个红色的叉,你就需要再按一下;否则说明已经设定为捕捉内核状态了),或者使用热键Ctrl+K。

DebugView也有命令行模式,但限于篇幅,我们在此只介绍在图形用户界面下的使用方法。Debug View程序无需安装,解压后便可直接使用。首先打开该程序,按照上面介绍的捕获系统内核驱动程序的方法设置,然后利用InstDrv安装并启动我们的驱动程序,这时我们就能捕获驱动程序发出的消息了,如下图所示:

图4  DebugView 从内核模式驱动程序捕获的输出信息

下面是工作中经常用到的功能,我们在此加以介绍:

插入注释

通过选择“Edit”菜单的“Append Comment”菜单项,我们就能在当前输出窗口中键入注释并回车,从而向输出中添加注释。

清屏

利用工具栏上的“clear”按钮能够清除当前程序产生的输出消息。

输出窗口内容的保存

我们要想将DebugView窗口中的内容保存成一个扩展名为.log的文件,可以选中 “File”菜单中的“Save”或“Save As”菜单项,或者使用组合键Ctrl+S。此外,我们开可以利用“Edit”中的“Copy”菜单项,或组合键Ctrl+C将选中的内容复制到剪贴板,然后保存在适当的地方。

将消息记录到文件中

为了将DebugView程序捕获的记录输出成为像我们在输出窗口看到的样子的文件,我们要使用“Files”菜单中的“Log to File”或“Log to File As”菜单项,或者工具栏中的“Log to File”按钮,或者使用组合键Ctrl+O也可以。然后设置文件的名称和最大尺寸等。如果选择了“wrap”选项,当文件尺寸达到其最大值时,DebugView将回卷到文件起始处。

如果选择了“Create New Log Every Day”项,DebugView就不再限制日志文件的尺寸,但它会为每天的日志新建一个文件,该文件的名称是你规定的文件名加上当前日期。

当记录活动仍在进行的时候,工具栏“Log to File”按钮中的箭头是绿色的,要停止记录,可以单击该按钮或者选择 “File” 菜单中的“Log to File”菜单项即可。如果记录文件达到最大尺寸,记录活动就会停下来,工具栏“log file”按钮中的箭头变成红色的。

三、小结

本文向读者介绍加载和调试内核级Rootkit的一些简易方法和工具,其中具体介绍了InstDrv和DebugView这两款小工具的使用。实际上,这些方法只适合于开发期间的简单调试,对于更加复杂的调试工作,我们可以使用SoftIce 或WinDbg之类的调试程序;对于“产品级”的Rootkit的加载,我们需要更加高级的技术,我们将在会面的文章中详细介绍。