查看原文
其他

Windows 网络编程:驱动程序之进程遍历

计算机与网络安全 计算机与网络安全 2022-06-01

一次性进群,长期免费索取教程,没有付费教程。

教程列表见微信公众号底部菜单

进微信群回复公众号:微信群;QQ群:460500587



微信公众号:计算机与网络安全

ID:Computer-network

本文要实现一个枚举进程的函数。枚举进程不能在用户态下进行,需要到内核态下进行,这样就必须使用驱动程序来完成。先用WinDbg完成一次手动的枚举过程,再通过代码来完成。


一、配置VMware和WinDbg进行驱动调试


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


安装好VMware,并在VMware中安装好操作系统,然后对安装好的虚拟机进行一些设置,通过此设置可以达到调试器与虚拟机的连接。单击菜单“VM”→“Settings”命令,弹出“Virtual Machine Settings”窗口,如图1所示。

图1“Virtual Machine Settings”对话框

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

图2“Add Hardware Wizard”对话框1

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

图3“Add Hardware Wizard”对话框2

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

图4“Add Hardware Wizard”对话框3

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


[boot loader]

[operating systems]

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


[boot loader]

[operating systems]

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


至此,所有的配置工作就做好了,但是使用WinDbg进行连接时,还是要有连接参数的。我们先在桌面上创建一个WinDbg的快捷方式,然后在WinDbg快捷方式上单击右键,在弹出的快捷菜单中选择“属性”命令,弹出“属性”对话框,将“目标”位置改为:


F:\WinDDK\7600.16385.0\Debuggers\windbg.exe -b -k com:port=\\.\pipe\com_1,baud=115200,pipe


这样就可以用WinDbg连接虚拟机中调试状态下的Windows XP了。

二、EPROCESS和手动遍历进程


Windows中有一个非常大的与进程有关的结构体——EPROCESS。每个进程对应一个EPROCESS结构,但EPROCESS是一个系统未公开的结构体,我们在WDK中只能找到说明,而找不到其结构体的具体定义,因此需要通过WinDbg来查看,这次使用WinDbg和WMware进行调试。按照前面的方法,使WinDbg和WMware可以连接,当WinDbg出现调试界面时,在其命令处输入dt _eprocess命令来查看一下该结构体,如图5所示。

图5  WinDbg显示的部分EPROCESS结构体

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

上面就是EPROCESS结构体的全部,对于遍历进程列表来说,有用的只有几个内容,首先是偏移0x84处的进程ID;然后是偏移0x88处的进程链表;最后一个是偏移0x174的进程名。下面手动进行一次遍历。


在WinDbg的命令输入提示处输入! Process 00命令,得到进程的列表,如图6所示。

图6  进程信息

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

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

在ff364790地址处保存了下一个EPROCESS结构体ActiveProcessLinks的地址,要得到下一个EPROCESS的地址,必须减去0x88才能得到。输入命令dt_eprocess (ff2b44b0–0x88),输出如下:

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


三、编程实现进程遍历


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

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

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

微信公众号:计算机与网络安全

ID:Computer-network

【推荐书籍】

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存