发明内容
鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的用于枚举系统进程的方法和相应的用于枚举系统进程的装置。
依据本发明的一个方面,提供了一种用于枚举系统进程的方法,包括:
获取当前进程的私有句柄表;
遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程私有句柄表;
根据所述获得的其它进程的私有句柄表,获取每一私有句柄表所对应的进程;
集合所获得的所有进程,形成系统进程集合。
可选的,所述获取该当前进程的私有句柄表包括:
获取指向当前进程的指针;
由所述当前进程的指针偏移获得当前进程的私有句柄表指针;
根据所述当前进程的私有句柄表指针定位到该当前进程的私有句柄表。
可选的,所述获取指向当前进程的指针包括:
通过PsGetCurrentProcess()或IoGetCurrentProcess()获得当前进程的指针。
可选的,所述由所述当前进程的指针偏移获得当前进程的私有句柄表指针的步骤中,偏移的步长由win系统版本决定。
可选的,所述遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程私有句柄表包括:
记录所述当前进程的私有句柄表的地址;
由该当前进程的私有句柄表指针偏移获取私有句柄表链上相邻进程的私有句柄表;
判断偏移后进程的私有句柄表地址是否与记录的当前进程的私有句柄表的地址相同;若是,终止遍历;
若否,按照与前述偏移相同的方向继续执行指针偏移获取私有句柄表链上的其它进程私有句柄表;直到偏移后获得进程私有句柄表地址与记录的当前进程私有句柄表的地址相同为止。
可选的,所述偏移的步长根据win系统的版本而确定。
可选的,还包括:对于所述获得系统的进程中的至少一个进程,按照该进程所在的SessionProcessLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
可选的,还包括:对于所述获得系统的进程中的至少一个进程,按照该进程所在Vm.WorkingSetExpansionLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
可选的,还包括如下步骤:
将获取的当前进程集合与Windows任务管理器的进程表比对;
找出不同于Windows任务管理器的进程表中的进程;
将所述找出的进程向用户发送提示消息或发送报警。
根据本发明的另一方面,还提供一种用于枚举系统进程的装置,包括:
句柄表获取单元,用于获取该当前进程的私有句柄表;
遍历单元,用于遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程私有句柄表;
执行单元,用于根据所述获得的其它进程的私有句柄表,获取每一私有句柄表所对应的进程;
集合单元,用于集合所获得的所有进程,形成系统进程集合。
可选的,所述句柄表获取单元包括:
进程指针获取单元,用于获取指向当前进程的指针;
句柄表指针获取单元,用于由所述当前进程的指针偏移获得当前进程的私有句柄表指针;
定位单元,用于根据所述当前进程的私有句柄表指针定位到该当前进程的私有句柄表
可选的,所述遍历单元包括:
记录单元,用于记录所述当前进程的私有句柄表的地址;
偏移单元,用于由该当前进程的私有句柄表指针偏移获取私有句柄表链上相邻进程的私有句柄表;
判断单元,用于判断偏移后进程的私有句柄表地址是否与记录的当前进程的私有句柄表的地址相同;若是,终止遍历;
若否,返回所述偏移单元;直到偏移后获得进程私有句柄表地址与记录的当前进程私有句柄表的地址相同为止。
可选的,还包括:
第二遍历单元,用于对于所述获得系统的进程中的至少一个进程,按照该进程所在的SessionProcessLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
可选的,还包括:
第三遍历单元,用于对于所述获得系统的进程中的至少一个进程,按照该进程所在Vm.WorkingSetExpansionLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
可选的,还包括:
对比单元,用于将获取的当前进程集合与Windows任务管理器的进程表比对;
提取单元,用于找出不同于Windows任务管理器的进程表中的进程;报警单元,用于将所述找出的进程向用户发送提示消息或发送报警。
根据本发明提供的具体实施例,本发明公开了以下技术效果:本发明的方法中,通过遍历进程的私有句柄表链获得私有句柄表对应的进程;由于任何进程都会有自己的私有句柄表,而且所有进程的私有句柄表链会链接在一起,形成双向链表,只要遍历该双向链表,即可获得所有的进程;包括一些隐藏的进程;也就是说,即使有些进程从进程活动链表中删除,通过本发明的方法仍然能够枚举出该进程,使得一些恶意软件或者Rootkit无处藏身,有利于减少一些恶意的隐藏进程对系统的威胁。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
请参考图1,其为本发明的一种用于枚举系统进程的实施例的流程图。本实施例中,包括如下步骤:
步骤100,获取当前进程的私有句柄表。
在windows系统中,每一个进程都有一个句柄表(handletable),该句柄表称为进程的私有句柄表。所述进程的私有句柄表是一个_HANDLE_TABLE结构,系统中所有进程的私有句柄表以双向链表的形式链接在一起。故若获取当前进程的私有句柄表,并按照一定的步长遍历所述双向链表,即可获得系统中所有的进程。
所述获取当前进程的私有句柄表的一种具体实现方式如下:a,获取指向当前进程的指针;b,由所述当前进程的指针偏移获得当前进程的私有句柄表指针;c,根据所述当前进程的私有句柄表指针定位到该当前进程的私有句柄表。
具体而言,可以通过PsGetCurrentProcess()或IoGetCurrentProcess()获得当前进程的指针。在windows系统中,由于受调度资源的限制,同一进程在执行时也会被划分到不同的时间段部分的执行,不同的进程在执行时穿插在一起,固在某一时间区间内,可能有多个进程在同时进行。而在某一时间点上,在多数情形正在执行的是一个进程(当然也不排除在包括中央处理单元、内存等系统资源充裕的情况下,两个或两个以上的进程并行运行)。通过所述PsGetCurrentProcess()或IoGetCurrentProcess()函数即可得到在调用函数时刻指向正在运行的进程的指针,即指向当前进程的进程结构体_EPROCESS的指针pCurrentProcess。本实施例中当前进程即指调用所述函数时刻正在运行的进程。所述获得的当前进程可以是windows系统中的任何进程,
在获得指向当前任一进程的指针pCurrentProcess后,将所述指针偏移固定的步长,可得到该当前任一进程的私有句柄表。以windows XP为例,指向当前进程的指针pCurrentProcess偏移0xc4(十六进制),即可得到所述当前进程的私有句柄表,即
pHandleTable=pCurrentProcess+0xc4,
需要说明的是,在windows XP中,对于任何的进程而言,指针pCurrentProcess与私有句柄表之间的偏移步长均为0xc4(十六进制)。在其它不同版本的window系统中,例如window2000、vista、win7等,偏移步长则有所不同,本领域技术人员可以根据各个windows的版本获得相应的步长。
根据所述当前进程的私有句柄表指针即可定位到该当前进程的私有句柄表。
步骤110,遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程私有句柄表。
如前所述,windows系统中,系统中所有进程的私有句柄表以双向链表的形式链接在一起。如图2所示,其为多个进程的进程结构体通过其私有句柄表形成句柄表链的示意图。进程的私有句柄表为_HANDLE_TABLE结构,对于任一句柄表,由pHandleTable偏移0xlc(十六进制)即可指向其类型为_LIST_ENTRY的成员变量HandleTableList,即句柄表链。每一个HandleTableList都具有Flink和Blink两个成员,Flink成员是一个向前链接,指向下一个LIST_ENTRY结构;Blink成员则是一个向后链接,指向前一个LIST_ENTRY结构。整个链表形成封闭环形,也就是说,最后一个Flink指向链表中的第一个LIST_ENTRY结构,而第一个Blink则指向最后一个。由图2可以看出,系统内所有进程的句柄表都是通过_LIST_ENTRY类型的双向链表链接起来的。故按照一定的步长遍历该双向链表,即可获得系统中所有的进程。
本步骤的遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程私有句柄表的具体实施方法如下:
A、记录所述当前进程的私有句柄表的地址;B、由该当前进程的私有句柄表指针偏移获取私有句柄表链上相邻进程的私有句柄表;C、判断偏移后进程的私有句柄表地址是否与记录的当前进程的私有句柄表的地址相同;若是,终止遍历;D、若否,按照与前述偏移相同的方向继续执行指针偏移获取私有句柄表链上的其它进程私有句柄表;直到偏移后获得进程私有句柄表地址与记录的当前进程私有句柄表的地址相同为止。
具体而言,如果要遍历整个链表,它需要保存第一个(或者当前)HandleTableList的地址,用于以判断是否已遍历了整个链表。向前或者向后偏移一定的步长(所述偏移的步长根据win系统的版本而确定,这里不再赘述)获得相邻的HandleTableList,进而获得其所在的私有句柄表。并判断该相邻的HandleTableList的地址是否与之前记录的第一个HandleTableList的地址相同,若相同,表明遍历已经完成,则终止遍历,若否,继续按照与前述相同偏移相同的方向偏移相同的步长,并在此判断所得到的HandleTableList的地址,直至偏移获得的HandleTableList的地址与第一个相同,即表明完成了整个链表的遍历。其中,每一次偏移获得的HandleTableList的地址偏移-0x1c(十六进制)即可获得其所在的私有句柄表的pHandleTable。
步骤120根据所述获得的其它进程的私有句柄表,获取每一私有句柄表所对应的进程;
遍历完成整个双向链表之后,即可得到链表上所有的私有句柄表。对于任一私有句柄表,通过遍历已经获得了其成员变量HandleTableList的地址。在句柄表中,pHandleTable偏移0x04处,结构成员为指向该句柄表所在进程结构体的指针,也就是说,在获得HandleTableList的地址后,通过地址偏移即可找到其所在进程结构体的指针,进而能够得到该进程结构体,也就是找到了该进程。系统的所有进程均可以通过如上所述的方式而获得。
步骤130,集合所获得的所有进程,形成系统进程表。
本发明的上述实施例的方法中,通过遍历进程的私有句柄表链获得私有句柄表对应的进程;由于任何进程都会有自己的私有句柄表,而且所有进程的私有句柄表链会链接在一起,形成双向链表,只要遍历该双向链表,即可获得所有的进程;包括一些隐藏的进程;也就是说,即使有些进程从进程活动链表中删除,通过本发明的方法仍然能够枚举出该进程,使得一些恶意软件或者Rootkit无处藏身,有利于减少一些恶意的隐藏进程对系统的威胁。
对于所述获得系统的进程中的至少一个进程,还可以按照该进程所在的SessionProcessLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
WINDBG中数据结构如下:
kd>dt_eprocess 81c2c6d8
nt!_EPROCESS
+0x0b0 VirtualSize:0x3933000
+0x0b4 SessionProcessLinks:_LIST_ENTRY[0x81dfce54-0x81ec80d4]
由上述结构可知,进程的SessionProcessLinks也是_LIST_ENTRY结构的环形双向链表,对于每一进程,通过遍历该SessionProcessLinks,均可得到一个进程的列表。对通过上述实施例的方法得到进程列表中的任一或多个进程,再通过SessionProcessLinks遍历,可得到一个或多个进程表,将获得的进程表与上述实施例中得到的进程表集合,并去除重复进程,即可得到更为完整的进程表。
此外,对于所述获得系统的进程中的至少一个进程,按照该进程所在Vm.WorkingSetExpansionLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。其中,Vm.WorkingSetExpansionLinks遍历的原理同SessionProcessLinks遍历,这里不再赘述。
通过上述实施例获得进程列表,还可以继续执行如下的步骤:
I.将获取的当前进程表与Windows任务管理器的进程表比对;II.找出不同于Windows任务管理器的进程表中的进程;III.将所述找出的进程向用户发送提示消息或发送报警。也就是说,通过将本发明的实施例获得的进程表与前述背景技术中的方法所获得进程表进行比对,并将本发明的实施例的方法获得的进程表与背景技术中所获得的方法所不同的进程找出并提示用户或发出报警。用户可以根据该提示或报警对所找出的不同进程进一步分析,判断是否恶意进程。
以上公开了本发明的一种用于枚举系统进程的方法的实施例,与此相应的,本发明还公开了一种用于枚举系统进程的装置。请参靠图3,其为本发明的一种用于枚举系统进程的装置的一种实施例的示意图。由于该装置的实施例与前述的方法的实施例基本相同,下面仅简单描述本实施例中的装置。
本实施例的一种用于枚举系统进程的装置包括:
句柄表获取单元200,用于获取该当前进程的私有句柄表;遍历单元210,用于遍历该当前进程的私有句柄表与其它进程的私有句柄表形成的句柄表链,获得其它进程私有句柄表;执行单元220,用于根据所述获得的其它进程的私有句柄表,获取每一私有句柄表所对应的进程;集合单元230,用于集合所获得的所有进程,形成系统进程集合。
可选的,所述句柄表获取单元200包括:进程指针获取单元,用于获取指向当前进程的指针;句柄表指针获取单元,用于由所述当前进程的指针偏移获得当前进程的私有句柄表指针;定位单元,用于根据所述当前进程的私有句柄表指针定位到该当前进程的私有句柄表
可选的,所述遍历单元210包括:记录单元,用于记录所述当前进程的私有句柄表的地址;偏移单元,用于由该当前进程的私有句柄表指针偏移获取私有句柄表链上相邻进程的私有句柄表;判断单元,用于判断偏移后进程的私有句柄表地址是否与记录的当前进程的私有句柄表的地址相同;若是,终止遍历;若否,返回所述偏移单元;直到偏移后获得进程私有句柄表地址与记录的当前进程私有句柄表的地址相同为止。
可选的,本实施例的装置还包括:第二遍历单元,用于对于所述获得系统的进程中的至少一个进程,按照该进程所在的SessionProcessLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
可选的,本实施例的装置还包括:第三遍历单元,用于对于所述获得系统的进程中的至少一个进程,按照该进程所在Vm.WorkingSetExpansionLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。
可选的,本实施例的装置还包括:对比单元,用于将获取的当前进程表与Windows任务管理器的进程表比对;提取单元,用于找出不同于Windows任务管理器的进程表中的进程;报警单元,用于将所述找出的进程向用户发送提示消息或发送报警。
应用本发明实施例的装置可获得与上述方法实施例相同的技术效果,这里不再赘述。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的用于枚举系统进程的装置中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。