李炳龍,周振宇,張宇,張和禹,常朝穩(wěn)
(信息工程大學密碼工程學院,河南 鄭州 450001)
隨著信息技術(shù)的迅猛發(fā)展,網(wǎng)絡(luò)犯罪事件頻繁發(fā)生,例如電信詐騙、信息勒索以及APT(advanced persistent threat)攻擊等。數(shù)字取證調(diào)查已經(jīng)成為制止和威懾網(wǎng)絡(luò)犯罪的關(guān)鍵技術(shù)手段之一[1]。磁盤取證是數(shù)字取證領(lǐng)域中一種重要的調(diào)查技術(shù),對于數(shù)字犯罪調(diào)查具有重要意義。但隨著反取證技術(shù)的發(fā)展,新型“無文件攻擊”[2]等網(wǎng)絡(luò)威脅僅在內(nèi)存中運行,不在磁盤上留下任何痕跡信息,具有更強的隱蔽性和復雜性。此外,磁盤容量的不斷增大導致磁盤取證具有局限性。內(nèi)存中含有與網(wǎng)絡(luò)攻擊威脅有關(guān)的大量實時證據(jù)和線索,而且內(nèi)存中的網(wǎng)絡(luò)連接、系統(tǒng)加載的模塊以及執(zhí)行的指令等證據(jù)信息和磁盤中的證據(jù)不同,更能說明網(wǎng)絡(luò)攻擊威脅發(fā)生的場景。因此內(nèi)存取證成為當前數(shù)字調(diào)查領(lǐng)域的重要研究方向[3-5]。
目前,內(nèi)存取證主要聚焦于基于內(nèi)存映像的進程、網(wǎng)絡(luò)連接信息、剪貼板數(shù)據(jù)、命令行歷史、口令等證據(jù)的提取和分析[4-7],而針對內(nèi)存映像中數(shù)據(jù)文件雕刻技術(shù)研究較少。在早期內(nèi)存取證實踐工作中,調(diào)查人員利用strings、WinHex 等工具[8],從內(nèi)存映像中搜索口令、IP 地址、Email 地址等證據(jù)信息,該方法的前提是必須知道所要查找信息的內(nèi)容。之后,有研究深入討論和分析了基于內(nèi)存映像精確提取證據(jù)的可行性[9-11]。Kornblum[12]提出一種內(nèi)存映像中進程對應的可執(zhí)行文件的提取方法,通過使用指針來重構(gòu)可執(zhí)行文件,并分析了由于可執(zhí)行文件運行時的多種變化因素,導致提取的可執(zhí)行文件與其在磁盤上相應的文件不完全相同的問題。此外,Dolan-gavitt[13]利用虛擬地址描述符(VAD,virtual address descriptor)樹來定位、解析結(jié)構(gòu),遍歷進程的虛擬內(nèi)存空間,并為取證調(diào)查人員提供內(nèi)存轉(zhuǎn)儲中有用的信息。Van-baar 等[14]進一步提出了基于VAD 的內(nèi)存數(shù)據(jù)文件提取方法,即通過遍歷VAD 樹定位共享文件,然后查找對象表,進而找到文件信息。以上2 種方法具有局限性,即如果進程關(guān)閉或者內(nèi)存中進程結(jié)構(gòu)信息被覆蓋將不能有效定位VAD 信息,從而造成文件信息不能恢復。有學者提出了基于頁面哈希比較的數(shù)據(jù)文件提取方法[15],該方法計算內(nèi)存映像中頁面哈希,并和磁盤中文件對應頁的哈希進行比較,提取內(nèi)存映像中的文件碎片,進而重建文件內(nèi)容,要求取證調(diào)查人員必須知道需要重建文件的內(nèi)容,而現(xiàn)實網(wǎng)絡(luò)攻擊調(diào)查中調(diào)查人員并不了解內(nèi)存中的數(shù)據(jù)文件內(nèi)容。此外,當磁盤中文件映射到內(nèi)存頁面時,內(nèi)存中文件數(shù)據(jù)有可能被修改,導致內(nèi)存頁面哈希值不同于磁盤上對應頁面,從而造成內(nèi)存文件提取無效。Gao等[16]研究了實時系統(tǒng)中QQ 信息取證方法,從中獲取通信列表、QQ 賬號、聊天記錄、QQ 討論組、顯示名稱,該方法通過逆向分析QQ 的內(nèi)存結(jié)構(gòu)來實現(xiàn),但該方法僅適用于QQ 應用程序,不具有通用性。Volatility 內(nèi)存取證框架和FATKit 內(nèi)存取證分析工具套件能夠從易失性內(nèi)存映像中提取取證痕跡,但更多集中于內(nèi)存映像中進程、線程等結(jié)構(gòu),以及可執(zhí)行文件提取[17]。此外,雖然基于磁盤的文件雕刻算法有很多,例如Foremost、Scalpel、Test_disk、EnCase 等[18-20],但是應用這些算法的實驗結(jié)果表明,生成的文件雕刻結(jié)果精確度極低。綜上所述,基于內(nèi)存映像的碎片數(shù)據(jù)文件雕刻算法的通用性問題沒有得到很好的研究。為了解決基于內(nèi)存映像的碎片文件雕刻算法的通用性問題,探索物理內(nèi)存中新的文件雕刻機制具有非常重要的理論意義和現(xiàn)實價值[21-23]。
本文主要研究工作如下。
1) 建立了基于內(nèi)存映像的碎片文件雕刻模型。從集合論的角度,分析了內(nèi)存映像碎片集合中元素的特性。從內(nèi)存文件構(gòu)成原理,給出了內(nèi)存文件的形式化表達方式,提出了內(nèi)存碎片文件雕刻問題可以抽象為內(nèi)存碎片集合到內(nèi)存文件的映射問題,設(shè)計了內(nèi)存碎片文件雕刻模型。
2) 設(shè)計了基于文件對象結(jié)構(gòu)鏈逆向的內(nèi)存碎片文件雕刻算法。利用十六進制編輯器分析了內(nèi)存映像中文件對象及其相關(guān)結(jié)構(gòu)的特征字段,設(shè)計了基于結(jié)構(gòu)鏈逆向的內(nèi)存碎片文件雕刻算法,解決了內(nèi)存文件碎片子集中元素確定子問題、文件碎片子集中元素連接關(guān)系順序子問題,以及文件元數(shù)據(jù)構(gòu)建子問題。
3) 實驗結(jié)果表明,基于結(jié)構(gòu)鏈逆向的內(nèi)存碎片文件雕刻算法通用性強,不但能夠雕刻內(nèi)存中文件內(nèi)容信息,而且能夠雕刻文件元數(shù)據(jù)信息,例如文件來源、文件名稱等,還適用于應用進程關(guān)閉時的文件雕刻情況。實驗分析進一步表明,通過對雕刻的碎片文件的內(nèi)部結(jié)構(gòu)進行深度分析,能夠找到網(wǎng)絡(luò)攻擊過程中病毒木馬的感染過程,這對于實時取證調(diào)查具有重要意義。
內(nèi)存取證目前是數(shù)字取證領(lǐng)域重點研究方向之一[6-7]。早期內(nèi)存取證研究進展較慢,為此2005 年DFRWS(Digital Forensic Research Workshop)發(fā)布了物理內(nèi)存取證分析挑戰(zhàn),鼓勵研究人員開展內(nèi)存取證技術(shù)研究[24]。內(nèi)存取證分為物理內(nèi)存獲取和物理內(nèi)存分析2 個階段。內(nèi)存獲取分為基于硬件和基于軟件的2 種方法。目前,基于硬件的內(nèi)存獲取典型工具是基于PCI 擴展機制的Tribble 工具[9]。該方法優(yōu)點是在獲取內(nèi)存數(shù)據(jù)時不會造成內(nèi)存數(shù)據(jù)的改變,但是其局限性在于必須在取證事件發(fā)生之前安裝到被感染機器中。基于軟件的內(nèi)存獲取方法則較普遍,可以根據(jù)事件響應的需要靈活安裝。Guidance 公司發(fā)布的EnCase 6.11 以上取證工具套件中含有WinEn 物理內(nèi)存映像工具,并且支持Windows 32 位和64 位操作系統(tǒng),能夠生成3 種不同壓縮級別的內(nèi)存映像[20]。ManTechs 公司發(fā)布了MDD 內(nèi)存獲取工具,該工具根據(jù)GPL(GNU general public license)免費發(fā)布,能夠獲取物理內(nèi)存映像,并且以原始內(nèi)存格式進行轉(zhuǎn)儲。Win32dd 是一個完全開源的內(nèi)存映像獲取工具[25],該工具基于Windows內(nèi)核設(shè)計實現(xiàn),適用于Windows2003或Vista系統(tǒng)的內(nèi)存獲取,獲取的內(nèi)存映像是原始格式。
內(nèi)存取證分析技術(shù)研究目前主要集中于進程注冊表等內(nèi)核結(jié)構(gòu)逆向分析重建。2005 年,DFRWS的內(nèi)存取證挑戰(zhàn)產(chǎn)生了學術(shù)界認為開創(chuàng)性的3 個研究成果[24]:一是Mariusz 提出的進程和模塊枚舉方法;二是Chris 等設(shè)計的memparser 工具;三是George 等設(shè)計的Kntlist 工具。這3 個工具基本原理是逆向分析對應版本的Windows 進程結(jié)構(gòu),在內(nèi)存映像文件中搜索全局變量,雕刻重建進程及其雙向鏈表。這些方法局限性在于不能雕刻內(nèi)存映像中不在雙向鏈表中的進程等對象。為此,Schuster[24]通過分析內(nèi)存中進程和線程結(jié)構(gòu),提出了一種基于搜索模式特征的進程和線程雕刻算法,通過掃描內(nèi)存映像文件,定位并重建相應的對象,能夠雕刻由于DKOM(direct kernel object manipulation)攻擊隱藏和已終止的進程和線程。有學者通過逆向分析注冊表的內(nèi)存分配單元,設(shè)計并實現(xiàn)了基于池簽名特征的注冊表雕刻工具[22]。以上算法和工具僅能支持少量Windows 系統(tǒng)版本的內(nèi)存映像。Volatility 是數(shù)字取證領(lǐng)域經(jīng)典的內(nèi)存取證分析框架,應用了Schuster 的基于簽名特征掃描的對象雕刻技術(shù)[17]。為了支持更多Windows 操作系統(tǒng)版本的內(nèi)存映像,Volatility 引入了基于內(nèi)核模板的機制,即在該框架集成多個Windows 操作系統(tǒng)主版本的內(nèi)核結(jié)構(gòu)信息,從而改善不同Windows 操作系統(tǒng)版本的內(nèi)存映像數(shù)據(jù)雕刻。然而,該方法并未考慮Windows 操作系統(tǒng)次版本變化(例如同一主版本因安全補丁更新等因素產(chǎn)生的不同次版本)而導致操作系統(tǒng)內(nèi)核結(jié)構(gòu)模板的改變,從而造成內(nèi)存映像雕刻信息錯誤或者遺漏。而且基于簽名特征掃描技術(shù)復雜且易發(fā)生錯誤[26]。Okolica 等[27]利用嵌入內(nèi)存映像中的調(diào)試結(jié)構(gòu)和程序數(shù)據(jù)庫(PDB,program database)構(gòu)建了一個Windows 操作系統(tǒng)不可知的內(nèi)存映像數(shù)據(jù)雕刻算法,該算法支持任意Windows 操作系統(tǒng)內(nèi)存映像,能夠提取出進程、注冊表以及網(wǎng)絡(luò)活動等信息。
上述研究在內(nèi)存進程重建、注冊表逆向分析等方面取得了不同研究進展,并且也有針對內(nèi)存映射文件提取方法進行的研究,而針對內(nèi)存映像中數(shù)據(jù)文件雕刻技術(shù)研究較少,這也是本文重點要解決的問題。
內(nèi)存數(shù)據(jù)文件是doc、pdf、xls、txt 以及jpg 等類型文件在內(nèi)存中由用戶進程或攻擊進程打開和訪問的文件。內(nèi)存文件由兩部分構(gòu)成,分別為文件內(nèi)容信息和文件名(文件路徑)等元數(shù)據(jù)信息。這些信息含有與網(wǎng)絡(luò)犯罪有關(guān)的重要證據(jù)。內(nèi)存數(shù)據(jù)文件的存儲特性與磁盤中文件的存儲狀態(tài)和規(guī)律不同,磁盤中文件構(gòu)成單元(簇)多是連續(xù)存放,而內(nèi)存文件構(gòu)成單元(內(nèi)存頁面)多是不連續(xù)存放,這導致內(nèi)存文件構(gòu)成單元嚴重碎片化。
本文假設(shè)在t時刻獲取內(nèi)存映像,構(gòu)成內(nèi)存映像的頁面稱之為“碎片”,那么內(nèi)存映像可以抽象為一個碎片集合S= {f1,f2,…,fi,…,fj,…,fn},其中,fi表示內(nèi)存映像中的任意一個內(nèi)存碎片,n表示集合S的大小,并且n值取決于內(nèi)存介質(zhì)容量以及內(nèi)存頁面的大小(在內(nèi)存容量一定的情況下,頁面越大,則內(nèi)存碎片集合S中元素個數(shù)就越小,通常情況下內(nèi)存頁面大小為4 KB,即4 096 B)。集合S具有如下特性。
1) 確定性。對于1≤i≤n,fi表示集合S中的內(nèi)存碎片元素,用f i∈S表示,這表明fi是在t時刻獲取的內(nèi)存映像中確定的一個元素,而不是其他時刻獲得的內(nèi)存映像中的元素。
2) 互異性。對于1 ≤i,j≤n,f i,fj表示集合S中的內(nèi)存碎片,如果i≠j,那么fi∩f j=φ,表示碎片集合S中2 個不同碎片在內(nèi)存空間上不存在交集,并且2 個碎片的內(nèi)容及其元數(shù)據(jù)(例如內(nèi)存碎片的地址信息等)都不相同,即集合中的任何2 個元素都不相同,或者在同一集合里不能出現(xiàn)相同的元素。
3) 無序性。集合中的元素是平等的,沒有先后順序。因此判斷2 個集合是否相同,只需要比較它們的元素是否一樣,不需要考察排列順序是否一樣。但由于內(nèi)存數(shù)據(jù)的動態(tài)變化性,以及內(nèi)存映像獲取的時間變化性,使不同時刻的內(nèi)存碎片集合都是不同的。
根據(jù)操作系統(tǒng)運行原理,內(nèi)存文件由多個頁面構(gòu)成。由內(nèi)存映像碎片集合S中元素特性可知,內(nèi)存文件是S的一個子集,即文件碎片子集,用filei表示,其中0≤i≤k,k表示內(nèi)存碎片中最大文件個數(shù)。此外,由于內(nèi)存文件的頁面碎片之間存在一定的順序關(guān)系,如果內(nèi)存文件的頁面碎片之間的順序破壞,則導致內(nèi)存文件損壞或者內(nèi)容變化。為此,本文將內(nèi)存文件抽象為一個序列,用(filei,k)表示。

