危险漫步博客
有时候,正是那些意想不到之人,成就了无人能成之事。
文章1443 浏览13839092

简单驱动开发及逆向之驱动下的进程遍历

在前面的内容中曾经实现过一个枚举过程中被加载DLL文件的函数,接下来要实现一个  枚举进程的函数。枚举进程不能在用户态下进行,需要到内核态下进行,这样就必须使用驱动程序来完成。先用WinDbg完成一次手动的枚举过程,再通过代码来完成。

使用VMWARE和WINDBG进行驱动调试

使用Windbg调试驱动程序或者内核,需要双机进行调试,所谓双机就是两台电脑,通常情况下,大部分人都没有两台电脑,往往只有一台电脑,那么解决的方法就是安装虚拟机,然后对虚拟机进行一些设置,也是可以通过Windb

g来进行调试的,虚拟机选择使用VMWARE下面讨论一下如何对虚拟机进行配置。安装好VMware,并在'Wvfware中安装好操作系统,然后对安装好的虚拟机进行一些设置,通过此设置可以达到调试器与虚拟机的连接。菜单”VM→“Settings”命令,弹出“Virtual Machine Setiiings”窗口,如图7-4所示。

单击“Add”按钮,打开“Add Hardware Wizard”(添加硬件向导)对话框,如图7-5所示。

在该对话框中选择“Serial Port”选项,也就是串口,然后单击“NeXt”按钮,弹出“AddHardware Wizard”对话框的第二个界面,如图7-6所示。

在该界面中选择“Output to named pipe”单选钮,也就是命名管道,命名管道是Windows下进程通信的一种方法。进中该项后继续单击“Next”按钮进入下一个界面,也是设置的最后一个界面,如图=7-7所示。

在这个界面中对命名管道进行设置,然后单击“Finish”按钮即可。至此,已经完成了一半的设置了,接着,启动虚拟机配置Windows的Boot.ini文件。Boot.iri文件原内容如下:

将最后一行复制一下,然后放到最后面,并且进行修改,修改后的内容如下

去掉Boot,ini文件的只读属性,然后保存Boor.iru文件。在下次需要对驱动进行调试,或者对内核进行调试时选择崩动Debug模式的Windows。

 注;这里只介绍了针对Wind,ows XP系统的配置方法,关于其他版本系统的配置方法请自行参考相关内容。至此,所有的配置工作就做好了,但是使用WinDbg进行连接时,还是要有连接参数的。我们先在桌面上创建一个WinDbg的快捷方式,然后在WinDbg快捷方式上单击右键-在弹出的快捷菜单中选择“属性”命令,弹出“属性”对话框,将“目标”位置改为: F:\WinDDK\7600.16385.O\Debuggers\windbg.exe  -b  -kcom:port=\\\pipe\com_l,baud=llf1200,pipe 这样就可以用WinDbg连接虚拟机中调试状态下的一Windows XP了,T2.2  EPROCESS和手动遍历进程 Winfrows-中有一个非常大的与进程有关的结构体—ePRO_eESS。每个进程对应一个EPROCESS结构;但EPROCESS是一个系统未公开的结构体,我们在WDK中只能找到说明,而找不到其结构体的具定义,因此需要通过WnDbg来查看,这次使用WinDbll_和WMware进行调试。按照前面的方法,使WinDbg和WMware可以连接,当WinDg出现调试界面时,在其命令处输入dt _eprocess命令来查看一下该结构件,如图7-8所示。

从图中可以看出,EPROCESS结构体显示出了非常多的内容,从WinDbg调试界面只能看到部分的成员变量,而且偏移已经到了Ox258,非常多。看一下WinDbg的全部内容。

    上面就是EPROCESS结构体的全部,对于遍历进程列表来说,有用的只有几个内容,首先是偏移Ox84处的进程iD;然后是偏移Ox88处的进程链表:最后一个是偏移Ox174的进程名。下面手动进行一次遍历。  在.WinDbg的命龟输入提示处输入!Process 0 0命令。得到进程的列表,如图_7-9所示。

PROCESS后面给出的值就是当前进程中EPROCESS的地址,选择explorer.exe进程给出的地址Oxffl64708-来解析EPROCESS。输入命令dp_eprocess ff364708.输出如下:

可以看到,按照EPROCESS结构体解析FF364708这个地址,输出了我们需要的内容,接着,通过ACTIVEPROESSLINKS来获取下一个进程的信息,输入命令DDFF364708+0X88输出如下:

在FF364790地址处保存了下一个EPROCESS结构体ACTICEPROCESSLINKS的地址,要得到下一个EPROCESS的地址,必须减去0X88才能得到,输入命令DT_EPROCESS输出如下:

将输出结果和图7-9中的结果对比,在explorer,exe的下一个进程为vmwaretray.exe,可见遍历方法是正确的。

编程实现进程遍历

上面介绍的手动遍历过程就是指导我们如何编写代码的,只要上面的手动遍历过程能够掌握,那么代码的编写也就不是问题了。下面直接看代码,代码如下:

在代码中用到了一个函数,就是PSGETCURRENTPROCESS(),这个函数是用来获取当前进程的EPROCESS指针的,该函数的定义如下:

通过PSGETCURRENTPROCESS()函数获得的是SYSTEM进程的EPROCESS,大多数内核模式系统线程都在SUSTEM进程中,除了这个函数没有接触过以外,剩下的部分就是对EPROCESS结构体的操作了,这里就不做过多的介绍了,在前面的内容中介绍过如何实现进程内DLL文件的隐藏,方法是将指定DLL在DLL链表中脱链,为了隐藏进程,同样可以将制定进程的EPROCESS结构体在进程链表中脱链,以达到隐藏的目的。