首页 / 专利库 / 软件 / 操作系统 / 进程 / 子进程 / 一种用于枚举系统进程的方法及装置

一种用于枚举系统进程的方法及装置

阅读:420发布:2024-01-09

专利汇可以提供一种用于枚举系统进程的方法及装置专利检索,专利查询,专利分析的服务。并且本 发明 公开了一种用于枚举系统 进程 的方法,包括:获取微软客户端和服务端运行时子系统进程对象的数据结构;获取所述数据结构中的对象表指向的句柄表;遍历所述句柄表的所有句柄表项,获得每一句柄表项所指向的进程对象,进而获得每一进程对象所对应的进程;集合所获得的所有进程,形成系统进程集合。本发明还公开了一种用于枚举系统进程的装置。本发明能够枚举出系统所有进程,包括一些隐藏的进程;使得一些恶意 软件 或者Rootkit无处藏身,有利于减少一些恶意的隐藏进程对系统的威胁。,下面是一种用于枚举系统进程的方法及装置专利的具体信息内容。

1.一种用于枚举系统进程的方法,其特征在于,包括:
获取微软客户端和服务端运行时子系统进程对象的数据结构;
获取所述数据结构中的对象表指向的句柄表;
遍历所述句柄表的所有句柄表项,获得每一句柄表项所指向的进程对象,进而获得每一进程对象所对应的进程;
集合所获得的所有进程,形成系统进程集合。
2.根据权利要求1所述的用于枚举系统进程的方法,其特征在于,所述获取微软客户端和服务端运行时子系统进程对象的数据结构包括:
获取当前进程的私有句柄表;
遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程私有句柄表;
根据所述获得的其它进程的私有句柄表,获取私有句柄表所对应的进程对象的数据结构;直至获取所述微软客户端和服务端运行时子系统进程对象的数据结构为止。
3.根据权利要求1所述的用于枚举系统进程的方法,其特征在于,所述获取微软客户端和服务端运行时子系统进程对象的数据结构包括:
获取系统进程和线程对象句柄表;
遍历所述系统进程和线程对象句柄表中进程对象体指针指向的进程对象,获得相应的进程对象的数据结构,直至获取所述微软客户端和服务端运行时子系统进程对象的数据结构为止。
4.根据权利要求1所述的用于枚举系统进程的方法,其特征在于,所述获取所述数据结构中的对象表指向的句柄表包括:
在所述数据结构中由起始位置偏移固定的步长获取所述数据结构中的对象表指向的句柄表。
5.根据权利要求1所述的用于枚举系统进程的方法,其特征在于,所述遍历所述句柄表的所有句柄表项,获得每一句柄表项所指向的进程对象包括:
获取所述句柄表层数;
若获取的句柄表层数为一层,按照固定的步长遍历该层每一句柄表项,并根据每一句柄表项中的指向进程对象的成员指针,获取其进程对象;
若获取的句柄表层数大于一层,则首先指向句柄表最高层,由最高层按照固定步长遍历该层每一句柄表项;并获取每一句柄表项中的指向相邻下层句柄表项的成员指针;重复执行遍历每一层的句柄表项,直至最下层;并由该最下层的每一句柄表项中的指向进程对象的成员指针,获取其进程对象。
6.根据权利要求5所述的用于枚举系统进程的方法,其特征在于,所述获取所述句柄表层数包括:
读取句柄表中TableCode值的后两位;
根据所述后两位判断句柄表层数。
7.根据权利要求5所述的用于枚举系统进程的方法,其特征在于,所述首先指向句柄表最高层包括:
获取句柄表中TableCode指针;
将所述TableCode指针定位到句柄表最高层。
8.根据权利要求1所述的用于枚举系统进程的方法,其特征在于还包括:对于所述获得系统的进程中的至少一个进程,按照该进程所在的SessionProcessLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
9.根据权利要求1所述的用于枚举系统进程的方法,其特征在于还包括:对于所述获得系统的进程中的至少一个进程,按照该进程所在Vm.WorkingSetExpansionLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
10.根据权利要求1所述的用于枚举系统进程的方法,其特征在于,还包括:
将获取的进程集合与Windows任务管理器的进程表比对;
找出不同于Windows任务管理器的进程表中的进程;
以所述找出的进程作为内容向用户发送或者向用户发送提示消息或报警。
11.一种用于枚举系统进程的装置,其特征在于,包括:
csrss进程对象获取单元,用于获取微软客户端和服务端运行时子系统进程对象的数据结构;
句柄表获取单元,用于获取所述数据结构中的对象表指向的句柄表;
遍历单元,用于遍历所述句柄表的所有句柄表项,获得每一句柄表项所指向的进程对象,进而获得每一进程对象所对应的进程;
集合单元,用于集合所获得的所有进程,形成系统进程集合。
12.根据权利要求11所述的用于枚举系统进程的装置,其特征在于,所述进程对象获取单元包括:
私有句柄表获取单元,用于获取当前进程的私有句柄表;
第二遍历单元,用于遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程私有句柄表;
执行单元,用于根据所述获得的其它进程的私有句柄表,获取私有句柄表所对应的进程对象的数据结构;直至获取所述微软客户端和服务端运行时子系统进程对象的数据结构为止。
13.根据权利要求11所述的用于枚举系统进程的装置,其特征在于,所述进程对象获取单元包括:
进程和线程对象句柄表获取单元,用于获取系统进程和线程对象句柄表;
第三遍历单元,用于遍历所述系统进程和线程对象句柄表中进程对象体指针指向的进程对象,获得相应的进程对象的数据结构,直至获取所述微软客户端和服务端运行时子系统进程对象的数据结构为止。
14.根据权利要求11所述的用于枚举系统进程的装置,其特征在于,所述遍历单元包括:
句柄表层数获取单元,用于获取所述句柄表层数;
遍历执行单元,用于根据句柄表层数遍历句柄表项,若获取的句柄表层数为一层,按照固定的步长遍历该层每一句柄表项,并根据每一句柄表项中的指向进程对象的成员指针,获取其进程对象;若获取的句柄表层数大于一层,则首先指向句柄表最高层,由最高层按照固定步长遍历该层每一句柄表项;并获取每一句柄表项中的指向相邻下层句柄表项的成员指针;重复执行遍历每一层的句柄表项,直至最下层;并由该最下层的每一句柄表项中的指向进程对象的成员指针,获取其进程对象。
15.根据权利要求14所述的用于枚举系统进程的装置,其特征在于,所述句柄表层数获取单元包括:
读取单元,用于读取句柄表中TableCode值的后两位;
判断单元,用于根据所述后两位判断句柄表层数。
16.根据权利要求14所述的用于枚举系统进程的装置,其特征在于,所述遍历执行单元还包括:
TableCode指针获取单元,用于获取句柄表中TableCode指针;
定位单元,用于将所述TableCode指针定位到句柄表最高层。
17.根据权利要求11所述的用于枚举系统进程的装置,其特征在于还包括:
第四遍历单元,用于对于所述获得系统的进程中的至少一个进程,按照该进程所在的SessionProcessLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
18.根据权利要求11所述的用于枚举系统进程的装置,其特征在于还包括:
第五遍历单元,对于所述获得系统的进程中的至少一个进程,按照该进程所在Vm.WorkingSetExpansionLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
19.根据权利要求11所述的用于枚举系统进程的装置,其特征在于,还包括:
对比单元,用于将获取的进程集合与Windows任务管理器的进程表比对;
提取单元,用于找出不同于Windows任务管理器的进程表中的进程;
报警单元,用于以所述找出的进程作为内容向用户发送或者向用户发送提示消息或报警。