其中,1≤j≤m,m表示filei碎片子集中元素個數(shù)。(filei,k)具有如下特性。
1) 有限性,即(filei,k)中的項是有限的,這是根據(jù)文件構(gòu)成原理確定的,盡管理論上文件長度可以無限,但不具有實際意義。
2) 有序性,即(filei,k)中項與項之間的關(guān)系是有序的,這種有序構(gòu)成了文件的內(nèi)在關(guān)系,具體可以體現(xiàn)為內(nèi)存頁面間的結(jié)構(gòu)關(guān)系、語義關(guān)系、簽名特征關(guān)系。例如,fi,1是該序列中的第一項,表示文件頭碎片;fi,k是該序列最后一項,表示文件尾碎片,這通常是根據(jù)文件類型頭尾簽名特征確定的。
3) 元數(shù)據(jù)性,用來說明(filei,k)的文件名、大小,甚至是由哪個進程打開等信息。需要說明的是,(filei,k)具有元數(shù)據(jù),但并不是基于該序列中的頁面碎片提取,而是從含有操作系統(tǒng)相關(guān)結(jié)構(gòu)的頁面碎片中提取。
為此,一個內(nèi)存碎片文件可以抽象為metadata ‖ (filei,k)。根據(jù)以上分析,基于內(nèi)存映像的碎片文件雕刻問題可以看作集合S到metadata ‖ (filei,k)的一個映射,即S→ metadata ‖(filei,k),也就是找到這種映射關(guān)系,就能解決內(nèi)存碎片文件雕刻。
內(nèi)存碎片文件雕刻問題是一個內(nèi)存碎片集合到文件元數(shù)據(jù)和文件序列的映射問題,該問題可以分解為以下3 個子問題。
1) 文件碎片子集元素確定子問題
含有數(shù)據(jù)文件的頁面碎片集合僅是整個內(nèi)存映像碎片集合的一部分。此外,含有操作系統(tǒng)內(nèi)核模塊、內(nèi)核進程、硬件驅(qū)動,以及應用進程等的頁面也都是內(nèi)存映像碎片集合中的元素。因此構(gòu)成數(shù)據(jù)文件的碎片集合是內(nèi)存映像碎片集合的一個子集,利用集合劃分思想,數(shù)據(jù)文件碎片子集和內(nèi)存碎片集合S之間具有如下關(guān)系

