本发明专利技术公开了一种用于枚举系统进程的方法,包括:获取系统进程和线程对象句柄表;遍历所述系统进程和线程对象句柄表中进程对象体指针指向的进程对象,获得系统的进程;集合所获得的所有进程,形成系统进程集合。本发明专利技术还公开了一种用于枚举系统进程的装置。本发明专利技术能够枚举出系统所有的进程,包括隐藏的进程,有利于减少一些恶意的隐藏进程对系统的威胁。
【技术实现步骤摘要】
本专利技术涉及计算机
,特别是涉及一种用于枚举系统进程的方法。本专利技术还涉及一种用于枚举系统进程的装置。
技术介绍
Windows任务管理器可以枚举出系统当前的进程,并能够根据需要选择终止进程。为管理系统进程提供了很大的便利。Windows任务管理器枚举系统当前进程是通过其Native API函数ZwQuerySystemInfomation来操作进程活动链表来实现的。具体的过程如下 首先,获取当前任一进程的指针,例如可以通过PsGetCurrentProcessO来获取当前进程的PEPR0CESS指针。然后定位到记录该当前进程与其它进程链接信息的Activelist处,具体的操作方式为ActiveList = pCurrentEprocess+0x88,即当前进程指针移动一定的步长。其中0x88为winxp sp3下Activelist与pCurrentEprocess的步长,在不同win操作系统时该步长并不相同。接着,以所定位的当前进程的Activelist遍历整个进程活动链表(Activelistlink)上每一进程的数据结构,即可获得当前的存在于进程活动链表的所有进程。如上所述,因为windows任务管理器是基于ZwQuerySystemInformation来实现的,所以如果将进程对象从进程活动链表中移除,那么调用NtQuerySystemInfomation来枚举进程的任务管理器TaskMgr. exe中就不会看到目标进程了。同时,Windows的任务调度分配器使用的另一的数据结构,也就是说,进程是否被调度执行与进程活动链表无关,不会因为从进程活动链表删除就被CPU忽略,因此进程仍然会被执行。这很容易被一些恶意软件或者RootKit程序利用,在进程活动链表上不显示其存在,但是仍然被执行,这可能导致用户的计算机在不知不觉中被感染病毒、植入木马或者窃取了信息,对计算机造成潜在的或现实的威胁。因而有必要能够查找出这种被进程活动链表忽略而实质上又在被执行的隐藏进程。
技术实现思路
鉴于上述问题,提出了本专利技术以便提供一种克服上述问题或者至少部分地解决上述问题的用于枚举系统进程的方法和相应的用于枚举系统进程的装置。依据本专利技术的一个方面,提供了一种用于枚举系统进程的方法,包括获取系统进程和线程对象句柄表;遍历所述系统进程和线程对象句柄表中进程对象体指针指向的进程对象,获得系统的进程;集合所获得的所有进程,形成系统进程集合。可选的,所述获取系统进程和线程对象句柄表包括获取内核进程控制区域地址;将内核进程控制区域地址偏移固定的步长获取系统进程和线程对象句柄表地址;根据其地址获取系统进程和线程对象句柄表可选的,所述获取系统进程和线程对象句柄表包括通过系统进程和线程对象句柄表的函数中特征搜索定位系统进程和线程对象句柄表。可选的,所述特征搜索的特征串包括0x35ff和0x8e。可选的,所述遍历所述系统进程和线程对象句柄表中进程对象体指针指向的进程对象包括 在所述进程和线程对象句柄表中获取所有对象体指针;在所述所有对象体指针中获取进程对象头指针;遍历所述进程对象头指针指向的进程对象,获取所有进程。可选的,所述在所述进程和线程对象句柄表中获取对象体指针包括获取所述句柄表层数;若获取的句柄表层数为一层,按照固定的步长遍历该层每一句柄表项,获取每一句柄表项中的指向进程对象的对象体指针地址;若获取的句柄表层数大于一层,则首先指向句柄表最高层,由最高层按照固定步长遍历该层每一句柄表项;并获取每一句柄表项中的指向相邻下层句柄表项的成员指针;重复执行遍历每一层的句柄表项,直至最下层;并由该最下层的每一句柄表项中的指向进程对象的对象体指针地址;由所述对象体指针地址获取对象体指针。可选的,所述在所述所有对象体指针中获取进程对象头指针包括由对象体指针偏移一定步长获取相应的对象头指针;在所述对象头指针中读取其指针类型信息;选出所有类型为进程的对象头指针。可选的,所述获取所述句柄表层数包括读取进程和线程对象句柄表中tablecode值的后两位值;根据所述后两位值判断句柄表层数。可选的,所述所述首先指向句柄表最高层包括获取句柄表中TableCode指针;将所述TableCode指针定位到句柄表最高层。可选的,所述选出所有类型为进程的对象头指针包括选取当前任一进程,并取得其对象体指针;由该当前进程的对象体指针偏移获取其对象头指针;在该对象头指针中读取其指针类型信息;选取所有与所述指针类型信息相同的对象头指针。可选的,还包括对于所述获得系统的进程中的至少一个进程,按照该进程所在的SessionProcessLinks链表再做遍历,并将获得的进程表与所述获得系统的进程集合合并。可选的,还包括对于所述获得系统的进程中的至少一个进程,按照该进程所在Vm. WorkingSetExpansionLinks链表再做遍历,并将获得的进程表与所述获得系统的进程 口口 O可选的,还包括将获取的当前进程集合与Windows任务管理器的进程表比对;找出不同于Windows任务管理器的进程表中的进程;以所述找出的进程作为内容向用户发送或者向用户发送提示消息或报警。 根据本专利技术的另一方面,还提供一种用于枚举系统进程的装置,包括句柄表获取单元,用于获取系统进程和线程对象句柄表;遍历执行单元,用于遍历所述系统进程和线程对象句柄表中进程对象体指针指向的进程对象,获得系统的进程;集合单元,集合所获得的所有进程,形成系统进程集合。可选的,所述句柄表获取单元包括地址获取单元,用于获取内核进程控制区域地址;偏移单元,用于将内核进程控制区域地址偏移固定的步长获取系统进程和线程对象句柄表地址;根据其地址获取系统进程和线程对象句柄表可选的,所述句柄表获取单元包括搜索定位单元,用于通过系统进程和线程对象句柄表的函数中特征搜索定位系统进程和线程对象句柄表。可选的,所述遍历执行单元包括对象体指针获取单元,用于在所述进程和线程对象句柄表中获取所有对象体指针;进程对象体指针获取单元,用于在所述所有对象体指针中获取进程对象头指针;执行单元,用于遍历所述进程对象头指针指向的进程对象,获取所有进程。可选的,所述对象体指针获取单元,包括句柄表层数获取单元,用于获取所述句柄表层数;遍历执行单元,用于根据句柄表层数遍历句柄表项,若获取的句柄表层数为一层,按照固定的步长遍历该层每一句柄表项,并获取每一句柄表项中的指向进程对象的对象体指针地址;若获取的句柄表层数大于一层,则首先指向句柄表最高层,由最高层按照固定步长遍历该层每一句柄表项;并获取每一句柄表项中的指向相邻下层句柄表项的成员指针;重复执行遍历每一层的句柄表项,直至最下层;并由该最下层的每一句柄表项中的指向进程对象的对象体指针地址;对象体指针提取单元,用于由该对象体指针地址获取对象体指针。可选的,所述进程对象头指针获取单元,包括对象头指针获取单元,用于由对象体指针偏移一定步长获取相应的对象头指针;指针类型提取单元,用于在所述对象头指针中读取其指针类型信息;选择单元,用于选出所有类型为进程的对象头指针,与该对象头指针相应的对象体指针即为向进程对象头指针。可选的,所述句柄表层数获取单元,包括读取单元,用于读取进程和线程对象句柄表中tablecod本文档来自技高网...
【技术保护点】
一种用于枚举系统进程的方法,其特征在于,包括:获取系统进程和线程对象句柄表;遍历所述系统进程和线程对象句柄表中进程对象体指针指向的进程对象,获得系统的进程;集合所获得的所有进程,形成系统进程集合。
【技术特征摘要】
【专利技术属性】
技术研发人员:张辉,
申请(专利权)人:北京奇虎科技有限公司,奇智软件北京有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。