说明书全文

一种用于枚举系统进程的方法及装置

技术领域

[0001] 本发明涉及计算机技术领域,特别是涉及一种用于枚举系统进程的方法。本发明还涉及一种用于枚举系统进程的装置。

背景技术

[0002] Windows任务管理器可以枚举出系统当前的进程,并能够根据需要选择终止进程。为管理系统进程提供了很大的便利。
[0003] Windows任务管 理器枚举 系统当前 进程是 通过其Native API函 数ZwQuerySystemInfomation来操作进程活动链表来实现的。具体的过程如下:
[0004] 首先,获取当前任一进程的指针,例如可以通过PsGetCurrentProcess()来获取当前进程的PEPROCESS指针。
[0005] 然后定位到记录该当前进程与其它进程链接信息的Activelist处,具体的操作方式为ActiveList=pCurrentEprocess+0x88,即当前进程指针移动一定的步长。其中0x88为winxp sp3下Activelist与pCurrentEprocess的步长,在不同win操作系统时该步长并不相同。
[0006] 接着,以所定位的当前进程的Activelist遍历整个进程活动链表(Activelistlink)上每一进程的数据结构,即可获得当前的存在于进程活动链表的所有进程。
[0007] 如上所述,因为windows任务管理器是基于ZwQuerySystemInformation来实现的,所以如果将进程对象从进程活动链表中移除,那么调用NtQuerySystemInfomation来枚举进程的任务管理器TaskMgr.exe中就不会看到目标进程了。同时,Windows的任务调度分配器使用的另一的数据结构,也就是说,进程是否被调度执行与进程活动链表无关,不会因为从进程活动链表删除就被CPU忽略,因此进程仍然会被执行。这很容易被一些恶意软件或者RootKit程序利用,在进程活动链表上不显示其存在,但是仍然被执行,这可能导致用户的计算机在不知不觉中被感染病毒、植入木或者窃取了信息,对计算机造成潜在的或现实的威胁。因而有必要能够查找出这种被进程活动链表忽略而实质上又在被执行的隐藏进程。