其中,0≤i≤k,filei表示文件碎片子集,其實質(zhì)是具有特定文件類型(如office 文件類型、Acrobat pdf 文件類型等)的一個數(shù)據(jù)文件的所有頁面。文件碎片子集元素確定子問題就是確定一個數(shù)據(jù)文件中的所有頁面碎片,即建立碎片集合S到文件碎片子集filei的映射,即S→ filei,利用該映射關(guān)系獲得數(shù)據(jù)文件碎片子集中的所有碎片。
2) 文件碎片子集元素關(guān)系順序確定子問題
由于內(nèi)存碎片集合S中元素的無序性,并且文件碎片子集filei?S,根據(jù)集合中元素無序性特征,則filei中元素也具有無序性。假設(shè)filei中有m個元素 碎 片,則 可 能 的 連 接 順 序 共 有m× (m? 1) × (m? 2) × …× 2 ×1種。文件碎片子集元素關(guān)系確定子問題就是要找到filei中元素之間的唯一的序列,即 filei→ (filei,k)的映射。
3) 文件元數(shù)據(jù)構(gòu)建子問題
文件元數(shù)據(jù)通常是指文件系統(tǒng)中維護文件內(nèi)容數(shù)據(jù)的相關(guān)數(shù)據(jù)。目前,內(nèi)存數(shù)據(jù)文件元數(shù)據(jù)尚沒有定義,本文認為內(nèi)存文件元數(shù)據(jù)是指在內(nèi)存中由操作系統(tǒng)及其相關(guān)結(jié)構(gòu)維護的文件信息,例如文件名、文件大小等數(shù)據(jù)。因此,含有內(nèi)存文件元數(shù)據(jù)的頁面碎片并不是某個filei碎片子集中的元素,而是具有操作系統(tǒng)結(jié)構(gòu)的內(nèi)存碎片。要構(gòu)建內(nèi)存文件元數(shù)據(jù),前提是必須找到含有操作系統(tǒng)相關(guān)數(shù)據(jù)結(jié)構(gòu)的內(nèi)存碎片,并在該內(nèi)存碎片上找到文件元數(shù)據(jù)的具體位置。
由于內(nèi)存碎片元素確定性、互異性和無序性,通過直接分析內(nèi)存碎片中的二進制數(shù)據(jù)難以解決上述3 個子問題。基于內(nèi)存管理理論和機制,內(nèi)存頁面是通過操作系統(tǒng)的內(nèi)核對象結(jié)構(gòu)進行管理的,也就是說如果找到內(nèi)存映像中含有操作系統(tǒng)相關(guān)結(jié)構(gòu)的碎片,并針對文件對象及其鏈接關(guān)系進行逆向重建,有望解決碎片文件雕刻的3 個子問題。
碎片文件雕刻模型的基本思想是利用內(nèi)存中操作系統(tǒng)結(jié)構(gòu)逆向分析技術(shù),分析Windows 操作系統(tǒng)中文件對象結(jié)構(gòu)及相關(guān)結(jié)構(gòu),逆向構(gòu)建文件對象的結(jié)構(gòu)鏈,通過結(jié)構(gòu)鏈中的指針關(guān)系確定文件碎片子集中的元素及碎片元素間的連接關(guān)系,并利用相關(guān)結(jié)構(gòu)中文件名等字段構(gòu)建文件元數(shù)據(jù)。本文選擇將文件對象作為結(jié)構(gòu)鏈逆向重建的起始結(jié)構(gòu),其優(yōu)點在于能夠解決現(xiàn)有雕刻算法中進程被關(guān)閉或者被覆蓋后造成文件不能雕刻的問題。利用WinHex工具分析可知,文件對象結(jié)構(gòu)的內(nèi)存分配單元具有明顯的簽名特征。文件對象分配單元簽名十六進制特征如圖1 所示。

