專利名稱::一種用于枚舉系統進程的方法及裝置的制作方法
技術領域:
:本發明涉及計算機
技術領域:
,特別是涉及一種用于枚舉系統進程的方法。本發明還涉及一種用于枚舉系統進程的裝置。
背景技術:
:Windows任務管理器可以枚舉出系統當前的進程,并能夠根據需要選擇終止進程。為管理系統進程提供了很大的便利。Windows任務管理器枚舉系統當前進程是通過其NativeAPI函數ZwQuerySystemInfomation來操作進程活動鏈表來實現的。具體的過程如下首先,獲取當前任一進程的指針,例如可以通過PsGetCurrentProcessO來獲取當前進程的PEPR0CESS指針。然后定位到記錄該當前進程與其它進程鏈接信息的Activelist處,具體的操作方式為ActiveList=pCurrentEprocess+0x88,即當前進程指針移動一定的步長。其中0x88為winxpsp3下Activelist與pCurrentEprocess的步長,在不同win操作系統時該步長并不相同。接著,以所定位的當前進程的Activelist遍歷整個進程活動鏈表(Activelistlink)上每一進程的數據結構,即可獲得當前的存在于進程活動鏈表的所有進程。如上所述,因為windows任務管理器是基于ZwQuerySystemInformation來實現的,所以如果將進程對象從進程活動鏈表中移除,那么調用NtQuerySystemInfomation來枚舉進程的任務管理器TaskMgr.exe中就不會看到目標進程了。同時,Windows的任務調度分配器使用的另一的數據結構,也就是說,進程是否被調度執行與進程活動鏈表無關,不會因為從進程活動鏈表刪除就被CPU忽略,因此進程仍然會被執行。這很容易被一些惡意軟件或者RootKit程序利用,在進程活動鏈表上不顯示其存在,但是仍然被執行,這可能導致用戶的計算機在不知不覺中被感染病毒、植入木馬或者竊取了信息,對計算機造成潛在的或現實的威脅。因而有必要能夠查找出這種被進程活動鏈表忽略而實質上又在被執行的隱藏進程。
發明內容鑒于上述問題,提出了本發明以便提供一種克服上述問題或者至少部分地解決上述問題的用于枚舉系統進程的方法和相應的用于枚舉系統進程的裝置。依據本發明的一個方面,提供了一種用于枚舉系統進程的方法,包括獲取微軟客戶端和服務端運行時子系統進程對象的數據結構;獲取所述數據結構中的對象表指向的句柄表;遍歷所述句柄表的所有句柄表項,獲得每一句柄表項所指向的進程對象,進而獲得每一進程對象所對應的進程;集合所獲得的所有進程,形成系統進程集合。可選的,所述獲取微軟客戶端和服務端運行時子系統進程對象的數據結構包括獲取當前進程的私有句柄表;遍歷該當前進程的私有句柄表與其它進程的私有句柄表形成的句柄表鏈,獲得其它進程私有句柄表;根據所述獲得的其它進程的私有句柄表,獲取私有句柄表所對應的進程對象的數據結構;直至獲取所述微軟客戶端和服務端運行時子系統進程對象的數據結構為止。可選的,所述獲取微軟客戶端和服務端運行時子系統進程對象的數據結構包括獲取系統進程和線程對象句柄表;遍歷所述系統進程和線程對象句柄表中進程對象體指針指向的進程對象,獲得相應的進程對象的數據結構,直至獲取所述微軟客戶端和服務端運行時子系統進程對象的數據結構為止。可選的,所述獲取所述數據結構中的對象表指向的句柄表包括在所述數據結構中由起始位置偏移固定的步長獲取所述數據結構中的對象表指向的句柄表。可選的,所述遍歷所述句柄表的所有句柄表項,獲得每一句柄表項所指向的進程對象包括獲取所述句柄表層數;若獲取的句柄表層數為一層,按照固定的步長遍歷該層每一句柄表項,并根據每一句柄表項中的指向進程對象的成員指針,獲取其進程對象;若獲取的句柄表層數大于一層,則首先指向句柄表最高層,由最高層按照固定步長遍歷該層每一句柄表項;并獲取每一句柄表項中的指向相鄰下層句柄表項的成員指針;重復執行遍歷每一層的句柄表項,直至最下層;并由該最下層的每一句柄表項中的指向進程對象的成員指針,獲取其進程對象。可選的,所述獲取所述句柄表層數包括讀取句柄表中TableCode值的后兩位;根據所述后兩位判斷句柄表層數。可選的,所述首先指向句柄表最高層包括獲取句柄表中TableCode指針;將所述TableCode指針定位到句柄表最高層。可選的,還包括對于所述獲得系統的進程中的至少一個進程,按照該進程所在的SessionProcessLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統的進程集合合并。可選的,還包括對于所述獲得系統的進程中的至少一個進程,按照該進程所在Vm.WorkingSetExpansionLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統的進程口口O可選的,還包括將獲取的進程集合與Windows任務管理器的進程表比對;找出不同于Windows任務管理器的進程表中的進程;以所述找出的進程作為內容向用戶發送或者向用戶發送提示消息或報警。根據本發明的另一方面,還提供一種用于枚舉系統進程的裝置,包括csrss進程對象獲取單元,用于獲取微軟客戶端和服務端運行時子系統進程對象的數據結構;句柄表獲取單元,用于獲取所述數據結構中的對象表指向的句柄表;遍歷單元,用于遍歷所述句柄表的所有句柄表項,獲得每一句柄表項所指向的進程對象,進而獲得每一進程對象所對應的進程;集合單元,用于集合所獲得的所有進程,形成系統進程集合。可選的,所述進程對象獲取單元包括私有句柄表獲取單元,用于獲取當前進程的私有句柄表;第二遍歷單元,用于遍歷該當前進程的私有句柄表與其它進程的私有句柄表形成的句柄表鏈,獲得其它進程私有句柄表;執行單元,用于根據所述獲得的其它進程的私有句柄表,獲取私有句柄表所對應的進程對象的數據結構;直至獲取所述微軟客戶端和服務端運行時子系統進程對象的數據結構為止。可選的,所述進程對象獲取單元包括進程和線程對象句柄表獲取單元,用于獲取系統進程和線程對象句柄表;第三遍歷單元,用于遍歷所述系統進程和線程對象句柄表中進程對象體指針指向的進程對象,獲得相應的進程對象的數據結構,直至獲取所述微軟客戶端和服務端運行時子系統進程對象的數據結構為止。可選的,所述遍歷單元包括句柄表層數獲取單元,用于獲取所述句柄表層數;遍歷執行單元,用于根據句柄表層數遍歷句柄表項,若獲取的句柄表層數為一層,按照固定的步長遍歷該層每一句柄表項,并根據每一句柄表項中的指向進程對象的成員指針,獲取其進程對象;若獲取的句柄表層數大于一層,則首先指向句柄表最高層,由最高層按照固定步長遍歷該層每一句柄表項;并獲取每一句柄表項中的指向相鄰下層句柄表項的成員指針;重復執行遍歷每一層的句柄表項,直至最下層;并由該最下層的每一句柄表項中的指向進程對象的成員指針,獲取其進程對象。可選的,所述句柄表層數獲取單元包括讀取單元,用于讀取句柄表中TableCode值的后兩位;判斷單元,用于根據所述后兩位判斷句柄表層數。可選的,所述遍歷執行單元還包括TableCode指針獲取單元,用于獲取句柄表中TableCode指針;定位單元,用于將所述TableCode指針定位到句柄表最高層。可選的,還包括第四遍歷單元,用于對于所述獲得系統的進程中的至少一個進程,按照該進程所在的SessionProcessLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統的進程集合I=ITTO可選的,還包括第五遍歷單元,對于所述獲得系統的進程中的至少一個進程,按照該進程所在Vm.WorkingSetExpansionLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統的進程口口ο可選的,還包括對比單元,用于將獲取的進程集合與Windows任務管理器的進程表比對;提取單元,用于找出不同于Windows任務管理器的進程表中的進程;報警單元,用于以所述找出的進程作為內容向用戶發送或者向用戶發送提示消息或報警。根據本發明提供的具體實施例,本發明公開了以下技術效果本發明的方法中,首先獲取微軟客戶端和服務端運行時子系統進程對象的數據結構,并獲取其數據結構中的對象表這一數據項,進而獲取該對象表指向的句柄表,遍歷該句柄表即可獲得句柄表項指向的系統所有的當前進程;由于win系統中,每產生一個進程,都會將進程信息記錄到所述的微軟客戶端和服務端運行時子系統進程對象的數據結構中;具體的,就是將進程對象的句柄記錄到所述的句柄表中;因而,遍歷該句柄表,即可獲得系統的所有進程;也包括一些隱藏的進程;也就是說,即使有些進程從進程活動鏈表中刪除,通過本發明的方法仍然能夠枚舉出該進程,使得一些惡意軟件或者Rootkit無處藏身,有利于減少一些惡意的隱藏進程對系統的威脅。上述說明僅是本發明技術方案的概述,為了能夠更清楚了解本發明的技術手段,而可依照說明書的內容予以實施,并且為了讓本發明的上述和其它目的、特征和優點能夠更明顯易懂,以下特舉本發明的具體實施方式。通過閱讀下文優選實施方式的詳細描述,各種其他的優點和益處對于本領域普通技術人員將變得清楚明了。附圖僅用于示出優選實施方式的目的,而并不認為是對本發明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中圖I為本發明的用于枚舉系統進程的實施例的流程圖;圖2示出了根據本發明一個實施例中多個進程的進程結構體通過其私有句柄表形成句柄表鏈的示意圖;圖3為本發明的一種用于枚舉系統進程的裝置的一種實施例的示意圖。具體實施例方式下面將參照附圖更詳細地描述本公開的示例性實施例。雖然附圖中顯示了本公開的示例性實施例,然而應當理解,可以以各種形式實現本公開而不應被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠將本公開的范圍完整的傳達給本領域的技術人員。請參看圖1,其為本發明的用于枚舉系統進程的實施例的流程圖。步驟100,獲取微軟客戶端和服務端運行時子系統進程對象的數據結構。微軟客戶端和服務端運行時子系統(Client/ServerRuntimeServerSubsystem,簡稱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進程句柄表的遍歷方式均可使用本實施例中所述的方法。獲取所述Csrss.exe進程的方式有很多種,下面列舉其中的兩種。所述獲取Csrss.exe進程對象的數據結構的實現方法之一如下所述。A、獲取當前進程的私有句柄表;B、遍歷該當前進程的私有句柄表與其它進程的私有句柄表形成的句柄表鏈,獲得其它進程私有句柄表;C.根據所述獲得的其它進程的私有句柄表,獲取私有句柄表所對應的進程對象的數據結構;直至獲取所述微軟客戶端和服務端運行時子系統進程對象的數據結構為止。具體而言,在windows系統中,每一個進程都有一個句柄表(handletable),該句柄表稱為進程的私有句柄表。所述進程的私有句柄表是一個_HANDLE_TABLE結構,系統中所有進程的私有句柄表以雙向鏈表的形式鏈接在一起,Csrss.exe進程也不例外。故若獲取當前進程的私有句柄表,并按照一定的步長遍歷所述雙向鏈表,即可找到Csrss.exe進程。所述獲取當前進程的私有句柄表的一種具體實現方式如下a,獲取指向當前進程的指針山,由所述當前進程的指針偏移獲得當前進程的私有句柄表指針;c,根據所述當前進程的私有句柄表指針定位到該當前進程的私有句柄表。具體而言,可以通過PsGetCurrentProcessO或IoGetCurrentProcessO獲得當前進程的指針。在windows系統中,由于受調度資源的限制,同一進程在執行時也會被劃分到不同的時間段部分的執行,不同的進程在執行時穿插在一起,固在某一時間區間內,可能有多個進程在同時進行。而在某一時間點上,在多數情形下正在執行的是一個進程(當然也不排除在包括中央處理單元、內存等系統資源充裕的情況下,兩個或兩個以上的進程并行運行)。通過所述PsGetCurrentProcessO或IoGetCurrentProcessO函數即可得到在調用函數時刻指向正在運行的進程的指針,即指向當前進程的進程結構體_EPR0CESS的指針pCurrentProcess。本實施例中當前進程即指調用所述函數時刻正在運行的進程。所述獲得的當前進程可以是windows系統中的任何進程,在獲得指向當前任一進程的指針pCurrentProcess后,將所述指針偏移固定的步長,可得到該當前任一進程的私有句柄表。以windowsXP為例,指向當前進程的指針pCurrentProcess偏移0xc4(十六進制),即可得到所述當前進程的私有句柄表,即pHandleTable=pCurrentProcess+0xc4,需要說明的是,在windowsXP中,對于任何的進程而言,指針pCurrentProcess與私有句柄表之間的偏移步長均為0xc4(十六進制)ο在其它不同版本的window系統中,例如window2000、vista、win7等,偏移步長則有所不同,本領域技術人員可以根據各個windows的版本獲得相應的步長。根據所述當前進程的私有句柄表指針即可定位到該當前進程的私有句柄表。如如所述,windows系統中,系統中所有進程的私有句柄表以雙向鏈表的形式鏈接在一起。如圖2所示,其為多個進程的進程結構體通過其私有句柄表形成句柄表鏈的示意圖。進程的私有句柄表為_HANDLE_TABLE結構,對于任一句柄表,由pHandleTable偏移Oxlc(十六進制)即可指向其類型為_LIST_ENTRY的成員變量HandleTableList,即句柄表鏈。每一個HandleTableList都具有Flink和Blink兩個成員,Flink成員是一個向前鏈接,指向下一個LIST_ENTRY結構;B1ink成員則是一個向后鏈接,指向前一個LIST_ENTRY結構。整個鏈表形成封閉環形,也就是說,最后一個Flink指向鏈表中的第一個LIST_ENTRY結構,而第一個Blink則指向最后一個。由圖2可以看出,系統內所有進程的句柄表都是通S_LIST_ENTRY類型的雙向鏈表鏈接起來的。故按照一定的步長遍歷該雙向鏈表,即可獲得系統中Csrss.exe進程。在遍歷所述雙向鏈表時,可以在前述獲得的當前進程的私有句柄表基礎上,向前或者向后偏移一定的步長(所述偏移的步長根據win系統的版本而確定)獲得相鄰的HandleTableList,并對每一次偏移獲得的HandleTableList的地址偏移-Oxlc(十六進制)即獲得其所在的私有句柄表的pHandleTable;也就是獲得了HandleTableList所在的私有句柄表。對于任一私有句柄表,通過遍歷即可獲得其成員變量HandleTableList的地址。在句柄表中,pHandleTable偏移0x04處,結構成員為指向該句柄表所在進程結構體的指針,也就是說,在獲得HandleTableList的地址后,通過地址偏移即可找到其所在進程結構體的指針,進而能夠得到該進程結構體,也就是找到了該進程。系統的所有進程均可以通過如上所述的方式而獲得。自然也可以得到系統的Csrss.exe進程。本實施例中,直至獲取所述Csrss.exe進程對象的數據結構即EPR0CESS為止。在Win系統具有多個Csrss.exe時,則需要遍歷整個私有句柄表鏈,并找出所有Csrss.exe進程。所述獲取Csrss.exe進程對象的數據結構的實現方法之二如下所述I、獲取系統進程和線程對象句柄表;11、遍歷所述系統進程和線程對象句柄表中進程對象體指針指向的進程對象,獲得相應的進程對象的數據結構,直至獲取所述微軟客戶端和服務端運行時子系統進程對象的數據結構為止。具體而言,系統進程和線程對象句柄表(PspCidTable)是Windows系統中一種句柄表,其中存放的對象是系統中所有的進線程對象。因此只要能遍歷這個PspCidTable句柄表,就可以遍歷到系統的所有進程,包括所有隱藏進程,當然,也可以找到所述的Csrss.exe進程。因而,本方式中通過PspCidTable來獲取Csrss.exe進程。不難理解,若欲通過PspCidTable來獲取Csrss.exe進程,則首先需要獲取PspCidTable,即定位到所述PspCidTablede的首地址。獲取所述PspCidTablede的方法有很多種,在這里列舉其中一種通過PspCidTable的函數中特征搜索定位系統進程和線程對象句柄表。其中,所述特征搜索的特征串包括0x35ff和0x8e。當然,還可以通過其它方式獲取PspCidTable,這里不再一一列舉。需要強調的是,任何能夠獲取PspCidTable的方法均可應用于此,在本實施例中對此并無限制。PspCidtable為_Handle_Table結構,在windows2000系統中,其為固定的三層表結構,TableCode中記錄著三層表即一級表(一級表也稱為基本表)、二級表和三級表的基地址。在上述的三層表中,上一級表中存放的地址指針指向與其臨近的下一層地址,如三級表中存放的是指向二級表的指針,二級表中存放的是指向基本表的指針,在基本表中存放的才是指向進程對象或線程的指針。而在windowsxp和windows2003中,為了節省系統空間,采用了動態可擴展的三層表結構,當句柄數目較少時候僅僅采用基本表,當句柄數目較大時系統才會啟用二級表,直至三級表。無論是上述的固定三層表結構還是動態可擴展的三層表結構,都需要根據每一層表的基地址按照固定的步長遍歷每一層存放的地址指針,方能獲得該句柄表中所有句柄表項。只不過在動態可擴展的三層表結構中,首先需要判斷其真正的句柄表層數是多少,然后再根據該實際的句柄表層數執行相應個層的遍歷。其中,在動態可擴展的三層表中,TableCode的后兩位是判斷句柄表層數的依據,后兩位是00則是一層表結構,后兩位是01則是兩層表結構,后兩位是10則是三層表結構。如上所述,在PspCidTable句柄表中,存放的是系統進程和線程的對象句柄。通過遍歷能夠獲得基層表中記錄的指向對象指針,但是該指針是指向對象體的,無法判斷·其是進程還是線程。故還需要通過偏移獲取類型為_0BJECT_HEADER的、指向對象頭的指針,并由對象頭指針中讀出其指針類型,方能確定指針指向的是進程還是線程。選出類型為進程的對象頭指針,,通過所述進程對象頭指針,既可以獲得相應的進程。遍歷該PspCidTable句柄表,直至找到所述Csrss.exe進程,即獲得Csrss.exe進程對象的數據結構_EPR0CESS。本實施例中通過如下方式判斷對象頭指針中類型為進程的指針類型信息,即通過PsGetCurrentProcessO或IoGetCurrentProcessO等函數獲取當前進程,由該當前進程的對象體指針偏移獲取其對象頭指針;在該對象頭指針中讀取其指針類型信息。當然,若獲取的當前進程恰恰是Csrss.exe進程,貝U無須再執行上述通過遍歷獲取Csrss.exe進程的步驟。上述列舉了其中兩種獲取Csrss.exe進程的方法,但并非窮舉。任何能夠獲取Csrss.exe進程的方法都能應用于本實施例中,例如
背景技術:
中所描述的用于枚舉進程的方法。請繼續參看圖I。步驟110,獲取所述數據結構中的對象表指向的句柄表。其中,在所述Csrss.exe進程對象的數據結構_EPR0CESS中由起始位置偏移固定的步長獲取所述數據結構中的對象表指向的句柄表。所述的固定的步長根據windows操作系統的不同而不同。步驟120,遍歷所述句柄表的所有句柄表項,獲得每一句柄表項所指向的進程對象,進而獲得每一進程對象所對應的進程;在Csrss.exe進程中,其中的句柄表為_Handle_Table結構,在windows2000系統中,其也為固定的三層表結構,TableCode中記錄著三層表即一級表(一級表也稱為基本表)、二級表和三級表的基地址。在上述的三層表中,上一級表中存放的地址指針指向與其臨近的下一層地址,如三級表中存放的是指向二級表的指針,二級表中存放的是指向基本表的指針,在基本表中存放的才是指向進程對象的指針。而在windowsxp和windows2003中,為了節省系統空間,采用了動態可擴展的三層表結構,當句柄數目較少時候僅僅采用基本表,當句柄數目較大時系統才會啟用二級表,直至三級表。無論是上述的固定三層表結構還是動態可擴展的三層表結構,都需要根據每一層表的基地址按照固定的步長遍歷每一層存放的地址指針,方能獲得該句柄表中所有句柄表項。只不過在動態可擴展的三層表結構中,首先需要判斷其真正的句柄表層數是多少,然后再根據該實際的句柄表層數執行相應個層的遍歷。其中,在動態可擴展的三層表中,TableCode的后兩位是判斷句柄表層數的依據,后兩位是00則是一層表結構,后兩位是01則是兩層表結構,后兩位是10則是三層表結構。通過讀取并判斷句柄表中TableCode的后兩位即可獲得句柄表層數。若獲取的句柄表層數為一層,則按照固定的步長遍歷該層每一句柄表項,并根據每一句柄表項中的指向進程對象的成員指針,即可獲取進程對象;若獲取的句柄表層數大于一層時,則需要按照如下方式遍歷各層首先,獲取句柄表中TableCode指針;將所述TableCode指針定位到句柄表最高層;接著由最高層按照固定步長遍歷該層每一句柄表項;并獲取每一句柄表項中的指向相鄰下層句柄表項的成員指針;重復執行遍歷每一層的句柄表項,直至最下層;并由該最下層的每一句柄表項中的指向進程對象的成員指針,獲取進程對象。其中,每一層的基地址如上所述,可在TableCode中獲得,這里不再贅述。通過遍歷Csrss句柄表每一句柄表項,即可獲得句柄記錄在Csrss句柄表中的所有進程。步驟130,集合所獲得的所有進程,形成系統當前進程表。本發明的上述實施例的方法中,首先獲取微軟客戶端和服務端運行時子系統進程對象的數據結構,并獲取其數據結構中的對象表這一數據項,進而獲取該對象表指向的句柄表,遍歷該句柄表即可獲得句柄表項指向的系統所有的當前進程;由于windows系統中,每產生一個進程,都會將進程信息記錄到所述的微軟客戶端和服務端運行時子系統進程對象的數據結構中;具體的,就是將進程對象的句柄記錄到所述的句柄表中;因而,遍歷該句柄表,即可獲得系統的所有進程;也包括一些隱藏的進程;也就是說,即使有些進程從進程活動鏈表中刪除,通過本發明的方法仍然能夠枚舉出該進程,使得一些惡意軟件或者Rootkit無處藏身,有利于減少一些惡意的隱藏進程對系統的威脅。對于所述獲得系統的進程中的至少一個進程,還可以按照該進程所在的SessionProcessLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統的進程集合合并。WINDBG中數據結構如下kd>dt_eprocess81c2c6d8nt!_EPR0CESS+OxObOVirtualSize0x3933000+0x0b4SessionProcessLinks:_LIST_ENTRY由上述結構可知,進程的SessionProcessLinks也是_LIST_ENTRY結構的環形雙向鏈表,對于每一進程,通過遍歷該SessionProcessLinks,均可得到一個進程的列表。對通過上述實施例的方法得到進程列表中的任一或多個進程,再通過SessionProcessLinks遍歷,可得到一個或多個進程表,將獲得的進程表與上述實施例中得到的進程表集合,并去除重復進程,即可得到更為完整的進程表。此外,對于所述獲得系統的進程中的至少一個進程,按照該進程所在Vm.WorkingSetExpansionLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統的進程集合合并。其中,Vm.WorkingSetExpansionLinks遍歷的原理同SessionProcessLinks遍歷,這里不再贅述。此外,通過上述實施例獲得進程列表,還可以繼續執行如下的步驟I.將獲取的當前進程表與Windows任務管理器的進程表比對;II.找出不同于Windows任務管理器的進程表中的進程;III.將所述找出的進程向用戶發送提示消息或發送報警。也就是說,通過將本發明的實施例獲得的進程表與前述
背景技術:
中的方法所獲得進程表進行比對,并將本發明的實施例的方法獲得的進程表與
背景技術:
中所獲得的方法所不同的進程找出并提示用戶或發出報警。用戶可以根據該提示或報警對所找出的不同進程進一步分析,判斷是否惡意進程。以上公開了本發明的一種用于枚舉系統進程的方法的實施例,與此相應的,本發明還公開了一種用于枚舉系統進程的裝置。請參考圖3,其為本發明的一種用于枚舉系統進程的裝置的一種實施例的示意圖。由于該裝置的實施例與前述的方法的實施例基本相同,下面僅簡單描述本實施例中的裝置。本實施例的一種用于枚舉系統進程的裝置包括=Csrss進程對象獲取單元200,用于獲取微軟客戶端和服務端運行時子系統進程對象的數據結構;句柄表獲取單元210,用于獲取所述數據結構中的對象表指向的句柄表;遍歷單元220,用于遍歷所述句柄表的所有句柄表項,獲得每一句柄表項所指向的進程對象,進而獲得每一進程對象所對應的進程;集合單元230,用于集合所獲得的所有進程,形成系統當前進程表。可選的,所述進程對象獲取單元包括私有句柄表獲取單元,用于獲取當前進程的私有句柄表;第二遍歷單元,用于遍歷該當前進程的私有句柄表與其它進程的私有句柄表形成的句柄表鏈,獲得其它進程私有句柄表;執行單元,用于根據所述獲得的其它進程的私有句柄表,獲取私有句柄表所對應的進程對象的數據結構;直至獲取所述微軟客戶端和服務端運行時子系統進程對象的數據結構為止。可選的,所述進程對象獲取單元包括進程和線程對象句柄表獲取單元,用于獲取系統進程和線程對象句柄表;第三遍歷單元,用于遍歷所述系統進程和線程對象句柄表中進程對象體指針指向的進程對象,獲得相應的進程對象的數據結構,直至獲取所述微軟客戶端和服務端運行時子系統進程對象的數據結構為止。可選的,所述遍歷單元包括句柄表層數獲取單元,用于獲取所述句柄表層數;遍歷執行單元,用于根據句柄表層數遍歷句柄表項,若獲取的句柄表層數為一層,按照固定的步長遍歷該層每一句柄表項,并根據每一句柄表項中的指向進程對象的成員指針,獲取其進程對象;若獲取的句柄表層數大于一層,則首先指向句柄表最高層,由最高層按照固定步長遍歷該層每一句柄表項;并獲取每一句柄表項中的指向相鄰下層句柄表項的成員指針;重復執行遍歷每一層的句柄表項,直至最下層;并由該最下層的每一句柄表項中的指向進程對象的成員指針,獲取其進程對象。可選的,所述句柄表層數獲取單元包括讀取單元,用于讀取句柄表中TableCode值的后兩位;判斷單元,用于根據所述后兩位判斷句柄表層數。可選的,所述遍歷執行單元還包括TableCode指針獲取單元,用于獲取句柄表中TableCode指針;定位單元,用于將所述TableCode指針定位到句柄表最高層。可選的,第四遍歷單元,用于對于所述獲得系統的進程中的至少一個進程,按照該進程所在的SessionProcessLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統的進程集合合并。可選的,第五遍歷單元,對于所述獲得系統的進程中的至少一個進程,按照該進程所在Vm.WorkingSetExpansionLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統的進程集合合并。可選的,對比單元,用于將獲取的當前進程集合與Windows任務管理器的進程表比對;提取單元,用于找出不同于Windows任務管理器的進程表中的進程;報警單元,用于以所述找出的進程作為內容向用戶發送或者向用戶發送提示消息或報警。應用本發明實施例的裝置可獲得與上述方法實施例相同的技術效果,這里不再贅述。在此提供的算法和顯示不與任何特定計算機、虛擬系統或者其它設備固有相關。各種通用系統也可以與基于在此的示教一起使用。根據上面的描述,構造這類系統所要求的結構是顯而易見的。此外,本發明也不針對任何特定編程語言。應當明白,可以利用各種編程語言實現在此描述的本發明的內容,并且上面對特定語言所做的描述是為了披露本發明的最佳實施方式。在此處所提供的說明書中,說明了大量具體細節。然而,能夠理解,本發明的實施例可以在沒有這些具體細節的情況下實踐。在一些實例中,并未詳細示出公知的方法、結構和技術,以便不模糊對本說明書的理解。類似地,應當理解,為了精簡本公開并幫助理解各個發明方面中的一個或多個,在上面對本發明的示例性實施例的描述中,本發明的各個特征有時被一起分組到單個實施例、圖、或者對其的描述中。然而,并不應將該公開的方法解釋成反映如下意圖即所要求保護的本發明要求比在每個權利要求中所明確記載的特征更多的特征。更確切地說,如下面的權利要求書所反映的那樣,發明方面在于少于前面公開的單個實施例的所有特征。因此,遵循具體實施方式的權利要求書由此明確地并入該具體實施方式,其中每個權利要求本身都作為本發明的單獨實施例。本領域那些技術人員可以理解,可以對實施例中的設備中的模塊進行自適應性地改變并且把它們設置在與該實施例不同的一個或多個設備中。可以把實施例中的模塊或單元或組件組合成一個模塊或單元或組件,以及此外可以把它們分成多個子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設備的所有過程或單元進行組合。除非另外明確陳述,本說明書(包括伴隨的權利要求、摘要和附圖)中公開的每個特征可以由提供相同、等同或相似目的的替代特征來代替。此外,本領域的技術人員能夠理解,盡管在此所述的一些實施例包括其它實施例中所包括的某些特征而不是其它特征,但是不同實施例的特征的組合意味著處于本發明的范圍之內并且形成不同的實施例。例如,在下面的權利要求書中,所要求保護的實施例的任意之一都可以以任意的組合方式來使用。本發明的各個部件實施例可以以硬件實現,或者以在一個或者多個處理器上運行的軟件模塊實現,或者以它們的組合實現。本領域的技術人員應當理解,可以在實踐中使用微處理器或者數字信號處理器(DSP)來實現根據本發明實施例的用于枚舉系統進程的裝置中的一些或者全部部件的一些或者全部功能。本發明還可以實現為用于執行這里所描述的方法的一部分或者全部的設備或者裝置程序(例如,計算機程序和計算機程序產品)。這樣的實現本發明的程序可以存儲在計算機可讀介質上,或者可以具有一個或者多個信號的形式。這樣的信號可以從因特網網站上下載得到,或者在載體信號上提供,或者以任何其他形式提供。應該注意的是上述實施例對本發明進行說明而不是對本發明進行限制,并且本領域技術人員在不脫離所附權利要求的范圍的情況下可設計出替換實施例。在權利要求中,不應將位于括號之間的任何參考符號構造成對權利要求的限制。單詞“包含”不排除存在未列在權利要求中的元件或步驟。位于元件之前的單詞“一”或“一個”不排除存在多個這樣的元件。本發明可以借助于包括有若干不同元件的硬件以及借助于適當編程的計算機來實現。在列舉了若干裝置的單元權利要求中,這些裝置中的若干個可以是通過同一個硬件項來具體體現。單詞第一、第二、以及第三等的使用不表示任何順序。可將這些單詞解釋為名稱。權利要求1.一種用于枚舉系統進程的方法,其特征在于,包括獲取微軟客戶端和服務端運行時子系統進程對象的數據結構;獲取所述數據結構中的對象表指向的句柄表;遍歷所述句柄表的所有句柄表項,獲得每一句柄表項所指向的進程對象,進而獲得每一進程對象所對應的進程;集合所獲得的所有進程,形成系統進程集合。2.根據權利要求I所述的用于枚舉系統進程的方法,其特征在于,所述獲取微軟客戶端和服務端運行時子系統進程對象的數據結構包括獲取當如進程的私有句柄表;·遍歷該當前進程的私有句柄表與其它進程的私有句柄表形成的句柄表鏈,獲得其它進程私有句柄表;根據所述獲得的其它進程的私有句柄表,獲取私有句柄表所對應的進程對象的數據結構;直至獲取所述微軟客戶端和服務端運行時子系統進程對象的數據結構為止。3.根據權利要求I所述的用于枚舉系統進程的方法,其特征在于,所述獲取微軟客戶端和服務端運行時子系統進程對象的數據結構包括獲取系統進程和線程對象句柄表;遍歷所述系統進程和線程對象句柄表中進程對象體指針指向的進程對象,獲得相應的進程對象的數據結構,直至獲取所述微軟客戶端和服務端運行時子系統進程對象的數據結構為止。4.根據權利要求I所述的用于枚舉系統進程的方法,其特征在于,所述獲取所述數據結構中的對象表指向的句柄表包括在所述數據結構中由起始位置偏移固定的步長獲取所述數據結構中的對象表指向的句柄表。5.根據權利要求I所述的用于枚舉系統進程的方法,其特征在于,所述遍歷所述句柄表的所有句柄表項,獲得每一句柄表項所指向的進程對象包括獲取所述句柄表層數;若獲取的句柄表層數為一層,按照固定的步長遍歷該層每一句柄表項,并根據每一句柄表項中的指向進程對象的成員指針,獲取其進程對象;若獲取的句柄表層數大于一層,則首先指向句柄表最高層,由最高層按照固定步長遍歷該層每一句柄表項;并獲取每一句柄表項中的指向相鄰下層句柄表項的成員指針;重復執行遍歷每一層的句柄表項,直至最下層;并由該最下層的每一句柄表項中的指向進程對象的成員指針,獲取其進程對象。6.根據權利要求5所述的用于枚舉系統進程的方法,其特征在于,所述獲取所述句柄表層數包括讀取句柄表中TableCode值的后兩位;根據所述后兩位判斷句柄表層數。7.根據權利要求5所述的用于枚舉系統進程的方法,其特征在于,所述首先指向句柄表最聞層包括獲取句柄表中TableCode指針;將所述TableCode指針定位到句柄表最高層。8.根據權利要求I所述的用于枚舉系統進程的方法,其特征在于還包括對于所述獲得系統的進程中的至少一個進程,按照該進程所在的SessionProcessLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統的進程集合合并。9.根據權利要求I所述的用于枚舉系統進程的方法,其特征在于還包括對于所述獲得系統的進程中的至少一個進程,按照該進程所在Vm.WorkingSetExpansionLinks鏈表再做遍歷,并將獲得的進程表與所述獲得系統的進程集合合并。10.根據權利要求I所述的用于枚舉系統進程的方法,其特征在于,還包括將獲取的進程集合與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鏈表再做遍歷,并將獲得的進程表與所述獲得系統的進程口口O19.根據權利要求11所述的用于枚舉系統進程的裝置,其特征在于,還包括對比單元,用于將獲取的進程集合與Windows任務管理器的進程表比對;提取單元,用于找出不同于Windows任務管理器的進程表中的進程;報警單元,用于以所述找出的進程作為內容向用戶發送或者向用戶發送提示消息或報目O全文摘要本發明公開了一種用于枚舉系統進程的方法,包括獲取微軟客戶端和服務端運行時子系統進程對象的數據結構;獲取所述數據結構中的對象表指向的句柄表;遍歷所述句柄表的所有句柄表項,獲得每一句柄表項所指向的進程對象,進而獲得每一進程對象所對應的進程;集合所獲得的所有進程,形成系統進程集合。本發明還公開了一種用于枚舉系統進程的裝置。本發明能夠枚舉出系統所有進程,包括一些隱藏的進程;使得一些惡意軟件或者Rootkit無處藏身,有利于減少一些惡意的隱藏進程對系統的威脅。文檔編號G06F9/46GK102902575SQ20121036301公開日2013年1月30日申請日期2012年9月25日優先權日2012年9月25日發明者張輝申請人:北京奇虎科技有限公司,奇智軟件(北京)有限公司