发明内容

[0008] 鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的用于枚举系统进程的方法和相应的用于枚举系统进程的装置。
[0009] 依据本发明的一个方面,提供了一种用于枚举系统进程的方法,包括:
[0010] 获取微软客户端和服务端运行时子系统进程对象的数据结构;
[0011] 获取所述数据结构中的对象表指向的句柄表;
[0012] 遍历所述句柄表的所有句柄表项,获得每一句柄表项所指向的进程对象,进而获得每一进程对象所对应的进程;
[0013] 集合所获得的所有进程,形成系统进程集合。
[0014] 可选的,所述获取微软客户端和服务端运行时子系统进程对象的数据结构包括:
[0015] 获取当前进程的私有句柄表;
[0016] 遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程私有句柄表;
[0017] 根据所述获得的其它进程的私有句柄表,获取私有句柄表所对应的进程对象的数据结构;直至获取所述微软客户端和服务端运行时子系统进程对象的数据结构为止。
[0018] 可选的,所述获取微软客户端和服务端运行时子系统进程对象的数据结构包括:
[0019] 获取系统进程和线程对象句柄表;
[0020] 遍历所述系统进程和线程对象句柄表中进程对象体指针指向的进程对象,获得相应的进程对象的数据结构,直至获取所述微软客户端和服务端运行时子系统进程对象的数据结构为止。
[0021] 可选的,所述获取所述数据结构中的对象表指向的句柄表包括:
[0022] 在所述数据结构中由起始位置偏移固定的步长获取所述数据结构中的对象表指向的句柄表。
[0023] 可选的,所述遍历所述句柄表的所有句柄表项,获得每一句柄表项所指向的进程对象包括:
[0024] 获取所述句柄表层数;
[0025] 若获取的句柄表层数为一层,按照固定的步长遍历该层每一句柄表项,并根据每一句柄表项中的指向进程对象的成员指针,获取其进程对象;
[0026] 若获取的句柄表层数大于一层,则首先指向句柄表最高层,由最高层按照固定步长遍历该层每一句柄表项;并获取每一句柄表项中的指向相邻下层句柄表项的成员指针;重复执行遍历每一层的句柄表项,直至最下层;并由该最下层的每一句柄表项中的指向进程对象的成员指针,获取其进程对象。
[0027] 可选的,所述获取所述句柄表层数包括:
[0028] 读取句柄表中TableCode值的后两位;
[0029] 根据所述后两位判断句柄表层数。
[0030] 可选的,所述首先指向句柄表最高层包括:
[0031] 获取句柄表中TableCode指针;
[0032] 将所述TableCode指针定位到句柄表最高层。
[0033] 可选的,还包括:对于所述获得系统的进程中的至少一个进程,按照该进程所在的SessionProcessLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
[0034] 可选的,还包括:对于所述获得系统的进程中的至少一个进程,按照该进程所在Vm.WorkingSetExpansionLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
[0035] 可选的,还包括:
[0036] 将获取的进程集合与Windows任务管理器的进程表比对;
[0037] 找出不同于Windows任务管理器的进程表中的进程;
[0038] 以所述找出的进程作为内容向用户发送或者向用户发送提示消息或报警。
[0039] 根据本发明的另一方面,还提供一种用于枚举系统进程的装置,包括:
[0040] csrss进程对象获取单元,用于获取微软客户端和服务端运行时子系统进程对象的数据结构;
[0041] 句柄表获取单元,用于获取所述数据结构中的对象表指向的句柄表;
[0042] 遍历单元,用于遍历所述句柄表的所有句柄表项,获得每一句柄表项所指向的进程对象,进而获得每一进程对象所对应的进程;
[0043] 集合单元,用于集合所获得的所有进程,形成系统进程集合。
[0044] 可选的,所述进程对象获取单元包括:
[0045] 私有句柄表获取单元,用于获取当前进程的私有句柄表;
[0046] 第二遍历单元,用于遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程私有句柄表;
[0047] 执行单元,用于根据所述获得的其它进程的私有句柄表,获取私有句柄表所对应的进程对象的数据结构;直至获取所述微软客户端和服务端运行时子系统进程对象的数据结构为止。
[0048] 可选的,所述进程对象获取单元包括:
[0049] 进程和线程对象句柄表获取单元,用于获取系统进程和线程对象句柄表;
[0050] 第三遍历单元,用于遍历所述系统进程和线程对象句柄表中进程对象体指针指向的进程对象,获得相应的进程对象的数据结构,直至获取所述微软客户端和服务端运行时子系统进程对象的数据结构为止。
[0051] 可选的,所述遍历单元包括:
[0052] 句柄表层数获取单元,用于获取所述句柄表层数;
[0053] 遍历执行单元,用于根据句柄表层数遍历句柄表项,若获取的句柄表层数为一层,按照固定的步长遍历该层每一句柄表项,并根据每一句柄表项中的指向进程对象的成员指针,获取其进程对象;若获取的句柄表层数大于一层,则首先指向句柄表最高层,由最高层按照固定步长遍历该层每一句柄表项;并获取每一句柄表项中的指向相邻下层句柄表项的成员指针;重复执行遍历每一层的句柄表项,直至最下层;并由该最下层的每一句柄表项中的指向进程对象的成员指针,获取其进程对象。
[0054] 可选的,所述句柄表层数获取单元包括:
[0055] 读取单元,用于读取句柄表中TableCode值的后两位;
[0056] 判断单元,用于根据所述后两位判断句柄表层数。
[0057] 可选的,所述遍历执行单元还包括:
[0058] TableCode指针获取单元,用于获取句柄表中TableCode指针;
[0059] 定位单元,用于将所述TableCode指针定位到句柄表最高层。
[0060] 可选的,还包括:
[0061] 第四遍历单元,用于对于所述获得系统的进程中的至少一个进程,按照该进程所在的SessionProcessLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
[0062] 可选的,还包括:
[0063] 第五遍历单元,对于所述获得系统的进程中的至少一个进程,按照该进程所在Vm.WorkingSetExpansionLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
[0064] 可选的,还包括:
[0065] 对比单元,用于将获取的进程集合与Windows任务管理器的进程表比对;
[0066] 提取单元,用于找出不同于Windows任务管理器的进程表中的进程;
[0067] 报警单元,用于以所述找出的进程作为内容向用户发送或者向用户发送提示消息或报警。
[0068] 根据本发明提供的具体实施例,本发明公开了以下技术效果:本发明的方法中,首先获取微软客户端和服务端运行时子系统进程对象的数据结构,并获取其数据结构中的对象表这一数据项,进而获取该对象表指向的句柄表,遍历该句柄表即可获得句柄表项指向的系统所有的当前进程;由于win系统中,每产生一个进程,都会将进程信息记录到所述的微软客户端和服务端运行时子系统进程对象的数据结构中;具体的,就是将进程对象的句柄记录到所述的句柄表中;因而,遍历该句柄表,即可获得系统的所有进程;也包括一些隐藏的进程;也就是说,即使有些进程从进程活动链表中删除,通过本发明的方法仍然能够枚举出该进程,使得一些恶意软件或者Rootkit无处藏身,有利于减少一些恶意的隐藏进程对系统的威胁。
[0069] 上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。附图说明
[0070] 通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
[0071] 图1为本发明的用于枚举系统进程的实施例的流程图
[0072] 图2示出了根据本发明一个实施例中多个进程的进程结构体通过其私有句柄表形成句柄表链的示意图;
[0073] 图3为本发明的一种用于枚举系统进程的装置的一种实施例的示意图。