圖1 文件對象分配單元簽名十六進制特征
每個文件對象的池分配單元的簽名特征都含有“46 69 6C E5”這樣的十六進制信息,因此該簽名特征可以定位文件對象結(jié)構(gòu)鏈的起始結(jié)構(gòu)。此外,構(gòu)成文件的內(nèi)存頁面都有一個頁面指針,通過文件頁面指針就能夠確定文件的內(nèi)存頁面以及該頁面在文件中的位置順序。本文通過重建文件對象結(jié)構(gòu)及其中的關(guān)鍵字段,并根據(jù)字段中的指針地址確定文件對象結(jié)構(gòu)鏈接指向關(guān)系,最終確定文件的碎片元素及其關(guān)系,構(gòu)建的內(nèi)存碎片文件雕刻模型如圖2 所示。

圖2 內(nèi)存碎片文件雕刻模型
如圖2 所示,內(nèi)存碎片雕刻過程可分為4 個階段:預處理、文件對象結(jié)構(gòu)鏈逆向重建算法、內(nèi)存頁面指針關(guān)系逆向重建算法和文件類型簽名特征驗證算法。
預處理。先對內(nèi)存映像進行掃描分析,去除非數(shù)據(jù)文件內(nèi)存碎片,包括利用0/1 二進制數(shù)據(jù)統(tǒng)計特征過濾不含有任何數(shù)據(jù)的內(nèi)存頁面碎片,利用內(nèi)存取證中的進程重建機制去除含有可執(zhí)行代碼的內(nèi)存碎片頁面。最終獲取內(nèi)存數(shù)據(jù)文件碎片及元數(shù)據(jù)碎片的集合。
文件對象結(jié)構(gòu)鏈逆向重建算法。1) 利用文件內(nèi)核對象內(nèi)存分配簽名特征,掃描內(nèi)存映像碎片集合,確定該簽名特征位置,同時記錄內(nèi)存映像碎片集合中簽名個數(shù)(對應內(nèi)存中文件個數(shù));2) 根據(jù)簽名特征位置,定位文件對象分配單元,并逆向重建其關(guān)鍵字段;3) 根據(jù)文件對象結(jié)構(gòu)的鏈接指向關(guān)系,確定指向內(nèi)存碎片的頁面指針。依據(jù)頁面指針確定文件碎片子集中元素的個數(shù)。
內(nèi)存頁面指針關(guān)系逆向重建算法。確定頁面指針的關(guān)系,構(gòu)建文件碎片子集中頁面之間的連接順序關(guān)系。根據(jù)內(nèi)存碎片文件雕刻模型可知,碎片文件雕刻成功的關(guān)鍵是能夠逆向重建文件對象,并且能夠獲得結(jié)構(gòu)中的關(guān)鍵變量,尤其是結(jié)構(gòu)鏈指針。如果指針值有誤差,則可能導致錯誤的雕刻結(jié)果。為了進一步提升雕刻結(jié)果的正確性,引入文件類型簽名特征驗證算法針對雕刻結(jié)果進行驗證,從而確認雕刻結(jié)果十六進制類型是否符合文件類型要求。
文件類型簽名特征驗證算法。利用文件類型十六進制頭尾特征,例如jpg 文件類型的文件頭十六進制特征是“FFD8FFE000104A464946”,文件尾特征是“FFD9”,針對內(nèi)存中jpg 雕刻文件進行比較驗證,從而驗證雕刻文件的簽名特征。
Windows 系統(tǒng)的內(nèi)核結(jié)構(gòu)、內(nèi)存的相關(guān)管理機制并沒有完全公開,并且不同系統(tǒng)版本、機器字長、分頁模式等因素對內(nèi)存映像分析影響很大。本文使用微軟公司提供的內(nèi)核調(diào)試工具WinDbg 對文件對象及相關(guān)結(jié)構(gòu)進行逆向分析重建。文件對象及相關(guān)結(jié)構(gòu)在內(nèi)存中的結(jié)構(gòu)鏈關(guān)系如圖3 所示。

