專利名稱::一種用于枚舉系統(tǒng)進程的方法及裝置的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及計算機
技術(shù)領(lǐng)域:
,特別是涉及一種用于枚舉系統(tǒng)進程的方法。本發(fā)明還涉及一種用于枚舉系統(tǒng)進程的裝置。
背景技術(shù):
:Windows任務(wù)管理器可以枚舉出系統(tǒng)當(dāng)前的進程,并能夠根據(jù)需要選擇終止進程。為管理系統(tǒng)進程提供了很大的便利。Windows任務(wù)管理器枚舉系統(tǒng)當(dāng)前進程是通過其NativeAPI函數(shù)ZwQuerySystemInfomation來操作進程活動鏈表來實現(xiàn)的。具體的過程如下首先,獲取當(dāng)前任一進程的指針,例如可以通過PsGetCurrentProcessO來獲取當(dāng)前進程的PEPR0CESS指針。然后定位到記錄該當(dāng)前進程與其它進程鏈接信息的Activelist處,具體的操作方式為ActiveList=pCurrentEprocess+0x88,即當(dāng)前進程指針移動一定的步長。其中0x88為winxpsp3下Activelist與pCurrentEprocess的步長,在不同win操作系統(tǒng)時該步長并不相同。接著,以所定位的當(dāng)前進程的Activelist遍歷整個進程活動鏈表(Activelistlink)上每一進程的數(shù)據(jù)結(jié)構(gòu),即可獲得當(dāng)前的存在于進程活動鏈表的所有進程。如上所述,因為windows任務(wù)管理器是基于ZwQuerySystemInformation來實現(xiàn)的,所以如果將進程對象從進程活動鏈表中移除,那么調(diào)用NtQuerySystemInfomation來枚舉進程的任務(wù)管理器TaskMgr.exe中就不會看到目標(biāo)進程了。同時,Windows的任務(wù)調(diào)度分配器使用的另一的數(shù)據(jù)結(jié)構(gòu),也就是說,進程是否被調(diào)度執(zhí)行與進程活動鏈表無關(guān),不會因為從進程活動鏈表刪除就被CPU忽略,因此進程仍然會被執(zhí)行。這很容易被一些惡意軟件或者RootKit程序利用,在進程活動鏈表上不顯示其存在,但是仍然被執(zhí)行,這可能導(dǎo)致用戶的計算機在不知不覺中被感染病毒、植入木馬或者竊取了信息,對計算機造成潛在的或現(xiàn)實的威脅。因而有必要能夠查找出這種被進程活動鏈表忽略而實質(zhì)上又在被執(zhí)行的隱藏進程。
發(fā)明內(nèi)容鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的用于枚舉系統(tǒng)進程的方法和相應(yīng)的用于枚舉系統(tǒng)進程的裝置。依據(jù)本發(fā)明的一個方面,提供了一種用于枚舉系統(tǒng)進程的方法,包括獲取系統(tǒng)進程和線程對象句柄表;遍歷所述系統(tǒng)進程和線程對象句柄表中進程對象體指針指向的進程對象,獲得系統(tǒng)的進程;集合所獲得的所有進程,形成系統(tǒng)進程集合。可選的,所述獲取系統(tǒng)進程和線程對象句柄表包括獲取內(nèi)核進程控制區(qū)域地址;將內(nèi)核進程控制區(qū)域地址偏移固定的步長獲取系統(tǒng)進程和線程對象句柄表地址;根據(jù)其地址獲取系統(tǒng)進程和線程對象句柄表可選的,所述獲取系統(tǒng)進程和線程對象句柄表包括通過系統(tǒng)進程和線程對象句柄表的函數(shù)中特征搜索定位系統(tǒng)進程和線程對象句柄表??蛇x的,所述特征搜索的特征串包括0x35ff和0x8e。可選的,所述遍歷所述系統(tǒng)進程和線程對象句柄表中進程對象體指針指向的進程對象包括在所述進程和線程對象句柄表中獲取所有對象體指針;在所述所有對象體指針中獲取進程對象頭指針;遍歷所述進程對象頭指針指向的進程對象,獲取所有進程??蛇x的,所述在所述進程和線程對象句柄表中獲取對象體指針包括獲取所述句柄表層數(shù);若獲取的句柄表層數(shù)為一層,按照固定的步長遍歷該層每一句柄表項,獲取每一句柄表項中的指向進程對象的對象體指針地址;若獲取的句柄表層數(shù)大于一層,則首先指向句柄表最高層,由最高層按照固定步長遍歷該層每一句柄表項;并獲取每一句柄表項中的指向相鄰下層句柄表項的成員指針;重復(fù)執(zhí)行遍歷每一層的句柄表項,直至最下層;并由該最下層的每一句柄表項中的指向進程對象的對象體指針地址;由所述對象體指針地址獲取對象體指針。可選的,所述在所述所有對象體指針中獲取進程對象頭指針包括由對象體指針偏移一定步長獲取相應(yīng)的對象頭指針;在所述對象頭指針中讀取其指針類型信息;選出所有類型為進程的對象頭指針??蛇x的,所述獲取所述句柄表層數(shù)包括讀取進程和線程對象句柄表中tablecode值的后兩位值;根據(jù)所述后兩位值判斷句柄表層數(shù)??蛇x的,所述所述首先指向句柄表最高層包括獲取句柄表中TableCode指針;將所述TableCode指針定位到句柄表最高層??蛇x的,所述選出所有類型為進程的對象頭指針包括選取當(dāng)前任一進程,并取得其對象體指針;由該當(dāng)前進程的對象體指針偏移獲取其對象頭指針;在該對象頭指針中讀取其指針類型信息;選取所有與所述指針類型信息相同的對象頭指針。可選的,還包括對于所述獲得系統(tǒng)的進程中的至少一個進程,按照該進程所在的SessionProcessLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統(tǒng)的進程集合合并??蛇x的,還包括對于所述獲得系統(tǒng)的進程中的至少一個進程,按照該進程所在Vm.WorkingSetExpansionLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統(tǒng)的進程口口O可選的,還包括將獲取的當(dāng)前進程集合與Windows任務(wù)管理器的進程表比對;找出不同于Windows任務(wù)管理器的進程表中的進程;以所述找出的進程作為內(nèi)容向用戶發(fā)送或者向用戶發(fā)送提示消息或報警。根據(jù)本發(fā)明的另一方面,還提供一種用于枚舉系統(tǒng)進程的裝置,包括句柄表獲取單元,用于獲取系統(tǒng)進程和線程對象句柄表;遍歷執(zhí)行單元,用于遍歷所述系統(tǒng)進程和線程對象句柄表中進程對象體指針指向的進程對象,獲得系統(tǒng)的進程;集合單元,集合所獲得的所有進程,形成系統(tǒng)進程集合??蛇x的,所述句柄表獲取單元包括地址獲取單元,用于獲取內(nèi)核進程控制區(qū)域地址;偏移單元,用于將內(nèi)核進程控制區(qū)域地址偏移固定的步長獲取系統(tǒng)進程和線程對象句柄表地址;根據(jù)其地址獲取系統(tǒng)進程和線程對象句柄表可選的,所述句柄表獲取單元包括搜索定位單元,用于通過系統(tǒng)進程和線程對象句柄表的函數(shù)中特征搜索定位系統(tǒng)進程和線程對象句柄表。可選的,所述遍歷執(zhí)行單元包括對象體指針獲取單元,用于在所述進程和線程對象句柄表中獲取所有對象體指針;進程對象體指針獲取單元,用于在所述所有對象體指針中獲取進程對象頭指針;執(zhí)行單元,用于遍歷所述進程對象頭指針指向的進程對象,獲取所有進程??蛇x的,所述對象體指針獲取單元,包括句柄表層數(shù)獲取單元,用于獲取所述句柄表層數(shù);遍歷執(zhí)行單元,用于根據(jù)句柄表層數(shù)遍歷句柄表項,若獲取的句柄表層數(shù)為一層,按照固定的步長遍歷該層每一句柄表項,并獲取每一句柄表項中的指向進程對象的對象體指針地址;若獲取的句柄表層數(shù)大于一層,則首先指向句柄表最高層,由最高層按照固定步長遍歷該層每一句柄表項;并獲取每一句柄表項中的指向相鄰下層句柄表項的成員指針;重復(fù)執(zhí)行遍歷每一層的句柄表項,直至最下層;并由該最下層的每一句柄表項中的指向進程對象的對象體指針地址;對象體指針提取單元,用于由該對象體指針地址獲取對象體指針??蛇x的,所述進程對象頭指針獲取單元,包括對象頭指針獲取單元,用于由對象體指針偏移一定步長獲取相應(yīng)的對象頭指針;指針類型提取單元,用于在所述對象頭指針中讀取其指針類型信息;選擇單元,用于選出所有類型為進程的對象頭指針,與該對象頭指針相應(yīng)的對象體指針即為向進程對象頭指針。可選的,所述句柄表層數(shù)獲取單元,包括讀取單元,用于讀取進程和線程對象句柄表中tablecode值的后兩位值;判斷單元,用于根據(jù)所述后兩位值判斷句柄表層數(shù)??蛇x的,所述遍歷執(zhí)行單元還包括TableCode指針獲取單元,用于獲取句柄表中TableCode指針;定位單元,用于將所述TableCode指針定位到句柄表最高層??蛇x的,所述選擇單元,包括當(dāng)前進程獲取單元,用于選取當(dāng)前任一進程,并取得其對象體指針;對象頭指針獲取單元,用于由該當(dāng)前進程的對象體指針偏移獲取其對象頭指針;指針類型提取單元,用于在該對象頭指針中讀取其指針類型信息;選擇執(zhí)行單元,用于選取所有與所述指針類型信息相同的對象頭指針??蛇x的,還包括第二遍歷執(zhí)行單元,用于對于所述獲得系統(tǒng)的進程中的至少一個進程,按照該進程所在的SessionPiOcessLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統(tǒng)的進程口口O可選的,還包括第三遍歷執(zhí)行單元,用于對于所述獲得系統(tǒng)的進程中的至少一個進程,按照該進程所在Vm.WorkingSetExpansionLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統(tǒng)的進程集合合并??蛇x的,還包括對比單元,用于將獲取的當(dāng)前進程集合與Windows任務(wù)管理器的進程表比對;提取單元,用于找出不同于Windows任務(wù)管理器的進程表中的進程;報警單元,用于以所述找出的進程作為內(nèi)容向用戶發(fā)送或者向用戶發(fā)送提示消息或報警。根據(jù)本發(fā)明提供的具體實施例,本發(fā)明公開了以下技術(shù)效果本發(fā)明的方法中,通過獲取系統(tǒng)進程和線程對象句柄表(pspCidTable),并遍歷該表中進程對象體指針指向的進程對象來獲取系統(tǒng)的進程;由于在pspCidTable中保存了系統(tǒng)所有進程和線程的對象指針,而且該對象指針指向?qū)ο篌w,因而只要挑選出所有的進程對象體指針并遍歷其指向的進行對象,即可獲取所有的進程,包括隱藏的進程;也就是說,即使有些進程從進程活動鏈表中刪除,通過本發(fā)明的方法仍然能夠枚舉出該進程,使得一些惡意軟件或者Rootkit無處藏身,有利于減少一些惡意的隱藏進程對系統(tǒng)的威脅。上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點能夠更明顯易懂,以下特舉本發(fā)明的具體實施方式。通過閱讀下文優(yōu)選實施方式的詳細描述,各種其他的優(yōu)點和益處對于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實施方式的目的,而并不認(rèn)為是對本發(fā)明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中圖I為本發(fā)明的用于枚舉系統(tǒng)進程的方法的實施例的流程圖;圖2為本發(fā)明的一種用于枚舉系統(tǒng)進程的裝置的一種實施例的示意圖。具體實施例方式下面將參照附圖更詳細地描述本公開的示例性實施例。雖然附圖中顯示了本公開的示例性實施例,然而應(yīng)當(dāng)理解,可以以各種形式實現(xiàn)本公開而不應(yīng)被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達給本領(lǐng)域的技術(shù)人員。請參考圖1,其為本發(fā)明的用于枚舉系統(tǒng)進程的方法的實施例的流程圖。步驟100,獲取系統(tǒng)進程和線程對象句柄表。具體而言,系統(tǒng)進程和線程對象句柄表(PspCidTable)是Windows系統(tǒng)中一種句柄表,其中存放的對象是系統(tǒng)中所有的進線程對象。因此只要能遍歷這個PspCidTable句柄表,就可以遍歷到系統(tǒng)的所有進程,包括所有隱藏進程。不難理解,若欲通過PspCidTable來獲取系統(tǒng)進程,則首先需要獲取PspCidTable,即定位到所述PspCidTablede的首地址。獲取所述PspCidTablede的方法有很多種,在這里列舉其中兩種。方法之一包括a,獲取內(nèi)核進程控制區(qū)域地址;b,將內(nèi)核進程控制區(qū)域地址偏移固定的步長獲取系統(tǒng)進程和線程對象句柄表地址;C,根據(jù)其地址獲取系統(tǒng)進程和線程對象句柄表。具體而言,首先獲取內(nèi)核進程控制區(qū)域(KernelProcessControlRegion,KPCR)的地址。在windows系統(tǒng)中,所述KPCR的地址為OxFFDFFOOO。且該地址一般不會隨windows的版本變動而變化。在所述KPCR的結(jié)構(gòu)中有KPRCB、內(nèi)核變量塊(KdVersionBlock)、TSS等信息。接著,在KPCR的地址OxFFDFFOOO基礎(chǔ)上偏移+0x34(0xFFDFF034)即可找到所述KdVersionBlocko其中,KdVersionBlock是一個結(jié)構(gòu)體指針,其對應(yīng)的結(jié)構(gòu)體是_DBGKD_GET_VERSI0N64o由這個結(jié)構(gòu)體_DBGKD_GET_VERSI0N64的起始位置偏移+0x80既可以獲得PspCidTable。方法之二通過函數(shù)PsLookupProcessThreadByCidO或者PsLookupProcessByProcessId()、PsLookupThreadByThreadIdO中特征搜索定位系統(tǒng)進程和線程對象句柄表。所謂內(nèi)存特征搜索是指調(diào)用這些函數(shù)的時候會用到PspCidTable,但是個系統(tǒng)中的PspCidTable出現(xiàn)的地方不同,可以根據(jù)PspCidTable前后的特征來實現(xiàn)搜索。其中,所述特征搜索的特征串在不同的操作系統(tǒng)下有可能不同,Win2000和Win2003中是0x35FF和0xe8,win7是0x3D8B和0xe8。當(dāng)然,還可以通過其它方式獲取PspCidTable,這里不再一一列舉。需要強調(diào)的是,任何能夠獲取PspCidTable的方法均可應(yīng)用于此,在本實施例中對此并無限制。步驟110,遍歷所述系統(tǒng)進程和線程對象句柄表中進程對象體指針指向的進程對象,獲得系統(tǒng)的進程。PspCidtable為_Handle_Table結(jié)構(gòu),在Windows2000系統(tǒng)中,其為固定的三層表結(jié)構(gòu),TableCode中記錄著三層表即一級表(一級表也稱為基本表,最表)、二級表和三級表(為最上層表)的基地址。在上述的三層表中,上一級表中存放的地址指針指向與其臨近的下一層地址,如三級表中存放的是指向二級表的指針,二級表中存放的是指向基本表的指針,在基本表中存放的才是指向進程對象或線程的指針。而在Windowsxp和Windows2003中,為了節(jié)省系統(tǒng)空間,采用了動態(tài)可擴展的三層表結(jié)構(gòu),當(dāng)句柄數(shù)目較少時候僅僅采用基本表,當(dāng)句柄數(shù)目較大時系統(tǒng)才會啟用二級表,直至三級表。無論是上述的固定三層表結(jié)構(gòu)還是動態(tài)可擴展的三層表結(jié)構(gòu),都需要根據(jù)每一層表的基地址按照固定的步長遍歷每一層存放的地址指針,方能獲得該句柄表中所有句柄表項。只不過在動態(tài)可擴展的三層表結(jié)構(gòu)中,首先需要判斷其真正的句柄表層數(shù)是多少,然后再根據(jù)該實際的句柄表層數(shù)執(zhí)行相應(yīng)個層的遍歷。具體過程如下A,首先獲取句柄表層數(shù);B,判斷句柄表層數(shù)為一層還是大于一層;若獲取的句柄表層數(shù)為一層,按照固定的步長遍歷該層每一句柄表項,獲取每一句柄表項中的指向進程對象的對象體指針地址;若獲取的句柄表層數(shù)大于一層,則首先指向句柄表最高層,由最高層按照固定步長遍歷該層每一句柄表項;并獲取每一句柄表項中的指向相鄰下層句柄表項的成員指針;重復(fù)執(zhí)行遍歷每一層的句柄表項,直至最下層;并由該最下層的每一句柄表項中的指向進程對象的對象體指針地址;C,由所述對象體指針地址獲取對象體指針。其中,在動態(tài)可擴展的三層表中,TableCode的后兩位是判斷句柄表層數(shù)的依據(jù),后兩位是00則是一層表結(jié)構(gòu),后兩位是01則是兩層表結(jié)構(gòu),后兩位是10則是二層表結(jié)構(gòu)。通過讀取進程和線程對象句柄表中tablecode值的后兩位值可以獲得句柄表層數(shù)。此外,在上述句柄表層數(shù)大于一層時,通過如下方式指向句柄表最高層獲取句柄表中TableCode指針;接著將所述TableCode指針定位到句柄表最高層。如上所述,在PspCidTable句柄表中,存放的是系統(tǒng)進程和線程的對象句柄。通過遍歷能夠獲得基層表中記錄的指向?qū)ο笾羔槪窃撝羔樖侵赶驅(qū)ο篌w的,無法判斷其是進程還是線程。故還需要通過偏移獲取類型為_0BJECT_HEADER的、指向?qū)ο箢^的指針,并由對象頭指針中讀出其指針類型,方能確定指針指向的是進程還是線程。選出類型為進程的對象頭指針,通過所述進程對象頭指針,既可以獲得相應(yīng)的進程。遍歷該PspCidTable句柄表,即可獲得該句柄表中記錄的所述進程,即獲得所有進程對象的數(shù)據(jù)結(jié)構(gòu)_EPR0CESS。本實施例中通過如下方式判斷對象頭指針中類型為進程的指針類型信息,即通過PsGetCurrentProcessO或IoGetCurrentProcessO等函數(shù)獲取當(dāng)前進程,由該當(dāng)前進程的對象體指針偏移獲取其對象頭指針;在該對象頭指針中讀取其指針類型信息。步驟S120,集合所獲得的所有進程,形成系統(tǒng)當(dāng)前進程集合。本發(fā)明的上述實施例中,通過獲取系統(tǒng)進程和線程對象句柄表(pspCidTable),并遍歷該表中進程對象體指針指向的進程對象來獲取系統(tǒng)的進程;由于在pspCidTable中保存了系統(tǒng)所有進程和線程的對象指針,而且該對象指針指向?qū)ο篌w,因而只要挑選出所有的進程對象體指針并遍歷其指向的進行對象,即可獲取所有的進程,包括隱藏的進程;也就是說,即使有些進程從進程活動鏈表中刪除,通過本發(fā)明的方法仍然能夠枚舉出該進程,使得一些惡意軟件或者Rootkit無處藏身,有利于減少一些惡意的隱藏進程對系統(tǒng)的威脅。對于所述獲得系統(tǒng)的進程中的至少一個進程,還可以按照該進程所在的SessionProcessLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統(tǒng)的進程集合合并。WINDBG中數(shù)據(jù)結(jié)構(gòu)如下kd>dt—eprocess81c2c6d8nt!—EPROCESS+OxObOVirtualSize0x3933000+0x0b4SessionProcessLinks:_LIST_ENTRY由上述結(jié)構(gòu)可知,進程的SessionProcessLinks也是_LIST_ENTRY結(jié)構(gòu)的環(huán)形雙向鏈表,對于每一進程,通過遍歷該SessionProcessLinks,均可得到一個進程的列表。對通過上述實施例的方法得到進程列表中的任一或多個進程,再通過SessionProcessLinks遍歷,可得到一個或多個進程表,將獲得的進程表與上述實施例中得到的進程表集合,并去除重復(fù)進程,即可得到更為完整的進程集合。此外,對于所述獲得系統(tǒng)的進程中的至少一個進程,按照該進程所在Vm.WorkingSetExpansionLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統(tǒng)的進程集合合并。其中,Vm.WorkingSetExpansionLinks遍歷的原理同SessionProcessLinks遍歷,這里不再贅述。此外,通過上述實施例獲得進程列集合,還可以繼續(xù)執(zhí)行如下的步驟I.將獲取的當(dāng)前進程集合與Windows任務(wù)管理器的進程表比對;II.找出不同于Windows任務(wù)管理器的進程表中的進程;III.將所述找出的進程向用戶發(fā)送提示消息或發(fā)送報警。也就是說,通過將本發(fā)明的實施例獲得的進程集合與前述
背景技術(shù):
中的方法所獲得進程表進行比對,并將本發(fā)明的實施例的方法獲得的進程集合與
背景技術(shù):
中所獲得的方法所不同的進程找出并提示用戶或發(fā)出報警。用戶可以根據(jù)該提示或報警對所找出的不同進程進一步分析,判斷是否惡意進程。以上公開了本發(fā)明的一種用于枚舉系統(tǒng)進程的方法的實施例,與此相應(yīng)的,本發(fā)明還公開了一種用于枚舉系統(tǒng)進程的裝置。請參考圖2,其為本發(fā)明的一種用于枚舉系統(tǒng)進程的裝置的一種實施例的示意圖。由于該裝置的實施例與前述的方法的實施例基本相同,下面僅簡單描述本實施例中的裝置。本實施例中,一種用于枚舉系統(tǒng)進程的裝置包括句柄表獲取單元200,用于獲取系統(tǒng)進程和線程對象句柄表;遍歷執(zhí)行單元210,用于遍歷所述系統(tǒng)進程和線程對象句柄表中進程對象體指針指向的進程對象,獲得系統(tǒng)的進程;集合單元220,集合所獲得的所有進程,形成系統(tǒng)當(dāng)前進程集合。可選的,所述句柄表獲取單元包括地址獲取單元,用于獲取內(nèi)核進程控制區(qū)域地址;偏移單元,用于將內(nèi)核進程控制區(qū)域地址偏移固定的步長獲取系統(tǒng)進程和線程對象句柄表地址;根據(jù)其地址獲取系統(tǒng)進程和線程對象句柄表可選的,所述句柄表獲取單元包括搜索定位單元,用于通過系統(tǒng)進程和線程對象句柄表的函數(shù)中特征搜索定位系統(tǒng)進程和線程對象句柄表??蛇x的,所述遍歷執(zhí)行單元包括對象體指針獲取單元,用于在所述進程和線程對象句柄表中獲取所有對象體指針;進程對象體指針獲取單元,用于在所述所有對象體指針中獲取進程對象頭指針;執(zhí)行單元,用于遍歷所述進程對象頭指針指向的進程對象,獲取所有進程??蛇x的,所述對象體指針獲取單元,包括句柄表層數(shù)獲取單元,用于獲取所述句柄表層數(shù);遍歷執(zhí)行單元,用于根據(jù)句柄表層數(shù)遍歷句柄表項,若獲取的句柄表層數(shù)為一層,按照固定的步長遍歷該層每一句柄表項,并獲取每一句柄表項中的指向進程對象的對象體指針地址;若獲取的句柄表層數(shù)大于一層,則首先指向句柄表最高層,由最高層按照固定步長遍歷該層每一句柄表項;并獲取每一句柄表項中的指向相鄰下層句柄表項的成員指針;重復(fù)執(zhí)行遍歷每一層的句柄表項,直至最下層;并由該最下層的每一句柄表項中的指向進程對象的對象體指針地址;對象體指針提取單元,用于由該對象體指針地址獲取對象體指針??蛇x的,所述進程對象頭指針獲取單元,包括對象頭指針獲取單元,用于由對象體指針偏移一定步長獲取相應(yīng)的對象頭指針;指針類型提取單元,用于在所述對象頭指針中讀取其指針類型信息;選擇單元,用于選出所有類型為進程的對象頭指針,與該對象頭指針相應(yīng)的對象體指針即為向進程對象頭指針??蛇x的,所述句柄表層數(shù)獲取單元,包括讀取單元,用于讀取進程和線程對象句柄表中tablecode值的后兩位值;判斷單元,用于根據(jù)所述后兩位值判斷句柄表層數(shù)。可選的,所述遍歷執(zhí)行單元還包括=TableCode指針獲取單元,用于獲取句柄表中TableCode指針;定位單元,用于將所述TableCode指針定位到句柄表最高層??蛇x的,所述選擇單元,包括當(dāng)前進程獲取單元,用于選取當(dāng)前任一進程,并取得其對象體指針;對象頭指針獲取單元,用于由該當(dāng)前進程的對象體指針偏移獲取其對象頭指針;指針類型提取單元,用于在該對象頭指針中讀取其指針類型信息;選擇執(zhí)行單元,用于選取所有與所述指針類型信息相同的對象頭指針。可選的,還包括第二遍歷執(zhí)行單元,用于對于所述獲得系統(tǒng)的進程中的至少一個進程,按照該進程所在的SessionProcessLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統(tǒng)的進程集合合并??蛇x的,還包括第三遍歷執(zhí)行單元,用于對于所述獲得系統(tǒng)的進程中的至少一個進程,按照該進程所在Vm.WorkingSetExpansionLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統(tǒng)的進程集合合并??蛇x的,本實施例的用于枚舉系統(tǒng)進程的裝置還包括對比單元,用于將獲取的當(dāng)前進程集合與Windows任務(wù)管理器的進程表比對;提取單元,用于找出不同于Windows任務(wù)管理器的進程表中的進程;報警單元,用于以所述找出的進程作為內(nèi)容向用戶發(fā)送或者向用戶發(fā)送提示消息或報警。應(yīng)用本發(fā)明實施例的裝置可獲得與上述方法實施例相同的技術(shù)效果,這里不再贅述。在此提供的算法和顯示不與任何特定計算機、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類系統(tǒng)所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對任何特定編程語言。應(yīng)當(dāng)明白,可以利用各種編程語言實現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對特定語言所做的描述是為了披露本發(fā)明的最佳實施方式。在此處所提供的說明書中,說明了大量具體細節(jié)。然而,能夠理解,本發(fā)明的實施例可以在沒有這些具體細節(jié)的情況下實踐。在一些實例中,并未詳細示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對本說明書的理解。類似地,應(yīng)當(dāng)理解,為了精簡本公開并幫助理解各個發(fā)明方面中的一個或多個,在上面對本發(fā)明的示例性實施例的描述中,本發(fā)明的各個特征有時被一起分組到單個實施例、圖、或者對其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖即所要求保護的本發(fā)明要求比在每個權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個實施例的所有特征。因此,遵循具體實施方式的權(quán)利要求書由此明確地并入該具體實施方式,其中每個權(quán)利要求本身都作為本發(fā)明的單獨實施例。本領(lǐng)域那些技術(shù)人員可以理解,可以對實施例中的設(shè)備中的模塊進行自適應(yīng)性地改變并且把它們設(shè)置在與該實施例不同的一個或多個設(shè)備中??梢园褜嵤├械哪K或單元或組件組合成一個模塊或單元或組件,以及此外可以把它們分成多個子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個特征可以由提供相同、等同或相似目的的替代特征來代替。此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實施例包括其它實施例中所包括的某些特征而不是其它特征,但是不同實施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實施例。例如,在下面的權(quán)利要求書中,所要求保護的實施例的任意之一都可以以任意的組合方式來使用。本發(fā)明的各個部件實施例可以以硬件實現(xiàn),或者以在一個或者多個處理器上運行的軟件模塊實現(xiàn),或者以它們的組合實現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實踐中使用微處理器或者數(shù)字信號處理器(DSP)來實現(xiàn)根據(jù)本發(fā)明實施例的用于枚舉系統(tǒng)的裝置中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計算機程序和計算機程序產(chǎn)品)。這樣的實現(xiàn)本發(fā)明的程序可以存儲在計算機可讀介質(zhì)上,或者可以具有一個或者多個信號的形式。這樣的信號可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號上提供,或者以任何其他形式提供。應(yīng)該注意的是上述實施例對本發(fā)明進行說明而不是對本發(fā)明進行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計出替換實施例。在權(quán)利要求中,不應(yīng)將位于括號之間的任何參考符號構(gòu)造成對權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個”不排除存在多個這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計算機來實現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個可以是通過同一個硬件項來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。權(quán)利要求1.一種用于枚舉系統(tǒng)進程的方法,其特征在于,包括獲取系統(tǒng)進程和線程對象句柄表;遍歷所述系統(tǒng)進程和線程對象句柄表中進程對象體指針指向的進程對象,獲得系統(tǒng)的進程;集合所獲得的所有進程,形成系統(tǒng)進程集合。2.根據(jù)權(quán)利要求I所述的用于枚舉系統(tǒng)進程的方法,其特征在于,所述獲取系統(tǒng)進程和線程對象句柄表包括獲取內(nèi)核進程控制區(qū)域地址;將內(nèi)核進程控制區(qū)域地址偏移固定的步長獲取系統(tǒng)進程和線程對象句柄表地址;根據(jù)其地址獲取系統(tǒng)進程和線程對象句柄表。3.根據(jù)權(quán)利要求I所述的用于枚舉系統(tǒng)進程的方法,其特征在于,所述獲取系統(tǒng)進程和線程對象句柄表包括通過系統(tǒng)進程和線程對象句柄表的函數(shù)中特征搜索定位系統(tǒng)進程和線程對象句柄表。4.根據(jù)權(quán)利要求3所述的用于枚舉系統(tǒng)進程的方法,其特征在于,所述特征搜索的特征串包括0x35ff和0x8e。5.根據(jù)權(quán)利要求I所述的用于枚舉系統(tǒng)進程的方法,其特征在于,所述遍歷所述系統(tǒng)進程和線程對象句柄表中進程對象體指針指向的進程對象包括在所述進程和線程對象句柄表中獲取所有對象體指針;在所述所有對象體指針中獲取進程對象頭指針;遍歷所述進程對象頭指針指向的進程對象,獲取所有進程。6.根據(jù)權(quán)利要求5所述的用于枚舉系統(tǒng)進程的方法,其特征在于,所述在所述進程和線程對象句柄表中獲取對象體指針包括獲取所述句柄表層數(shù);若獲取的句柄表層數(shù)為一層,按照固定的步長遍歷該層每一句柄表項,獲取每一句柄表項中的指向進程對象的對象體指針地址;若獲取的句柄表層數(shù)大于一層,則首先指向句柄表最高層,由最高層按照固定步長遍歷該層每一句柄表項;并獲取每一句柄表項中的指向相鄰下層句柄表項的成員指針;重復(fù)執(zhí)行遍歷每一層的句柄表項,直至最下層;并由該最下層的每一句柄表項中的指向進程對象的對象體指針地址;由所述對象體指針地址獲取對象體指針。7.根據(jù)權(quán)利要求5所述的用于枚舉系統(tǒng)進程的方法,其特征在于,所述在所述所有對象體指針中獲取進程對象頭指針包括由對象體指針偏移一定步長獲取相應(yīng)的對象頭指針;在所述對象頭指針中讀取其指針類型信息;選出所有類型為進程的對象頭指針。8.根據(jù)權(quán)利要求6所述的用于枚舉系統(tǒng)進程的方法,其特征在于,所述獲取所述句柄表層數(shù)包括讀取進程和線程對象句柄表中tablecode值的后兩位值;根據(jù)所述后兩位值判斷句柄表層數(shù)。9.根據(jù)權(quán)利要求6所述的用于枚舉系統(tǒng)進程的方法,其特征在于,所述所述首先指向句柄表最聞層包括獲取句柄表中TableCode指針;將所述TableCode指針定位到句柄表最高層。10.根據(jù)權(quán)利要求7所述的用于枚舉系統(tǒng)進程的方法,其特征在于,所述選出所有類型為進程的對象頭指針包括選取當(dāng)前任一進程,并取得其對象體指針;由該當(dāng)前進程的對象體指針偏移獲取其對象頭指針;在該對象頭指針中讀取其指針類型信息;選取所有與所述指針類型信息相同的對象頭指針。11.根據(jù)權(quán)利要求I所述的用于枚舉系統(tǒng)進程的方法,其特征在于還包括對于所述獲得系統(tǒng)的進程中的至少一個進程,按照該進程所在的SessionProcessLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統(tǒng)的進程集合合并。12.根據(jù)權(quán)利要求I所述的用于枚舉系統(tǒng)進程的方法,其特征在于還包括對于所述獲得系統(tǒng)的進程中的至少一個進程,按照該進程所在Vm.WorkingSetExpansionLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統(tǒng)的進程集合合并。13.根據(jù)權(quán)利要求I所述的用于枚舉系統(tǒng)進程的方法,其特征在于,還包括將獲取的當(dāng)前進程集合與Windows任務(wù)管理器的進程表比對;找出不同于Windows任務(wù)管理器的進程表中的進程;以所述找出的進程作為內(nèi)容向用戶發(fā)送或者向用戶發(fā)送提示消息或報警。14.一種用于枚舉系統(tǒng)進程的裝置,其特征在于,包括句柄表獲取單元,用于獲取系統(tǒng)進程和線程對象句柄表;遍歷執(zhí)行單元,用于遍歷所述系統(tǒng)進程和線程對象句柄表中進程對象體指針指向的進程對象,獲得系統(tǒng)的進程;集合單元,集合所獲得的所有進程,形成系統(tǒng)進程集合。15.根據(jù)權(quán)利要求14所述的用于枚舉系統(tǒng)進程的裝置,其特征在于,所述句柄表獲取單元包括地址獲取單元,用于獲取內(nèi)核進程控制區(qū)域地址;偏移單元,用于將內(nèi)核進程控制區(qū)域地址偏移固定的步長獲取系統(tǒng)進程和線程對象句柄表地址;根據(jù)其地址獲取系統(tǒng)進程和線程對象句柄表。16.根據(jù)權(quán)利要求14所述的用于枚舉系統(tǒng)進程的裝置,其特征在于,所述句柄表獲取單元包括搜索定位單元,用于通過系統(tǒng)進程和線程對象句柄表的函數(shù)中特征搜索定位系統(tǒng)進程和線程對象句柄表。17.根據(jù)權(quán)利要求14所述的用于枚舉系統(tǒng)進程的裝置,其特征在于,所述遍歷執(zhí)行單元包括對象體指針獲取單元,用于在所述進程和線程對象句柄表中獲取所有對象體指針;進程對象體指針獲取單元,用于在所述所有對象體指針中獲取進程對象頭指針;執(zhí)行單元,用于遍歷所述進程對象頭指針指向的進程對象,獲取所有進程。18.根據(jù)權(quán)利要求17所述的用于枚舉系統(tǒng)進程的裝置,其特征在于,所述對象體指針獲取單元,包括句柄表層數(shù)獲取單元,用于獲取所述句柄表層數(shù);遍歷執(zhí)行單元,用于根據(jù)句柄表層數(shù)遍歷句柄表項,若獲取的句柄表層數(shù)為一層,按照固定的步長遍歷該層每一句柄表項,并獲取每一句柄表項中的指向進程對象的對象體指針地址;若獲取的句柄表層數(shù)大于一層,則首先指向句柄表最高層,由最高層按照固定步長遍歷該層每一句柄表項;并獲取每一句柄表項中的指向相鄰下層句柄表項的成員指針;重復(fù)執(zhí)行遍歷每一層的句柄表項,直至最下層;并由該最下層的每一句柄表項中的指向進程對象的對象體指針地址;對象體指針提取單元,用于由該對象體指針地址獲取對象體指針。19.根據(jù)權(quán)利要求17所述的用于枚舉系統(tǒng)進程的裝置,其特征在于,所述進程對象頭指針獲取單元,包括對象頭指針獲取單元,用于由對象體指針偏移一定步長獲取相應(yīng)的對象頭指針;指針類型提取單元,用于在所述對象頭指針中讀取其指針類型信息;選擇單元,用于選出所有類型為進程的對象頭指針,與該對象頭指針相應(yīng)的對象體指針即為向進程對象頭指針。20.根據(jù)權(quán)利要求18所述的用于枚舉系統(tǒng)進程的裝置,其特征在于,所述句柄表層數(shù)獲取單元,包括讀取單元,用于讀取進程和線程對象句柄表中tablecode值的后兩位值;判斷單元,用于根據(jù)所述后兩位值判斷句柄表層數(shù)。21.根據(jù)權(quán)利要求18所述的用于枚舉系統(tǒng)進程的裝置,其特征在于,所述遍歷執(zhí)行單元還包括TableCode指針獲取單元,用于獲取句柄表中TableCode指針;定位單元,用于將所述TableCode指針定位到句柄表最高層。22.根據(jù)權(quán)利要求19所述的用于枚舉系統(tǒng)進程的裝置,其特征在于,所述選擇單元,包括當(dāng)前進程獲取單元,用于選取當(dāng)前任一進程,并取得其對象體指針;對象頭指針獲取單元,用于由該當(dāng)前進程的對象體指針偏移獲取其對象頭指針;指針類型提取單元,用于在該對象頭指針中讀取其指針類型信息;選擇執(zhí)行單元,用于選取所有與所述指針類型信息相同的對象頭指針。23.根據(jù)權(quán)利要求14所述的用于枚舉系統(tǒng)進程的裝置,其特征在于,還包括第二遍歷執(zhí)行單元,用于對于所述獲得系統(tǒng)的進程中的至少一個進程,按照該進程所在的SessionProcessLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統(tǒng)的進程集合I=ITTO24.根據(jù)權(quán)利要求14所述的用于枚舉系統(tǒng)進程的裝置,其特征在于,還包括第三遍歷執(zhí)行單元,用于對于所述獲得系統(tǒng)的進程中的至少一個進程,按照該進程所在Vm.WorkingSetExpansionLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統(tǒng)的進程集合合并。25.根據(jù)權(quán)利要求14所述的用于枚舉系統(tǒng)進程的裝置,其特征在于,還包括對比單元,用于將獲取的當(dāng)前進程集合與Windows任務(wù)管理器的進程表比對;提取單元,用于找出不同于Windows任務(wù)管理器的進程表中的進程;報警單元,用于以所述找出的進程作為內(nèi)容向用戶發(fā)送或者向用戶發(fā)送提示消息或報全文摘要本發(fā)明公開了一種用于枚舉系統(tǒng)進程的方法,包括獲取系統(tǒng)進程和線程對象句柄表;遍歷所述系統(tǒng)進程和線程對象句柄表中進程對象體指針指向的進程對象,獲得系統(tǒng)的進程;集合所獲得的所有進程,形成系統(tǒng)進程集合。本發(fā)明還公開了一種用于枚舉系統(tǒng)進程的裝置。本發(fā)明能夠枚舉出系統(tǒng)所有的進程,包括隱藏的進程,有利于減少一些惡意的隱藏進程對系統(tǒng)的威脅。文檔編號G06F21/50GK102867139SQ20121035981公開日2013年1月9日申請日期2012年9月25日優(yōu)先權(quán)日2012年9月25日發(fā)明者張輝申請人:北京奇虎科技有限公司,奇智軟件(北京)有限公司