一種基于數(shù)據(jù)關聯(lián)的自動內(nèi)存證據(jù)分析方法
【專利摘要】一種基于數(shù)據(jù)關聯(lián)的自動內(nèi)存證據(jù)分析方法,借助關鍵數(shù)據(jù)結(jié)構(gòu)分析以及聚類方法全面分析了進程、文件、用戶、動態(tài)鏈接庫等主要內(nèi)存數(shù)據(jù)之間的各種關系;對于進程與其他信息之間,依次自動識別進程與文件關聯(lián)、進程與動態(tài)鏈接庫關聯(lián)、進程與用戶關聯(lián)以及進程與網(wǎng)絡報關聯(lián);對于進程與進程之間的關聯(lián),依次可自動識別進程間父子關聯(lián)、進程間服務關聯(lián)和進程間通信關聯(lián)。通過描述這些關系,本方法可以將彼此獨立的數(shù)據(jù)組織成關聯(lián)圖,從更高的語義層次揭示原始證據(jù)的含義。
【專利說明】一種基于數(shù)據(jù)關聯(lián)的自動內(nèi)存證據(jù)分析方法
【技術領域】
[0001]本發(fā)明涉及的是一種計算機犯罪取證領域,涉及對內(nèi)存證據(jù)自動分析、關聯(lián),以便重現(xiàn)犯罪場景的方法,尤其是一種適合自動分析Windows XP內(nèi)存證據(jù)的方法。
【背景技術】
[0002]內(nèi)存取證在過去十年發(fā)展迅速。這是因為內(nèi)存能夠提供磁盤不包含的正在運行的進程、實際執(zhí)行的二進制代碼、打開的網(wǎng)絡連接及端口等調(diào)查者所關心的信息。盡管犯罪者可通過加密、代碼混淆、掛鉤等方式隱藏其行為,但非法行為仍必須在內(nèi)存中執(zhí)行,并難免留下痕跡。因此,來自內(nèi)存的犯罪證據(jù)更加可靠,也更具實時性?;谏鲜鰞?yōu)點,內(nèi)存取證在近年來吸引了越來越多研究者的關注。但現(xiàn)有的內(nèi)存取證研究主要側(cè)重于如何可靠地獲取內(nèi)存鏡像等證據(jù),關于如何自動分析已獲得證據(jù)的關注較少。近年來,隨著硬件技術的發(fā)展,計算機內(nèi)存容量已從MB級增長到TB級,而網(wǎng)絡及云計算平臺的廣泛使用也使調(diào)查者經(jīng)常需要同時分析很多內(nèi)存鏡像。面對海量的數(shù)據(jù)以及復雜、缺乏語義信息的低層OS數(shù)據(jù)結(jié)構(gòu),如何自動完成內(nèi)存證據(jù)分析,找出其中隱藏的犯罪行為并以調(diào)查者容易理解的方式重構(gòu)其犯罪過程已成為亟待解決的重要問題。
[0003]現(xiàn)有的內(nèi)存證據(jù)分析方法主要分為基于字符串搜索、基于內(nèi)存掃描、基于特征(signature)掃描和基于操作系統(tǒng)內(nèi)核關鍵數(shù)據(jù)結(jié)構(gòu)分析幾種。字符串搜索建立在已知關鍵詞的基礎上,是早期流行的簡單方法。該方法需要的人工干預較多,且搜索結(jié)果包含大量噪聲。內(nèi)存掃描分析方法是一種基于線性內(nèi)存掃描的暴力破解方法。該方法逐個字節(jié)的掃描整個內(nèi)存,然后獲取需要的信息。在當前海量、復雜的分析背景下,該方法花費的時間往往比較長。基于特征(signature)掃描的分析技術通常使用一系列規(guī)則來精確的描述某種特征,然后使用掃描器進行掃描。該方法需要預先定義合適的規(guī)則,所以不能識別未知行為。盡管其精確度及效率較前兩種方法有所提升,但在當前分析背景下該方法仍顯得力不從心。目前主流的內(nèi)存分析技術是分析內(nèi)存數(shù)據(jù)結(jié)構(gòu),即通過研究關鍵的內(nèi)存數(shù)據(jù)結(jié)構(gòu)獲得該結(jié)構(gòu)中的信息,從而獲得感興趣的犯罪證據(jù)。但目前這類方法僅針對特定數(shù)據(jù)類型進行分析,比如恢復內(nèi)存中的進程列表、二進制文件、打開的網(wǎng)絡連接等,分析結(jié)果比較單一。即使是當前流行的取證分析框架volatility,也僅僅提供對各類內(nèi)存信息的恢復及羅列,具體的犯罪行為識別及場景重構(gòu)仍需人工完成。事實上證據(jù)分析過程需要綜合考慮各類證據(jù),通過數(shù)據(jù)之間的彼此關聯(lián)印證來發(fā)現(xiàn)更多的犯罪行為,進而重構(gòu)犯罪過程。
【發(fā)明內(nèi)容】
[0004]針對現(xiàn)有技術在內(nèi)存證據(jù)自動分析領域的不足,本發(fā)明目的是提出了一種基于數(shù)據(jù)關聯(lián)的自動證據(jù)分析方法。借助關鍵數(shù)據(jù)結(jié)構(gòu)分析以及聚類方法全面分析進程、文件、用戶、動態(tài)鏈接庫等主要內(nèi)存數(shù)據(jù)之間的各種關系。
[0005]本發(fā)明的技術方案是,一種基于數(shù)據(jù)關聯(lián)的自動內(nèi)存證據(jù)分析方法,其特征在于:借助關鍵數(shù)據(jù)結(jié)構(gòu)分析以及聚類方法全面分析了進程、文件、用戶、動態(tài)鏈接庫等主要內(nèi)存數(shù)據(jù)之間的各種關系;對于進程與其他信息之間,依次自動識別進程與文件關聯(lián)、進程與動態(tài)鏈接庫關聯(lián)、進程與用戶關聯(lián)以及進程與網(wǎng)絡報關聯(lián);對于進程與進程之間的關聯(lián),依次可自動識別進程間父子關聯(lián)、進程間服務關聯(lián)和進程間通信關聯(lián)。通過描述這些關系,本發(fā)明能夠?qū)⒈舜霜毩⒌臄?shù)據(jù)組織成關聯(lián)圖,從更高的語義層次揭示原始證據(jù)的含義。
[0006]進一步,所述分析以進程為中心,涵蓋了進程與進程之間的父子關聯(lián)、通信關聯(lián)和服務關聯(lián),以及進程與文件、動態(tài)鏈接庫、用戶、網(wǎng)絡信息等內(nèi)存信息的關聯(lián)。本發(fā)明設計了一種基于數(shù)據(jù)關聯(lián)的自動內(nèi)存證據(jù)分析機制。在計算機取證過程中,內(nèi)存中最重要的信息就是進程。進程代表了計算機中各種運行的軟件、服務。因此,為了從內(nèi)存包含的大量不同類別的信息中梳理出有用的關聯(lián)關系,本發(fā)明機制采取了以進程為中心的關聯(lián)分析策略,將內(nèi)存中的關聯(lián)關系分成進程間關聯(lián)和進程與其他信息的關聯(lián)兩類。為了從不同角度展現(xiàn)內(nèi)存中進程與進程的關系。提出了以父子關系、通信關系和服務目的關系為基礎的關聯(lián)方法。在進程與內(nèi)存其他數(shù)據(jù)間的關聯(lián)方面,主要選取了進程與文件、進程與動態(tài)鏈接庫、進程與用戶以及進程與網(wǎng)絡包的關聯(lián)關系加以分析。之所以選取這些關聯(lián),是因為它們對于計算機取證而言非常有用。為以可靠的方式揭示這些關聯(lián)關系,并揭示內(nèi)存中無直接指示信息的隱式關聯(lián)關系,設計了一種綜合使用數(shù)據(jù)結(jié)構(gòu)分析及聚類技術的關聯(lián)方法。對于內(nèi)存中有標識的關聯(lián),將以分析內(nèi)存數(shù)據(jù)結(jié)構(gòu)為主進行識別。在識別過程中將比較各種標識數(shù)據(jù)結(jié)構(gòu),最終選擇一種最為可靠的結(jié)構(gòu)。而對于隱含關聯(lián)的分析,主要基于聚類方法進行。因為windows XP仍是當前國內(nèi)取證調(diào)查時最常見的操作系統(tǒng),因此本發(fā)明主要基于Windows XP SP2操作系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)。
[0007]不同于以往的內(nèi)存分析方法,本發(fā)明所提出的數(shù)據(jù)關聯(lián)方法是首次將各類內(nèi)存數(shù)據(jù)結(jié)合起來,較為完整地展示出內(nèi)存中數(shù)據(jù)的關聯(lián)關系。事實上,如果能夠事先自動建立內(nèi)存中各類信息的關聯(lián),那么不僅犯罪場景重構(gòu)將變得更加容易,識別犯罪行為也會更為方便。因為異常的關聯(lián)關系(例如outlook讀取存儲了用戶密碼的password文件)往往代表了非法的行為。而且,一旦識別出代表犯罪行為的某一證據(jù),即可以依據(jù)已知的關聯(lián)關系順藤摸瓜找出更多的犯罪行為以及證據(jù)。這樣犯罪者將更難隱藏其行為。
[0008]進一步,所述進程與文件之間的自動關聯(lián)方法,具體步驟如下:
[0009]步驟1:在內(nèi)存中定位到每個需分析的文件對象;
[0010]步驟2:從對象基址向前0x018偏移量,讀取每個文件對象的_0BJECT_HEADER對象(其結(jié)構(gòu)如圖2所示)。
[0011]步驟3:讀取_0BJECT_HEADER對象的HandleInfoOffset屬性,并根據(jù)其值獲取文件對象的對應句柄信息。
[0012]步驟4:讀取句柄信息的第一個字。其內(nèi)容即為擁有該文件的進程對象的基地址。
[0013]步驟5:根據(jù)步驟4中獲得的地址信息讀取進程對象并建立進程與文件之間的關聯(lián)。
[0014]進一步,所述進程與動態(tài)鏈接庫(DLL)之間的自動關聯(lián)方法,具體步驟如下:
[0015]步驟1:在內(nèi)存中定位到每個需調(diào)查進程的_EPR0CESS結(jié)構(gòu)(其數(shù)據(jù)結(jié)構(gòu)如圖4所示)O
[0016]步驟2:讀取_EPR0CESS的屬性ObjectTable,根據(jù)其值獲取進程的句柄表_HANDLE_TABLE (其結(jié)構(gòu)如圖5所示)。
[0017]步驟3:遍歷_HANDLE_TABLE的屬性HandleTableList指向的雙向鏈接表。找到其中類型為File,名稱的后綴是動態(tài)數(shù)據(jù)庫dll的句柄,這些句柄就是進程載入的動態(tài)鏈接庫文件。
[0018]進一步,進程與用戶之間的自動關聯(lián)方法,具體步驟如下:
[0019]步驟1:在內(nèi)存中定位到每個需調(diào)查進程的_EPR0CESS結(jié)構(gòu)。
[0020]步驟2:根據(jù)_EPR0CESS中的屬性Token值獲取進程的_Τ0ΚΕΝ結(jié)構(gòu)(其結(jié)構(gòu)如圖7所示)。進程的很多安全有關的信息都保存在_Τ0ΚΕΝ結(jié)構(gòu)中,包括用戶和組的安全標識符(SID)。
[0021]步驟3:讀取_Τ0ΚΕΝ結(jié)構(gòu)中記錄的用戶和組的安全標識符(SID)。
[0022]步驟4:基于Windows的系統(tǒng)通用安全標識符文檔過濾掉通用標示符,余下的即是實際登陸用戶的安全標識符。
[0023]步驟5:在注冊表中找到 HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVers1n\ProfileList項,其中記錄了所有用戶的安全標識符。
[0024]步驟6:根據(jù)篩選后余下的非通用安全標示符的ProfileImagePath屬性即可提取出與其對應的用戶名,從而可將進程與具體用戶關聯(lián)起來。
[0025]進一步,所述進程與網(wǎng)絡信息之間的自動關聯(lián)方法,具體步驟如下:
[0026]步驟1:通過基于特征分析的掃描方法定位結(jié)構(gòu)_TCPT_0BJECT (其結(jié)構(gòu)如圖9所示),該結(jié)構(gòu)在內(nèi)存中出現(xiàn)時帶有特殊的標識TCPT (0x54435054)。
[0027]步驟2:根據(jù)_TCPT_0BJECT中的屬性Pid將每個_TCPT_0BJECT關聯(lián)到對應的進程。
[0028]步驟3:根據(jù)每個_TCPT_0BJECT的Next屬性找到下一個TCP對象,重復步驟⑵。
[0029]進一步,進程間的父子關聯(lián)方法,具體步驟如下:
[0030]步驟1:找到內(nèi)存中的所有進程。為識別隱藏進程,通過基于特征(signature)的掃描技術掃描進程的池分配標記Proc,這樣就能保證獲取的進程完整。
[0031]步驟2:在內(nèi)存中定位到每個需調(diào)查進程的_EPR0CESS結(jié)構(gòu)。
[0032]步驟3:讀取 _EPR0CESS 中的屬性 UniqueProcessId 和InheritedFromUniqueProcessId,它們分別表示了進程自己的id和其父進程的id。根據(jù)進程id之間的父子關系即可將進程以父子關系關聯(lián)起來。
[0033]進一步,進程間的服務關聯(lián)方法,具體步驟如下:
[0034]方法一,基于名稱相似度的進程間服務關聯(lián)。其特征在于具體步驟如下:
[0035]步驟1:找到內(nèi)存中的所有進程。為識別隱藏進程,通過基于特征(signature)的掃描技術掃描進程的池分配標記Proc,這樣就能保證獲取的進程完整。
[0036]步驟2:識別進程名稱。
[0037]步驟3:找出所有名稱中有相同的前綴或后綴的進程,并建立關聯(lián)。
[0038]方法二,基于動態(tài)鏈接庫的進程間服務關聯(lián)。具體步驟如下:
[0039]步驟1:根據(jù)前文所述的進程與動態(tài)鏈接庫(DLL)之間的自動關聯(lián)方法獲取每個進程載入的動態(tài)鏈接庫列表。
[0040]步驟2:根據(jù)進程及其動態(tài)鏈接庫文件,使用無需事先指定聚類個數(shù)的聚類算法(例如=DBSCAN算法)來對進程進行聚類。具體步驟如下:
[0041]步驟2.1,選擇關鍵dll并用其建模每個進程。其中,關鍵DLL的選擇原則是:首先,選擇選取出現(xiàn)頻度較高的dll。其次,如果文件A出現(xiàn),文件B和C必定會出現(xiàn),那么在出現(xiàn)文件A的時候只需考慮A而不用考慮B和C。建模進程的具體方法是:基于關鍵dll,將每個進程建模為一個η元組。其定義如下:
[0042]定義I若把η個關鍵dll組織成一個有序集合,那么每個進程對應的η-元組是一個由η個O或I組成的序列,其中I表示進程加載了對應序號的關鍵dll,O表示該進程未加載該dll。
[0043]步驟2.2,為聚類算法設置合適的參數(shù)。例如:若選擇DBSCAN算法,則可設置epsilon 的值為 4.0, minPoints 的值為 2。
[0044]步驟2.3,用選定的聚類算法基于第一步建立的模型聚類所有進程,并輸出結(jié)果。
[0045]進一步,進程間的通信關聯(lián)方法,包含共享內(nèi)存通信、文件通信及管道通信的關聯(lián)。
[0046]進程間共享內(nèi)存通信關聯(lián)方法,具體步驟如下:
[0047]步驟1:在內(nèi)存中定位到每個需調(diào)查進程的_EPR0CESS結(jié)構(gòu)。
[0048]步驟2:根據(jù)_EPR0CESS對象的屬性VadRoot獲取進程的VAD樹的根節(jié)點的地址。VAD樹中每個節(jié)點都是一個_MMVAD結(jié)構(gòu),它代表了內(nèi)存分配給進程的某段虛擬地址空間,屬性StartingVpn和EndingVpn表明了這段虛擬地址空間的起始和結(jié)尾地址。同時屬性LeftChild和RightChild指出了該節(jié)點的左右孩子節(jié)點,用于構(gòu)建整棵VAD樹,具體見圖6所示。
[0049]步驟3:對VAD樹進行遍歷。VAD節(jié)點可分為私有的(private)或映射的(mapped),遍歷時篩選出映射型VAD節(jié)點。
[0050]步驟4:讀取篩選得到的VAD節(jié)點結(jié)構(gòu)_MMVAD中的屬性ControlArea。這是一個指向_C0NTR0L_AREA結(jié)構(gòu)的指針。_C0NTR0L_AREA結(jié)構(gòu)代表的是VAD節(jié)點這段虛擬地址空間的控制信息,包含了這段虛擬地址空間擁有的文件、共享內(nèi)存、緩存數(shù)據(jù)等等的指針,具體結(jié)構(gòu)如圖7所示。根據(jù)ControlArea值得到_C0NTR0L_AREA結(jié)構(gòu)。
[0051]步驟5:讀取_C0NTR0L_AREA的屬性FilePointer。這是一個指向一個文件對象_FILE_0BJECT結(jié)構(gòu)的指針。通過FilePointer值識別共享內(nèi)存塊,即:如果FilePointer的值為null,說明_C0NTR0L_AREA對象指向的是一塊共享內(nèi)存區(qū)。
[0052]步驟6:基于_C0NTR0L_AREA結(jié)構(gòu)中_SEGMENT屬性識別進程間共享內(nèi)存關聯(lián)。_SEGMENT的屬性Ul指向創(chuàng)建這個共享內(nèi)存區(qū)的進程。若ul的值與起始測試進程地址不同,則說明測試進程與創(chuàng)建該共享內(nèi)存的進程有通信。
[0053]進一步,進程間文件通信關聯(lián)方法,具體步驟如下:
[0054]步驟1:根據(jù)前文所述的進程與文件之間的自動關聯(lián)方法將內(nèi)存中的文件與進程關聯(lián)起來。
[0055]步驟2:如果發(fā)現(xiàn)多個進程關聯(lián)同一個文件,即可認為這些進程間存在文件通信關聯(lián)關系。
[0056]進一步,進程間管道通信關聯(lián)方法,具體步驟如下:
[0057]步驟1:在內(nèi)存中定位到每個需調(diào)查進程的_EPR0CESS結(jié)構(gòu)。
[0058]步驟2:讀取_EPR0CESS的屬性ObjectTable,根據(jù)其值獲取進程的句柄表_HANDLE_TABLE0
[0059]步驟3:遍歷_HANDLE_TABLE的屬性HandleTableList指向的雙向鏈接表。找到其中類型為命名管道的句柄,這些句柄就是進程對應的命名管道。
[0060]步驟4:獲取命名管道的名稱。
[0061]步驟5:將使用了同一個名稱的命名管道的不同進程關聯(lián)起來。
[0062]本發(fā)明提供的一套用于自動識別內(nèi)存中各類信息間關聯(lián)關系的方法,進程與其它內(nèi)存信息的關聯(lián)方法:本發(fā)明主要考慮對重構(gòu)犯罪場景較為重要的文件、動態(tài)鏈接庫、用戶及網(wǎng)絡信息。首先,基于windows操作系統(tǒng)的_0BJECT_HEADER結(jié)構(gòu)自動獲得進程與文件之間的關聯(lián)。其次,基于windows操作系統(tǒng)的句柄表_HANDLE_TABLE自動獲得進程與動態(tài)鏈接庫(DLL)之間的關聯(lián)。再次,基于進程的_Τ0ΚΕΝ結(jié)構(gòu)及注冊表自動獲得進程與用戶之間的關聯(lián)。最后,基于_TCPT_0BJECT結(jié)構(gòu)自動獲得進程與網(wǎng)絡信息的關聯(lián)。
[0063]進程與進程關聯(lián)方法:本發(fā)明主要考慮進程間的父子關系、服務關系以及共享內(nèi)存通信、文件通信、管道通信三種通信關系。首先,基于進程的池分配標記及_EPR0CESS中的屬性UniqueProcessId和InheritedFromUniqueProcessId自動識別進程間的父子關聯(lián)。然后,基于進程名稱及所加載的動態(tài)鏈接庫自動識別進程間的服務關聯(lián)。最后,基于_C0NTR0L_AREA結(jié)構(gòu)自動識別共享內(nèi)存通信;基于進程文件關聯(lián)自動識別文件通信;基于進程句柄表_HANDLE_TABLE自動識別管道通信。
[0064]本發(fā)明的有益效果為:(I)與現(xiàn)有針對進程的內(nèi)存分析方法相比,本發(fā)明并非單單地獲取進程,而是能夠以多種角度關聯(lián)進程。(2)本發(fā)明還能將目前針對內(nèi)存中各種信息的內(nèi)存分析方法的分析結(jié)果關聯(lián)到進程上,使得這些分析結(jié)果不是單獨地存在,而是能較為完整地展示出內(nèi)存中數(shù)據(jù)的關聯(lián)關系,從更高的語義層次揭示原始證據(jù)的含義。(3)基于本發(fā)明事先自動建立的內(nèi)存中各類信息的關聯(lián),犯罪場景重構(gòu)將變得更加容易。(4)基于某個已知證據(jù)以及本發(fā)明識別出的關聯(lián)關系,能夠順藤摸瓜找出更多的犯罪行為。(5)基于本發(fā)明識別出的一些異常的關聯(lián)關系(例如outlook讀取存儲了用戶密碼的password文件)還可以識別潛藏在正常行為中的犯罪線索。(6)本發(fā)明提出的關聯(lián)方法可通過不同證據(jù)的彼此佐證,增強取證結(jié)果的可靠性。
【專利附圖】
【附圖說明】
[0065]圖1為進程與文件關聯(lián)流程;
[0066]圖2為_0BJECT_HEADER對象結(jié)構(gòu)示意圖;
[0067]圖3為進程與動態(tài)鏈接庫關聯(lián)流程;
[0068]圖4為進程的_EPR0CESS結(jié)構(gòu)示意圖;
[0069]圖5為句柄表_HANDLE_TABLE結(jié)構(gòu)示意圖;
[0070]圖6為進程與用戶關聯(lián)流程;
[0071]圖7為_Τ0ΚΕΝ結(jié)構(gòu)示意圖;
[0072]圖8為進程與網(wǎng)絡信息關聯(lián)流程;
[0073]圖9為_TCPT_0BJECT結(jié)構(gòu)示意圖;
[0074]圖10為進程間父子關聯(lián)流程;
[0075]圖11為基于名稱相似度的進程間服務關聯(lián)流程;
[0076]圖12為基于動態(tài)鏈接庫的進程間服務關聯(lián)流程;
[0077]圖13為進程間共享內(nèi)存通信關聯(lián)流程;
[0078]圖14為_MMVAD結(jié)構(gòu)示意圖;
[0079]圖15 為 _C0NTR0L_AREA 結(jié)構(gòu)示意圖;
[0080]圖16為進程間文件通信關聯(lián)流程;
[0081]圖17為進程間管道通信關聯(lián)流程;
圖18關聯(lián)進程與文件、關聯(lián)進程與動態(tài)鏈接庫、關聯(lián)進程與用戶以及關聯(lián)進程與網(wǎng)絡息的流程;
圖19識別進程間父子關聯(lián)、識別進程間服務關聯(lián)、識別進程間通訊關聯(lián)流程。
【具體實施方式】
[0082]為了更了解本發(fā)明的技術內(nèi)容,特舉具體實施例并配合所附圖式說明如下。
[0083]圖1、圖2為進程與文件之間的自動關聯(lián)方法涉及的數(shù)據(jù)結(jié)構(gòu)與流程圖。流程步驟如下:
[0084]步驟1:在內(nèi)存中定位到每個需分析的文件對象。
[0085]步驟2:從對象基址向前0x018偏移量,讀取每個文件對象的_0BJECT_HEADER對象(其結(jié)構(gòu)如圖2所示)。
[0086]步驟3:讀取_0BJECT_HEADER對象的HandleInfoOffset屬性,并根據(jù)其值獲取文件對象的對應句柄信息。
[0087]步驟4:讀取句柄信息的第一個字。其內(nèi)容即為擁有該文件的進程對象的基地址。
[0088]步驟5:根據(jù)步驟4中獲得的地址信息讀取進程對象并建立進程與文件之間的關聯(lián)。
[0089]圖3、圖4、圖5為進程與動態(tài)鏈接庫(DLL)之間的自動關聯(lián)方法涉及的數(shù)據(jù)結(jié)構(gòu)與流程圖。流程步驟如下:
[0090]步驟1:在內(nèi)存中定位到每個需調(diào)查進程的_EPR0CESS結(jié)構(gòu)(其數(shù)據(jù)結(jié)構(gòu)如圖4所示)O
[0091]步驟2:讀取_EPR0CESS的屬性ObjectTable,根據(jù)其值獲取進程的句柄表_HANDLE_TABLE (其結(jié)構(gòu)如圖5所示)。
[0092]步驟3:遍歷_HANDLE_TABLE的屬性HandleTableList指向的雙向鏈接表。找到其中類型為File,名稱的后綴是dll的句柄,這些句柄就是進程載入的動態(tài)鏈接庫文件。
[0093]圖6、圖7為進程與用戶之間的自動關聯(lián)方法涉及的數(shù)據(jù)結(jié)構(gòu)與流程圖。流程步驟如下:
[0094]步驟1:在內(nèi)存中定位到每個需調(diào)查進程的_EPR0CESS結(jié)構(gòu)。
[0095]步驟2:根據(jù)_EPR0CESS中的屬性Token值獲取進程的_Τ0ΚΕΝ結(jié)構(gòu)(其結(jié)構(gòu)如圖7所示)。進程的很多安全有關的信息都保存在_Τ0ΚΕΝ結(jié)構(gòu)中,包括用戶和組的安全標識符(SID)。
[0096]步驟3:讀取_Τ0ΚΕΝ結(jié)構(gòu)中記錄的用戶和組的安全標識符(SID)。
[0097]步驟4:基于Windows的系統(tǒng)通用安全標識符文檔過濾掉通用標示符,余下的即是實際登陸用戶的安全標識符。
[0098]步驟5:在注冊表中找到 HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVers1n\ProfileList項,其中記錄了所有用戶的安全標識符。
[0099]步驟6:根據(jù)篩選后余下的非通用安全標示符的ProfilelmagePath屬性即可提取出與其對應的用戶名,從而可將進程與具體用戶關聯(lián)起來。
[0100]圖8、圖9為進程與網(wǎng)絡信息之間的自動關聯(lián)方法涉及的數(shù)據(jù)結(jié)構(gòu)與流程圖。流程步驟如下:
[0101]步驟1:通過基于特征分析的掃描方法定位結(jié)構(gòu)_TCPT_0BJECT (其結(jié)構(gòu)如圖9所示),該結(jié)構(gòu)在內(nèi)存中出現(xiàn)時帶有特殊的標識TCPT (0x54435054)。
[0102]步驟2:根據(jù)_TCPT_0BJECT中的屬性Pid將每個_TCPT_0BJECT關聯(lián)到對應的進程。
[0103]步驟3:根據(jù)每個_TCPT_0BJECT的Next屬性找到下一個TCP對象,重復步驟(2)。
[0104]圖10為進程間的父子關聯(lián)方法涉及的流程圖。流程步驟如下:
[0105]步驟1:找到內(nèi)存中的所有進程。為識別隱藏進程,通過基于特征(signature)的掃描技術掃描進程的池分配標記Proc,這樣就能保證獲取的進程完整。
[0106]步驟2:在內(nèi)存中定位到每個需調(diào)查進程的_EPR0CESS結(jié)構(gòu)。
[0107]步驟3:讀取 _EPR0CESS 中的屬性 UniqueProcessId 和InheritedFromUniqueProcessId,它們分別表示了進程自己的id和其父進程的id。根據(jù)進程id之間的父子關系即可將進程以父子關系關聯(lián)起來。
[0108]圖11為基于名稱相似度的進程間服務關聯(lián)所涉及流程。流程步驟如下:
[0109]步驟1:找到內(nèi)存中的所有進程。為識別隱藏進程,通過基于特征(signature)的掃描技術掃描進程的池分配標記Proc,這樣就能保證獲取的進程完整。
[0110]步驟2:識別進程名稱。
[0111]步驟3:找出所有名稱中有相同的前綴或后綴的進程,并建立關聯(lián)。
[0112]圖12為基于動態(tài)鏈接庫的進程間服務關聯(lián)所涉及流程。流程步驟如下:
[0113]步驟1:根據(jù)前文所述的進程與動態(tài)鏈接庫(DLL)之間的自動關聯(lián)方法獲取每個進程載入的動態(tài)鏈接庫列表。
[0114]步驟2:根據(jù)進程及其動態(tài)鏈接庫文件,使用無需事先指定聚類個數(shù)的聚類算法(例如:DBSCAN算法)來對進程進行聚類。具體步驟如下:
[0115]步驟2.1,選擇關鍵dll并用其建模每個進程。其中,關鍵DLL的選擇原則是:首先,選擇選取出現(xiàn)頻度較高的dll。其次,如果文件A出現(xiàn),文件B和C必定會出現(xiàn),那么在出現(xiàn)文件A的時候只需考慮A而不用考慮B和C。建模進程的具體方法是:基于關鍵dll,將每個進程建模為一個η元組。其定義如下:
[0116]定義I若把η個關鍵dll組織成一個有序集合,那么每個進程對應的η-元組是一個由η個O或I組成的序列,其中I表示進程加載了對應序號的關鍵dll,O表示該進程未加載該dll。
[0117]步驟2.2,為聚類算法設置合適的參數(shù)。例如:若選擇DBSCAN算法,則可設置epsilon 的值為 4.0, minPoints 的值為 2。
[0118]步驟2.3,用選定的聚類算法基于第一步建立的模型聚類所有進程,并輸出結(jié)果。
[0119]圖13、圖14、圖15為進程間共享內(nèi)存通信關聯(lián)方法涉及的數(shù)據(jù)結(jié)構(gòu)與流程圖。流程步驟如下:
[0120]步驟1:在內(nèi)存中定位到每個需調(diào)查進程的_EPR0CESS結(jié)構(gòu)。
[0121]步驟2:根據(jù)_EPR0CESS對象的屬性VadRoot獲取進程的VAD樹的根節(jié)點的地址。VAD樹中每個節(jié)點都是一個_MMVAD結(jié)構(gòu),它代表了內(nèi)存分配給進程的某段虛擬地址空間,屬性StartingVpn和EndingVpn表明了這段虛擬地址空間的起始和結(jié)尾地址。同時屬性LeftChild和RightChild指出了該節(jié)點的左右孩子節(jié)點,用于構(gòu)建整棵VAD樹,具體見圖6所示。
[0122]步驟3:對VAD樹進行遍歷。VAD節(jié)點可分為私有的(private)或映射的(mapped),遍歷時篩選出映射型VAD節(jié)點。
[0123]步驟4:讀取篩選得到的VAD節(jié)點結(jié)構(gòu)_MMVAD中的屬性ControlArea。這是一個指向_C0NTR0L_AREA結(jié)構(gòu)的指針。_C0NTR0L_AREA結(jié)構(gòu)代表的是VAD節(jié)點這段虛擬地址空間的控制信息,包含了這段虛擬地址空間擁有的文件、共享內(nèi)存、緩存數(shù)據(jù)等等的指針,具體結(jié)構(gòu)如圖7所示。根據(jù)ControlArea值得到_C0NTR0L_AREA結(jié)構(gòu)。
[0124]步驟5:讀取_C0NTR0L_AREA的屬性FilePointer。這是一個指向一個文件對象_FILE_0BJECT結(jié)構(gòu)的指針。通過FilePointer值識別共享內(nèi)存塊,即:如果FilePointer的值為null,說明_C0NTR0L_AREA對象指向的是一塊共享內(nèi)存區(qū)。
[0125]步驟6:基于_C0NTR0L_AREA結(jié)構(gòu)中_SEGMENT屬性識別進程間共享內(nèi)存關聯(lián)。_SEGMENT的屬性ul指向創(chuàng)建這個共享內(nèi)存區(qū)的進程。若ul的值與起始測試進程地址不同,則說明測試進程與創(chuàng)建該共享內(nèi)存的進程有通信。
[0126]圖16為進程間文件通信關聯(lián)所涉及流程。流程步驟如下:
[0127]步驟1:根據(jù)前文所述的進程與文件之間的自動關聯(lián)方法將內(nèi)存中的文件與進程關聯(lián)起來。
[0128]步驟2:如果發(fā)現(xiàn)多個進程關聯(lián)同一個文件,即可認為這些進程間存在文件通信關聯(lián)關系。
[0129]圖17為進程間管道通信關聯(lián)所涉及流程。流程步驟如下:
[0130]步驟1:在內(nèi)存中定位到每個需調(diào)查進程的_EPR0CESS結(jié)構(gòu)。
[0131]步驟2:讀取_EPR0CESS的屬性ObjectTable,根據(jù)其值獲取進程的句柄表_HANDLE_TABLE0
[0132]步驟3:遍歷_HANDLE_TABLE的屬性HandleTableList指向的雙向鏈接表。找到其中類型為命名管道的句柄,這些句柄就是進程對應的命名管道。
[0133]步驟4:獲取命名管道的名稱。
[0134]步驟5:將使用了同一個名稱的命名管道的不同進程關聯(lián)起來。
【權(quán)利要求】
1.一種基于數(shù)據(jù)關聯(lián)的自動內(nèi)存證據(jù)分析方法,其特征在于:借助關鍵數(shù)據(jù)結(jié)構(gòu)分析以及聚類方法全面分析了進程、文件、用戶、動態(tài)鏈接庫等主要內(nèi)存數(shù)據(jù)之間的各種關系;對于進程與其他信息之間,依次自動識別進程與文件關聯(lián)、進程與動態(tài)鏈接庫關聯(lián)、進程與用戶關聯(lián)以及進程與網(wǎng)絡報關聯(lián);對于進程與進程之間的關聯(lián),依次可自動識別進程間父子關聯(lián)、進程間服務關聯(lián)和進程間通信關聯(lián)。
2.根據(jù)權(quán)利要求1所述的基于數(shù)據(jù)關聯(lián)的自動內(nèi)存證據(jù)分析方法,其特征是所述進程與文件之間的自動關聯(lián)方法步驟如下: 步驟1:在內(nèi)存中定位到每個需分析的文件對象; 步驟2:從對象基址向前0x018偏移量,讀取每個文件對象的_OBJECT_HEADER對象;步驟3:讀取_OBJECT_HEADER對象的HandleInfoOfTset屬性,并根據(jù)其值獲取文件對象的對應句柄信息; 步驟4:讀取句柄信息的第一個字;其內(nèi)容即為擁有該文件的進程對象的基地址; 步驟5:根據(jù)步驟4中獲得的地址信息讀取進程對象并建立進程與文件之間的關聯(lián)。
3.根據(jù)權(quán)利要求1所述的基于數(shù)據(jù)關聯(lián)的自動內(nèi)存證據(jù)分析方法,其特征是進程與動態(tài)鏈接庫(DLL)之間的自動關聯(lián)方法具體步驟如下: 步驟1:在內(nèi)存中定位到每個需調(diào)查進程的_EPR0CESS結(jié)構(gòu); 步驟2:讀取_EPR0CESS的屬性ObjectTable,根據(jù)其值獲取進程的句柄表_HANDLE_TABLE ; 步驟3:遍歷_HANDLE_TABLE的屬性HandleTableList指向的雙向鏈接表;找到其中類型為File,名稱的后綴是dll的句柄,這些句柄就是進程載入的動態(tài)鏈接庫文件。
4.根據(jù)權(quán)利要求1所述的基于數(shù)據(jù)關聯(lián)的自動內(nèi)存證據(jù)分析方法,其特征是進程與用戶之間的自動關聯(lián)方法具體步驟如下: 步驟1:在內(nèi)存中定位到每個需調(diào)查進程的_EPR0CESS結(jié)構(gòu); 步驟2:根據(jù)_EPR0CESS中的屬性Token值獲取進程的_Τ0ΚΕΝ結(jié)構(gòu);進程的很多安全有關的信息都保存在_Τ0ΚΕΝ結(jié)構(gòu)中,包括用戶和組的安全標識符(SID); 步驟3:讀取_Τ0ΚΕΝ結(jié)構(gòu)中記錄的用戶和組的安全標識符(SID); 步驟4:基于Windows的系統(tǒng)通用安全標識符文檔過濾掉通用標示符,余下的即是實際登陸用戶的安全標識符; 步驟 5:在注冊表中找到 HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVers1n\ProfileList項,其中記錄了所有用戶的安全標識符; 步驟6:根據(jù)篩選后余下的非通用安全標示符的ProfilelmagePath屬性即可提取出與其對應的用戶名,從而可將進程與具體用戶關聯(lián)起來。
5.根據(jù)權(quán)利要求1所述的基于數(shù)據(jù)關聯(lián)的自動內(nèi)存證據(jù)分析方法,其特征是進程與網(wǎng)絡信息之間的自動關聯(lián)方法具體步驟如下: 步驟1:通過基于特征分析的掃描方法定位結(jié)構(gòu)_TCPT_0BJECT,該結(jié)構(gòu)在內(nèi)存中出現(xiàn)時帶有特殊的標識TCPT即0x54435054 ; 步驟2:根據(jù)_TCPT_0BJECT中的屬性Pid將每個_TCPT_0BJECT關聯(lián)到對應的進程; 步驟3:根據(jù)每個_TCPT_0BJECT的Next屬性找到下一個TCP對象,重復步驟(2)。
6.根據(jù)權(quán)利要求1所述的基于數(shù)據(jù)關聯(lián)的自動內(nèi)存證據(jù)分析方法,其特征是進程間的父子關聯(lián)方法具體步驟如下: 步驟1:找到內(nèi)存中的所有進程;為識別隱藏進程,通過基于特征(Signature)的掃描技術掃描進程的池分配標記Proc,這樣就能保證獲取的進程完整; 步驟2:在內(nèi)存中定位到每個需調(diào)查進程的_EPR0CESS結(jié)構(gòu); 步驟3: 讀取_EPR0CESS中 的屬性UniqueProcessId和InheritedFromUniqueProcessId,它們分別表示了進程自己的id和其父進程的id ;根據(jù)進程id之間的父子關系即可將進程以父子關系關聯(lián)起來。
7.根據(jù)權(quán)利要求1所述的基于數(shù)據(jù)關聯(lián)的自動內(nèi)存證據(jù)分析方法,其特征是進程間的服務關聯(lián)具體步驟如下: 方法一,基于名稱相似度的進程間服務關聯(lián)步驟: 步驟1:找到內(nèi)存中的所有進程;為識別隱藏進程,通過基于特征(signature)的掃描技術掃描進程的池分配標記Proc,這樣就能保證獲取的進程完整; 步驟2:識別進程名稱; 步驟3:找出所有名稱中有相同的前綴或后綴的進程,并建立關聯(lián); 方法二,基于動態(tài)鏈接庫的進程間服務關聯(lián)具體步驟: 步驟1:根據(jù)前文所述的進程與動態(tài)鏈接庫(DLL)之間的自動關聯(lián)方法獲取每個進程載入的動態(tài)鏈接庫列表; 步驟2:根據(jù)進程及其動態(tài)鏈接庫文件,使用無需事先指定聚類個數(shù)的聚類算法來對進程進行聚類;具體步驟如下: 步驟2.1,選擇關鍵dll并用其建模每個進程;其中,關鍵DLL的選擇原則是:首先,選擇選取出現(xiàn)頻度較高的dll ;其次,如果文件A出現(xiàn),文件B和C必定會出現(xiàn),那么在出現(xiàn)文件A的時候只需考慮A而不用考慮B和C ;建模進程的具體方法是:基于關鍵dll,將每個進程建模為一個η元組;其定義如下: 定義I若把η個關鍵dll組織成一個有序集合,那么每個進程對應的η-元組是一個由η個O或I組成的序列,其中I表示進程加載了對應序號的關鍵dll,O表示該進程未加載該dll ; 步驟2.2,為聚類算法設置合適的參數(shù);例如:若選擇DBSCAN算法,則可設置epsilon的值為4.0,minPoints的值為2 ; 步驟2.3,用選定的聚類算法基于第一步建立的模型聚類所有進程,并輸出結(jié)果。
8.根據(jù)權(quán)利要求1所述的基于數(shù)據(jù)關聯(lián)的自動內(nèi)存證據(jù)分析方法,其特征是進程間的通信關聯(lián)方法,包含共享內(nèi)存通信、文件通信及管道通信的關聯(lián); 進程間共享內(nèi)存通信關聯(lián)方法具體步驟如下: 步驟1:在內(nèi)存中定位到每個需調(diào)查進程的_EPR0CESS結(jié)構(gòu); 步驟2:根據(jù)_EPR0CESS對象的屬性VadRoot獲取進程的VAD樹的根節(jié)點的地址;VAD樹中每個節(jié)點都是一個_MMVAD結(jié)構(gòu),它代表了內(nèi)存分配給進程的某段虛擬地址空間,屬性StartingVpn和EndingVpn表明了這段虛擬地址空間的起始和結(jié)尾地址;同時屬性LeftChild和RightChild指出了該節(jié)點的左右孩子節(jié)點,用于構(gòu)建整棵VAD樹,具體見圖6所示; 步驟3:對VAD樹進行遍歷;VAD節(jié)點可分為私有的(private)或映射的(mapped),遍歷時篩選出映射型VAD節(jié)點; 步驟4:讀取篩選得到的VAD節(jié)點結(jié)構(gòu)_MMVAD中的屬性ControlArea ;這是一個指向_C0NTR0L_AREA結(jié)構(gòu)的指針;_C0NTR0L_AREA結(jié)構(gòu)代表的是VAD節(jié)點這段虛擬地址空間的控制信息,包含了這段虛擬地址空間擁有的文件、共享內(nèi)存、緩存數(shù)據(jù)等等的指針,具體結(jié)構(gòu)如圖7所示;根據(jù)ControlArea值得到_C0NTR0L_AREA結(jié)構(gòu); 步驟5:讀取_C0NTR0L_AREA的屬性FilePointer ;這是一個指向一個文件對象_FILE_OBJECT結(jié)構(gòu)的指針;通過FilePointer值識別共享內(nèi)存塊,即:如果FilePointer的值為nu11,說明_C0NTR0L_AREA對象指向的是一塊共享內(nèi)存區(qū); 步驟6:基于_C0NTR0L_AREA結(jié)構(gòu)中_SEGMENT屬性識別進程間共享內(nèi)存關聯(lián);_SEGMENT的屬性ul指向創(chuàng)建這個共享內(nèi)存區(qū)的進程;若111的值與起始測試進程地址不同,則說明測試進程與創(chuàng)建該共享內(nèi)存的進程有通信。 進程間文件通信關聯(lián)方法步驟如下: 步驟1:根據(jù)前文所述的進程與文件之間的自動關聯(lián)方法將內(nèi)存中的文件與進程關聯(lián)起來; 步驟2:如果發(fā)現(xiàn)多個進程關聯(lián)同一個文件,即可認為這些進程間存在文件通信關聯(lián)關系; 進程間管道通信關聯(lián)方法具體步驟如下: 步驟1:在內(nèi)存中定位到每個需調(diào)查進程的_EPR0CESS結(jié)構(gòu); 步驟2:讀取_EPR0CESS的屬性ObjectTable,根據(jù)其值獲取進程的句柄表_HANDLE_TABLE ; 步驟3:遍歷_HANDLE_TABLE的屬性HandleTableList指向的雙向鏈接表;找到其中類型為命名管道的句柄,這些句柄就是進程對應的命名管道; 步驟4:獲取命名管道的名稱; 步驟5:將使用了同一個名稱的命名管道的不同進程關聯(lián)起來。
【文檔編號】G06F21/52GK104392171SQ201410696545
【公開日】2015年3月4日 申請日期:2014年11月27日 優(yōu)先權(quán)日:2014年11月27日
【發(fā)明者】伏曉, 駱斌 申請人:南京大學