圖3 內(nèi)存文件結(jié)構(gòu)鏈關(guān)系
通過逆向重建圖3 中文件對象及其鏈接關(guān)系,就能確定內(nèi)存文件碎片集合及其之間的關(guān)系,需要逆向重建的結(jié)構(gòu)如下。
1) FILE_OBJECT
Windows 文件對象(FILE_OBJECT)是Windows 系統(tǒng)運行中進程訪問(修改、刪除)文件時構(gòu)建的一個結(jié)構(gòu),并被分配給那個文件。重建文件內(nèi)容數(shù)據(jù),首先要定位FILE_OBJECT。該結(jié)構(gòu)的關(guān)鍵變量如下。

FILE_OBJECT 結(jié)構(gòu)包含幾個重要的成員,通過偏移量0x030 處的FileName 可以查看文件的名稱;0x004 處的 DeviceObject 域包含一個指向DeviceObject 的指針,其中包含了驅(qū)動和設(shè)備信息;對于數(shù)據(jù)文件雕刻來說,最重要的成員變量在偏移量為 0x014 的位置,它是一個指向SECTION_OBJECT_POINTERS 結(jié)構(gòu)的指針,下文詳細分析了該結(jié)構(gòu)。
2) SECTION_OBJECT_POINTERS
內(nèi)存管理器和緩存管理器應用該結(jié)構(gòu)存儲文件映射和緩存有關(guān)的信息,該結(jié)構(gòu)的關(guān)鍵變量定義如下。