具体实施方式

[0074] 下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
[0075] 请参看图1,其为本发明的用于枚举系统进程的实施例的流程图。
[0076] 步骤100,获取微软客户端和服务端运行时子系统进程对象的数据结构。
[0077] 微软客户端和服务端运行时子系统(Client/Server Runtime Server Subsystem,简称Csrss.exe)属于系统进程。在所述Csrss.exe进程中,保存着所有Win32子系统的进程信息,这些信息以链表形式被保存在该进程的句柄表中。正常情况下,系统中每一个新创建的进程都会通知Csrss.exe进程,Csrss.exe进程接收该通知,并将所述新创建的进程的信息保存到句柄表中。通过遍历Csrss.exe进程的句柄表即可得到所有Win32子系统的进程信息。若要通过所述Csrss.exe进程的句柄表获得所有Win32子系统的进程信息,则首先需要获取所述Csrss.exe进程。需要注意的是,在微软Vista以及Win7操作系统中,可能有不止一个Csrss.exe进程,获取所有Csrss.exe进程并遍历每一个的句柄表,才能获得系统的所有进程。获取Csrss.exe进程的方式以及对每一个Csrss.exe进程句柄表的遍历方式均可使用本实施例中所述的方法。
[0078] 获取所述Csrss.exe进程的方式有很多种,下面列举其中的两种。
[0079] 所述获取Csrss.exe进程对象的数据结构的实现方法之一如下所述。
[0080] A、获取当前进程的私有句柄表;B、遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程私有句柄表;C.根据所述获得的其它进程的私有句柄表,获取私有句柄表所对应的进程对象的数据结构;直至获取所述微软客户端和服务端运行时子系统进程对象的数据结构为止。
[0081] 具体而言,在windows系统中,每一个进程都有一个句柄表(handletable),该句柄表称为进程的私有句柄表。所述进程的私有句柄表是一个_HANDLE_TABLE结构,系统中所有进程的私有句柄表以双向链表的形式链接在一起,Csrss.exe进程也不例外。故若获取当前进程的私有句柄表,并按照一定的步长遍历所述双向链表,即可找到Csrss.exe进程。
[0082] 所述获取当前进程的私有句柄表的一种具体实现方式如下:a,获取指向当前进程的指针;b,由所述当前进程的指针偏移获得当前进程的私有句柄表指针;c,根据所述当前进程的私有句柄表指针定位到该当前进程的私有句柄表。
[0083] 具体而言,可以通过PsGetCurrentProcess()或IoGetCurrentProcess()获得当前进程的指针。在windows系统中,由于受调度资源的限制,同一进程在执行时也会被划分到不同的时间段部分的执行,不同的进程在执行时穿插在一起,固在某一时间区间内,可能有多个进程在同时进行。而在某一时间点上,在多数情形下正在执行的是一个进程(当然也不排除在包括中央处理单元、内存等系统资源充裕的情况下,两个或两个以上的进程并行运行)。通过所述PsGetCurrentProcess()或IoGetCurrentProcess()函数即可得到在调用函数时刻指向正在运行的进程的指针,即指向当前进程的进程结构体_EPROCESS的指针pCurrentProcess。本实施例中当前进程即指调用所述函数时刻正在运行的进程。所述获得的当前进程可以是windows系统中的任何进程,
[0084] 在获得指向当前任一进程的指针pCurrentProcess后,将所述指针偏移固定的步长,可得到该当前任一进程的私有句柄表。以windows XP为例,指向当前进程的指针pCurrentProcess偏移0xc4(十六进制),即可得到所述当前进程的私有句柄表,即[0085] pHandleTable=pCurrentProcess+0xc4,
[0086] 需要说明的是,在windows XP中,对于任何的进程而言,指针pCurrentProcess与私有句柄表之间的偏移步长均为0xc4(十六进制)。在其它不同版本的window系统中,例如window2000、vista、win7等,偏移步长则有所不同,本领域技术人员可以根据各个windows的版本获得相应的步长。
[0087] 根据所述当前进程的私有句柄表指针即可定位到该当前进程的私有句柄表。
[0088] 如前所述,windows系统中,系统中所有进程的私有句柄表以双向链表的形式链接在一起。如图2所示,其为多个进程的进程结构体通过其私有句柄表形成句柄表链的示意图。进程的私有句柄表为_HANDLE_TABLE结构,对于任一句柄表,由pHandleTable偏移0x1c(十六进制)即可指向其类型为_LIST_ENTRY的成员变量HandleTableList,即句柄表链。每一个HandleTableList都具有Flink和Blink两个成员,Flink成员是一个向前链接,指向下一个LIST_ENTRY结构;Blink成员则是一个向后链接,指向前一个LIST_ENTRY结构。整个链表形成封闭环形,也就是说,最后一个Flink指向链表中的第一个LIST_ENTRY结构,而第一个Blink则指向最后一个。由图2可以看出,系统内所有进程的句柄表都是通过_LIST_ENTRY类型的双向链表链接起来的。故按照一定的步长遍历该双向链表,即可获得系统中Csrss.exe进程。
[0089] 在遍历所述双向链表时,可以在前述获得的当前进程的私有句柄表基础上,向前或者向后偏移一定的步长(所述偏移的步长根据win系统的版本而确定)获得相邻的HandleTableList,并对每一次偏移获得的HandleTableList的地址偏移-0x1c(十六进制)即获得其所在的私有句柄表的pHandleTable;也就是获得了HandleTableList所在的私有句柄表。
[0090] 对于任一私有句柄表,通过遍历即可获得其成员变量HandleTableList的地址。在句柄表中,pHandleTable偏移0x04处,结构成员为指向该句柄表所在进程结构体的指针,也就是说,在获得HandleTableList的地址后,通过地址偏移即可找到其所在进程结构体的指针,进而能够得到该进程结构体,也就是找到了该进程。系统的所有进程均可以通过如上所述的方式而获得。自然也可以得到系统的Csrss.exe进程。本实施例中,直至获取所述Csrss.exe进程对象的数据结构即EPROCESS为止。在Win系统具有多个Csrss.exe时,则需要遍历整个私有句柄表链,并找出所有Csrss.exe进程。
[0091] 所述获取Csrss.exe进程对象的数据结构的实现方法之二如下所述:
[0092] I、获取系统进程和线程对象句柄表;II、遍历所述系统进程和线程对象句柄表中进程对象体指针指向的进程对象,获得相应的进程对象的数据结构,直至获取所述微软客户端和服务端运行时子系统进程对象的数据结构为止。
[0093] 具体而言,系统进程和线程对象句柄表(PspCidTable)是Windows系统中一种句柄表,其中存放的对象是系统中所有的进线程对象。因此只要能遍历这个PspCidTable句柄表,就可以遍历到系统的所有进程,包括所有隐藏进程,当然,也可以找到所述的Csrss.exe进程。因而,本方式中通过PspCidTable来获取Csrss.exe进程。
[0094] 不难理解,若欲通过PspCidTable来获取Csrss.exe进程,则首先需要获取PspCidTable,即定位到所述PspCidTablede的首地址。获取所述PspCidTablede的方法有很多种,在这里列举其中一种:通过PspCidTable的函数中特征搜索定位系统进程和线程对象句柄表。其中,所述特征搜索的特征串包括0x35ff和0x8e。当然,还可以通过其它方式获取PspCidTable,这里不再一一列举。需要强调的是,任何能够获取PspCidTable的方法均可应用于此,在本实施例中对此并无限制。
[0095] PspCidtable为_Handle_Table结构,在windows2000系统中,其为固定的三层表结构,TableCode中记录着三层表即一级表(一级表也称为基本表)、二级表和三级表的基地址。在上述的三层表中,上一级表中存放的地址指针指向与其临近的下一层地址,如三级表中存放的是指向二级表的指针,二级表中存放的是指向基本表的指针,在基本表中存放的才是指向进程对象或线程的指针。
[0096] 而在windows xp和windows2003中,为了节省系统空间,采用了动态可扩展的三层表结构,当句柄数目较少时候仅仅采用基本表,当句柄数目较大时系统才会启用二级表,直至三级表。
[0097] 无论是上述的固定三层表结构还是动态可扩展的三层表结构,都需要根据每一层表的基地址按照固定的步长遍历每一层存放的地址指针,方能获得该句柄表中所有句柄表项。只不过在动态可扩展的三层表结构中,首先需要判断其真正的句柄表层数是多少,然后再根据该实际的句柄表层数执行相应个层的遍历。其中,在动态可扩展的三层表中,TableCode的后两位是判断句柄表层数的依据,后两位是00则是一层表结构,后两位是01则是两层表结构,后两位是10则是三层表结构。
[0098] 如上所述,在PspCidTable句柄表中,存放的是系统进程和线程的对象句柄。通过遍历能够获得基层表中记录的指向对象指针,但是该指针是指向对象体的,无法判断其是进程还是线程。故还需要通过偏移获取类型为_OBJECT_HEADER的、指向对象头的指针,并由对象头指针中读出其指针类型,方能确定指针指向的是进程还是线程。选出类型为进程的对象头指针,,通过所述进程对象头指针,既可以获得相应的进程。遍历该PspCidTable句柄表,直至找到所述Csrss.exe进程,即获得Csrss.exe进程对象的数据结构_EPROCESS。本实施例中通过如下方式判断对象头指针中类型为进程的指针类型信息,即通过PsGetCurrentProcess()或IoGetCurrentProcess()等函数获取当前进程,由该当前进程的对象体指针偏移获取其对象头指针;在该对象头指针中读取其指针类型信息。当然,若获取的当前进程恰恰是Csrss.exe进程,则无须再执行上述通过遍历获取Csrss.exe进程的步骤。
[0099] 上述列举了其中两种获取Csrss.exe进程的方法,但并非穷举。任何能够获取Csrss.exe进程的方法都能应用于本实施例中,例如背景技术中所描述的用于枚举进程的方法。
[0100] 请继续参看图1。步骤110,获取所述数据结构中的对象表指向的句柄表。
[0101] 其中,在所述Csrss.exe进程对象的数据结构_EPROCESS中由起始位置偏移固定的步长获取所述数据结构中的对象表指向的句柄表。所述的固定的步长根据windows操作系统的不同而不同。
[0102] 步骤120,遍历所述句柄表的所有句柄表项,获得每一句柄表项所指向的进程对象,进而获得每一进程对象所对应的进程;
[0103] 在Csrss.exe进程中,其中的句柄表为_Handle_Table结构,在windows2000系统中,其也为固定的三层表结构,TableCode中记录着三层表即一级表(一级表也称为基本表)、二级表和三级表的基地址。在上述的三层表中,上一级表中存放的地址指针指向与其临近的下一层地址,如三级表中存放的是指向二级表的指针,二级表中存放的是指向基本表的指针,在基本表中存放的才是指向进程对象的指针。
[0104] 而在windows xp和windows2003中,为了节省系统空间,采用了动态可扩展的三层表结构,当句柄数目较少时候仅仅采用基本表,当句柄数目较大时系统才会启用二级表,直至三级表。
[0105] 无论是上述的固定三层表结构还是动态可扩展的三层表结构,都需要根据每一层表的基地址按照固定的步长遍历每一层存放的地址指针,方能获得该句柄表中所有句柄表项。只不过在动态可扩展的三层表结构中,首先需要判断其真正的句柄表层数是多少,然后再根据该实际的句柄表层数执行相应个层的遍历。其中,在动态可扩展的三层表中,TableCode的后两位是判断句柄表层数的依据,后两位是00则是一层表结构,后两位是01则是两层表结构,后两位是10则是三层表结构。通过读取并判断句柄表中TableCode的后两位即可获得句柄表层数。
[0106] 若获取的句柄表层数为一层,则按照固定的步长遍历该层每一句柄表项,并根据每一句柄表项中的指向进程对象的成员指针,即可获取进程对象;
[0107] 若获取的句柄表层数大于一层时,则需要按照如下方式遍历各层:首先,获取句柄表中TableCode指针;将所述TableCode指针定位到句柄表最高层;接着由最高层按照固定步长遍历该层每一句柄表项;并获取每一句柄表项中的指向相邻下层句柄表项的成员指针;重复执行遍历每一层的句柄表项,直至最下层;并由该最下层的每一句柄表项中的指向进程对象的成员指针,获取进程对象。其中,每一层的基地址如上所述,可在TableCode中获得,这里不再赘述。
[0108] 通过遍历Csrss句柄表每一句柄表项,即可获得句柄记录在Csrss句柄表中的所有进程。
[0109] 步骤130,集合所获得的所有进程,形成系统当前进程表。
[0110] 本发明的上述实施例的方法中,首先获取微软客户端和服务端运行时子系统进程对象的数据结构,并获取其数据结构中的对象表这一数据项,进而获取该对象表指向的句柄表,遍历该句柄表即可获得句柄表项指向的系统所有的当前进程;由于windows系统中,每产生一个进程,都会将进程信息记录到所述的微软客户端和服务端运行时子系统进程对象的数据结构中;具体的,就是将进程对象的句柄记录到所述的句柄表中;因而,遍历该句柄表,即可获得系统的所有进程;也包括一些隐藏的进程;也就是说,即使有些进程从进程活动链表中删除,通过本发明的方法仍然能够枚举出该进程,使得一些恶意软件或者Rootkit无处藏身,有利于减少一些恶意的隐藏进程对系统的威胁。
[0111] 对于所述获得系统的进程中的至少一个进程,还可以按照该进程所在的SessionProcessLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
[0112] WINDBG中数据结构如下:
[0113] kd>dt_eprocess 81c2c6d8
[0114] nt!_EPROCESS
[0115] +0x0b0 VirtualSize:0x3933000
[0116] +0x0b4SessionProcessLinks:_LIST_ENTRY[0x81dfce54-0x81ec80d4][0117] 由上述结构可知,进程的SessionProcessLinks也是_LIST_ENTRY结构的环形双向链表,对于每一进程,通过遍历该SessionProcessLinks,均可得到一个进程的列表。对通过上述实施例的方法得到进程列表中的任一或多个进程,再通过SessionProcessLinks遍历,可得到一个或多个进程表,将获得的进程表与上述实施例中得到的进程表集合,并去除重复进程,即可得到更为完整的进程表。
[0118] 此外,对于所述获得系统的进程中的至少一个进程,按照该进程所在Vm.WorkingSetExpansionLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。其中,Vm.WorkingSetExpansionLinks遍历的原理同SessionProcessLinks遍历,这里不再赘述。
[0119] 此外,通过上述实施例获得进程列表,还可以继续执行如下的步骤:
[0120] I.将获取的当前进程表与Windows任务管理器的进程表比对;II.找出不同于Windows任务管理器的进程表中的进程;III.将所述找出的进程向用户发送提示消息或发送报警。也就是说,通过将本发明的实施例获得的进程表与前述背景技术中的方法所获得进程表进行比对,并将本发明的实施例的方法获得的进程表与背景技术中所获得的方法所不同的进程找出并提示用户或发出报警。用户可以根据该提示或报警对所找出的不同进程进一步分析,判断是否恶意进程。
[0121] 以上公开了本发明的一种用于枚举系统进程的方法的实施例,与此相应的,本发明还公开了一种用于枚举系统进程的装置。请参考图3,其为本发明的一种用于枚举系统进程的装置的一种实施例的示意图。由于该装置的实施例与前述的方法的实施例基本相同,下面仅简单描述本实施例中的装置。
[0122] 本实施例的一种用于枚举系统进程的装置包括:Csrss进程对象获取单元200,用于获取微软客户端和服务端运行时子系统进程对象的数据结构;句柄表获取单元210,用于获取所述数据结构中的对象表指向的句柄表;遍历单元220,用于遍历所述句柄表的所有句柄表项,获得每一句柄表项所指向的进程对象,进而获得每一进程对象所对应的进程;集合单元230,用于集合所获得的所有进程,形成系统当前进程表。
[0123] 可选的,所述进程对象获取单元包括:
[0124] 私有句柄表获取单元,用于获取当前进程的私有句柄表;
[0125] 第二遍历单元,用于遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程私有句柄表;
[0126] 执行单元,用于根据所述获得的其它进程的私有句柄表,获取私有句柄表所对应的进程对象的数据结构;直至获取所述微软客户端和服务端运行时子系统进程对象的数据结构为止。
[0127] 可选的,所述进程对象获取单元包括:
[0128] 进程和线程对象句柄表获取单元,用于获取系统进程和线程对象句柄表;
[0129] 第三遍历单元,用于遍历所述系统进程和线程对象句柄表中进程对象体指针指向的进程对象,获得相应的进程对象的数据结构,直至获取所述微软客户端和服务端运行时子系统进程对象的数据结构为止。
[0130] 可选的,所述遍历单元包括:
[0131] 句柄表层数获取单元,用于获取所述句柄表层数;
[0132] 遍历执行单元,用于根据句柄表层数遍历句柄表项,若获取的句柄表层数为一层,按照固定的步长遍历该层每一句柄表项,并根据每一句柄表项中的指向进程对象的成员指针,获取其进程对象;若获取的句柄表层数大于一层,则首先指向句柄表最高层,由最高层按照固定步长遍历该层每一句柄表项;并获取每一句柄表项中的指向相邻下层句柄表项的成员指针;重复执行遍历每一层的句柄表项,直至最下层;并由该最下层的每一句柄表项中的指向进程对象的成员指针,获取其进程对象。
[0133] 可选的,所述句柄表层数获取单元包括:
[0134] 读取单元,用于读取句柄表中TableCode值的后两位;
[0135] 判断单元,用于根据所述后两位判断句柄表层数。
[0136] 可选的,所述遍历执行单元还包括:
[0137] TableCode指针获取单元,用于获取句柄表中TableCode指针;
[0138] 定位单元,用于将所述TableCode指针定位到句柄表最高层。
[0139] 可选的,第四遍历单元,用于对于所述获得系统的进程中的至少一个进程,按照该进程所在的SessionProcessLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
[0140] 可选的,第五遍历单元,对于所述获得系统的进程中的至少一个进程,按照该进程所在Vm.WorkingSetExpansionLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
[0141] 可选的,对比单元,用于将获取的当前进程集合与Windows任务管理器的进程表比对;
[0142] 提取单元,用于找出不同于Windows任务管理器的进程表中的进程;
[0143] 报警单元,用于以所述找出的进程作为内容向用户发送或者向用户发送提示消息或报警。
[0144] 应用本发明实施例的装置可获得与上述方法实施例相同的技术效果,这里不再赘述。
[0145] 在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
[0146] 在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
[0147] 类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
[0148] 本领域那些技术人员可以理解,可以对实施例中的设备中的模进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
[0149] 此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
[0150] 本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的用于枚举系统进程的装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
[0151] 应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