該結(jié)構(gòu)包含 3 個指針變量。其中,DataSectionObject 指向CONTROL_AREA 結(jié)構(gòu),用于維護數(shù)據(jù)文件,例如Microsoft word 文件;ImageSectionObject 用來表示內(nèi)存中可執(zhí)行文件;SharedCacheMap指向一個SHARED_CACHE_MAP結(jié)構(gòu)變量,該結(jié)構(gòu)與操作系統(tǒng)中的高速緩存有關(guān)。
3) _CONTROL_AREA
_CONTROL_AREA 是一個內(nèi)存管理結(jié)構(gòu),是整個內(nèi)存映射的核心,同時也是聯(lián)系SUBSECTION 和MMPTE 結(jié)構(gòu)的重要結(jié)構(gòu)。該結(jié)構(gòu)關(guān)鍵變量如下。

偏移量0x01c 的變量Subsection 是指針變量,通過該指針可以定位SUBSECTION 結(jié)構(gòu)。
4) SUBSECTION 結(jié)構(gòu)
SUBSECTION 結(jié)構(gòu)用來管理文件映射到內(nèi)存中的各個頁面。該結(jié)構(gòu)關(guān)鍵變量如下。

偏移量0x010 處的SubsectionBase 是一個指向MMPTE 結(jié)構(gòu)的指針,這個結(jié)構(gòu)實際上是一個原型PTE 的數(shù)組。原型PTE 與硬件PTE 相關(guān)聯(lián),因此通過該結(jié)構(gòu)可以找到數(shù)據(jù)文件頁面的存儲內(nèi)容。MMPTE 結(jié)構(gòu)變量如下。

_SHARED_CACHE_MAP 結(jié)構(gòu)管理內(nèi)存中的緩存文件,該結(jié)構(gòu)的關(guān)鍵變量如下。

該結(jié)構(gòu)中的Vacbs 指針變量指向_VACB 結(jié)構(gòu),使用的是虛擬地址,通過該地址能夠找到數(shù)據(jù)文件在虛擬地址中的數(shù)據(jù)。盡管并不是文件的所有部分都被映射到緩存中,但是緩存中的文件部分數(shù)據(jù)具有極其重要的特性,因為如果文件的部分內(nèi)容在緩存中被找到,則意味著文件的這部分內(nèi)容已經(jīng)被某一進程最近或經(jīng)常使用和訪問。
本節(jié)基于逆向工程重建的文件對象及其相關(guān)的內(nèi)存結(jié)構(gòu)設(shè)計內(nèi)存碎片文件雕刻算法。如圖4 所示,內(nèi)存碎片文件雕刻算法分為內(nèi)核文件對象掃描重建、文件碎片提取與重建、緩存碎片文件雕刻3 個子算法。該算法中需要多次定位對應的結(jié)構(gòu),根據(jù)內(nèi)存頁式管理的特點,虛實地址轉(zhuǎn)化首先要定位頁目錄表的基地址DTB。分析得知,文件對象重建中虛擬地址的轉(zhuǎn)化需要csrss.exe 系統(tǒng)進程的DTB,進而按照32 位或64 位系統(tǒng)虛擬地址字段的劃分來完成整個的地址轉(zhuǎn)化過程,定位文件典型及其相關(guān)結(jié)構(gòu)鍵的物理地址。

圖4 內(nèi)存碎片文件雕刻算法
1) 內(nèi)核文件對象掃描重建子算法的詳細過程如下。
①利用文件對象簽名特征掃描算法識別文件對象分配單元,并定位FILE_OBJECT 對象,重建該結(jié)構(gòu)的“SectionObjectPointer”字段變量,該字段指向“SECTION_OBJECT_POINTERS”結(jié)構(gòu),該結(jié)構(gòu)由Windows 構(gòu)建。
② 定位SectionObjecPointer指向的SECTION_OBJECT_POINTERS 結(jié)構(gòu),重建該結(jié)構(gòu)的DataSectionObject 和SharedCacheMap 字段變量。
2) 文件碎片提取與重建子算法
①定位DataSectionObject 指向的CONTROLAREA結(jié)構(gòu),重建該結(jié)構(gòu)中的Subsection 字段變量。
② 定位Subsection 字段,并重建該結(jié)構(gòu)中的SubsectionBase 的指針和NextSubsection 的指針變量。
③定位SubsectionBase 地址,重建MMPTE數(shù)組結(jié)構(gòu)變量。
④ 遍歷MMPTE 數(shù)組指向的頁面,并將其數(shù)據(jù)寫入到新建文件中。每個MMPTE 可索引一個4 096 B的頁面,而一個完整的扇區(qū)有512 B,每個MMPTE最多可以對應8 個扇區(qū)。
此外,每一個Subsetction 均有一個指針指向NextSubsetction,表示文件下一部分所處的內(nèi)存頁面。如果文件的大小足以用一個SubSetction 來管理,則此處為空。
3) 緩存碎片文件雕刻子算法
①定位 SharedCacheMap 字段指向的SHARED_CACHE_MAP 結(jié)構(gòu),重建該結(jié)構(gòu)的Vacbs指針變量。
② 定位VACB 結(jié)構(gòu),重建VACB 結(jié)構(gòu)。轉(zhuǎn)換VACB 結(jié)構(gòu)中的BaseAddress 地址為物理地址。
③如果VACB 結(jié)構(gòu)中的BaseAddress 為0,則表示該文件對應的緩存無效,算法退出。否則繼續(xù)執(zhí)行④。
④ 定位VACB 結(jié)構(gòu)中的BaseAddress 變量,遍歷該結(jié)構(gòu)數(shù)組,將每一個頁面數(shù)據(jù)寫入新建文件,重建碎片文件內(nèi)容。
本文以Windows 7 操作系統(tǒng)為內(nèi)存文件雕刻實驗對象。根據(jù)StatCounter 在2020 年10 月發(fā)布的全球PC 操作系統(tǒng)市場份額排名,Windows 7 操作系統(tǒng)占據(jù)16.8%的市場份額[28],Windows 7 操作系統(tǒng)的實際用戶數(shù)量肯定還要高于這個比例。雖然不同版本操作系統(tǒng)的內(nèi)存對象結(jié)構(gòu)不盡相同,但是本文中介紹的獲取物理內(nèi)存中數(shù)據(jù)的基本方法可以推廣到Windows 8、Windows 10 等操作系統(tǒng)中。
實驗機器是ThinkPad X230,Intel? Core?i5-3230M CPU @2.60 GHz,內(nèi)存容量為4 GB,64 位Windows 7 操作系統(tǒng)。選擇doc、pdf、txt、jpg 這4 種常用文件類型數(shù)據(jù)文件進行測試,驗證本文方法對內(nèi)存中數(shù)據(jù)文件的元數(shù)據(jù)(如文件名)和文件內(nèi)容的雕刻能力,各選擇10 個文件,文件詳細情況如表1 所示。

表1 不同類型文件尺寸
本文設(shè)計了3 個不同的實驗,用于驗證本文方法在網(wǎng)絡(luò)攻擊的不同階段(例如攻擊前、攻擊中、攻擊后)物理內(nèi)存中數(shù)據(jù)文件雕刻能力和可行性,實驗過程分別如下。
1) 實驗1。從本地磁盤中分別利用美圖看看、Microsoft Office、Acrobat 閱讀器、Notepad.exe 等工具打開f0 文件(注意文件后綴不同),然后轉(zhuǎn)儲內(nèi)存映像。該實驗主要用于測試內(nèi)存映像中數(shù)據(jù)文件雕刻的可行性。
2) 實驗2。從本地磁盤中分別利用美圖看看、Microsoft Office、Acrobat 閱讀器、Notepad.exe 等工具打開表1 中所有文件,然后轉(zhuǎn)儲內(nèi)存映像。該實驗主要驗證攻擊過程中黑客使用多個不同文件時內(nèi)存映像中數(shù)據(jù)文件的雕刻能力,同時分析多個不同類型文件所占內(nèi)存頁面間是否相互影響。
3) 實驗3。關(guān)閉所有文件,然后轉(zhuǎn)儲內(nèi)存映像。該實驗驗證黑客關(guān)閉攻擊過程中打開使用的數(shù)據(jù)文件在內(nèi)存中是否遺留文件痕跡。
針對實驗1 獲得內(nèi)存映像,雕刻結(jié)果從文件元數(shù)據(jù)和文件內(nèi)容進行評價,文件元數(shù)據(jù)主要是指文件的名稱,即文件的完整路徑。Scalpel[29]是一款經(jīng)典的基于磁盤的文件雕刻工具,本文選擇Scalpel 1.60 和內(nèi)存碎片文件雕刻算法進行比較,結(jié)果如表2所示。

表2 內(nèi)存映像碎片文件雕刻結(jié)果
表2 中,√表示雕刻成功,×表示雕刻失敗。從表2 結(jié)果可知,本文方法不但能夠雕刻出實驗1中內(nèi)存映像的文件內(nèi)容數(shù)據(jù),而且可以雕刻出文件的完整路徑,這對于確定內(nèi)存中文件來源具有意義,例如文件可能來源于網(wǎng)絡(luò)。利用Scalpel 1.60工具針對該內(nèi)存映像進行雕刻,只有txt 文件可以進行成功雕刻,√×表示雕刻出36 個txt 文件,而f0.txt 文件的內(nèi)容分散在這些文件中,即雖然內(nèi)容找到了,但沒有成功雕刻一個完整文件。
針對實驗2 獲得的內(nèi)存映像,本文方法和Scalpel 1.60 的實驗結(jié)果如表3 所示。

表3 內(nèi)存映像碎片文件雕刻結(jié)果(實驗2)
從表3 可以看出,本文方法能夠雕刻出所有元數(shù)據(jù),并能夠雕刻出所有txt 文件和大部分的jpg、doc、pdf 文件。和實驗1 不同的是,雕刻失敗的文件并不是較大的文件,即文件大小和文件成功雕刻之間沒有關(guān)系,本文推測可能是由于多個文件同時在內(nèi)存中打開而相互影響,有些文件頁面交換到虛擬內(nèi)存,導致內(nèi)存中文件頁面缺失。
針對實驗3 獲得的內(nèi)存映像,本文方法和Scalpel 1.60 實驗結(jié)果如表4 所示。

表4 內(nèi)存映像碎片文件雕刻結(jié)果(實驗3)
表4 結(jié)果表明,實驗3 中文件內(nèi)容雕刻精確度為42.5%,遠低于實驗2 中的87.5%。可能原因是進程關(guān)閉后導致結(jié)構(gòu)鏈逆向重建時某些關(guān)鍵指針字段值不能有效建立。另外,文件元數(shù)據(jù)也是通過緩存雕刻子算法獲得的,這說明在實際的數(shù)字調(diào)查過程中需要綜合利用文件雕刻算法獲得有用的調(diào)查信息。
文獻[30]提出了一種利用pdf 構(gòu)成對象模式特征掃描和分類算法從內(nèi)存映像中雕刻pdf 文件的算法,該算法實驗結(jié)果表明分層聚類算法優(yōu)于k-均值算法。本文利用文獻[30]中pdf 文件雕刻算法(其中分類算法利用分層聚類算法)針對實驗1、實驗2 和實驗3 獲得的內(nèi)存映像進行雕刻,雕刻實驗結(jié)果如表5 所示。

表5 pdf 文件雕刻結(jié)果
表5 實驗數(shù)據(jù)表明,在所有實驗場景中,本文算法成功雕刻pdf 文件平均精確度為63.3%,元數(shù)據(jù)精確度100%,而文獻[30]算法pdf 文件平均精確度36.7%,這些結(jié)果表明本文算法相比文獻[30]算法能夠雕刻更多pdf 文件數(shù)據(jù)。另外,文獻[30]算法對于pdf 類型文件元數(shù)據(jù)精確度為0,表明該算法不能從內(nèi)存映像中雕刻pdf 相關(guān)的元數(shù)據(jù)信息(例如文件名等)。
本文算法和文獻[30]算法對于所有實驗中的內(nèi)存映像中的pdf 文檔內(nèi)容的平均雕刻精度都未能達到100%,可能原因在于構(gòu)成pdf 文件的對象元素有個別不在內(nèi)存映像中。另外,本文雕刻算法平均精確度優(yōu)于文獻[30]算法,一方面,因為本文算法的結(jié)構(gòu)鏈逆向分析方法能夠有效確定單個pdf 文件的對象元素及其連接關(guān)系,而文獻[30]算法利用pdf 對象模式特征確定pdf 對象元素,導致不同pdf 文檔的相同對象元素的區(qū)分和重組難度大,尤其對于具有相似語義的文檔來說則更容易混淆;另一方面,因為文獻[30]方法僅能針對pdf 文件,且僅關(guān)注pdf 文件中的文本對象,實際上pdf 文件中還包括其他的對象,例如圖像等。本文算法可以針對不同文件類型,而且通過結(jié)構(gòu)鏈之間的指針關(guān)系來確定構(gòu)成文檔內(nèi)存頁面之間的關(guān)系,通用性強。
本案例選擇Honeynet 項目挑戰(zhàn)提供的內(nèi)存映像文件Bob.vmem[31],該內(nèi)存映像中可能存在Zeus病毒木馬。Zeus 病毒木馬通過Acrobat 工具對系統(tǒng)進行感染,本文通過內(nèi)存碎片文件雕刻算法對該內(nèi)存映像中的pdf 文件進行雕刻,并進行進一步分析,更加確認了Zeus 病毒木馬的感染過程。
利用本文方法對該內(nèi)存映像進行雕刻,共雕刻出16 個文件元數(shù)據(jù),其中pdf 文件4 個,如圖5所示。這些元數(shù)據(jù)表明,在Zeus 病毒木馬入侵期間黑客打開或者訪問了這些文件。

圖5 Bob.vmem 映像文件元數(shù)據(jù)雕刻
利用WinHex 工具針對雕刻出的pdf 文件進行分析,發(fā)現(xiàn)其中含有“JavaScript”和“OpenAction”等pdf 文件類型結(jié)構(gòu)對象。綜合該案例其他線索證據(jù),黑客正是利用這些結(jié)構(gòu)對象將Zeus 病毒木馬感染給該系統(tǒng)。
需要說明的是,Acrobat 閱讀器不能打開雕刻出的4 個pdf 文件,但這并不影響通過這些pdf 文件內(nèi)容發(fā)現(xiàn)網(wǎng)絡(luò)攻擊的感染過程,這進一步表明內(nèi)存數(shù)據(jù)文件的雕刻有助于網(wǎng)絡(luò)攻擊威脅調(diào)查和分析。
本文提出了一種基于內(nèi)存映像的碎片文件雕刻模型,基于該模型提出一種結(jié)構(gòu)鏈逆向的碎片文件雕刻算法,該算法能夠獲取遺留在內(nèi)存中的文件數(shù)據(jù)。實驗結(jié)果表明,本文算法能夠成功雕刻恢復內(nèi)存映像中的文件元數(shù)據(jù)信息,對于通常情況下的內(nèi)存映像文件雕刻的精確度達到87.5%,遠高于基于磁盤文件雕刻算法(Scalpel 1.60),這對網(wǎng)絡(luò)威脅攻擊調(diào)查具有重要意義。在未來的工作中,將進一步探究Linux 系統(tǒng)中碎片文件雕刻技術(shù)和算法。