陳 龍,敬 凱,董振興,田慶宜
(1.重慶郵電大學(xué)計算機(jī)取證研究所,重慶 400065;2.重慶市公安局電子物證司法鑒定中心,重慶 400065)
計算機(jī)取證是運用計算機(jī)及其相關(guān)科學(xué)和技術(shù)的原理與方法獲取與計算機(jī)相關(guān)的證據(jù)以證明某個客觀事實存在的過程[1]。傳統(tǒng)的取證是基于文件系統(tǒng)的,采用傳統(tǒng)的取證手段主要有以下幾個理由:①獲取方法簡單,只需關(guān)掉計算機(jī)電源,保護(hù)好現(xiàn)場即可,對取證人員要求較低;②現(xiàn)在市場上能夠買到的計算機(jī)取證調(diào)查工具大部分只適用于磁盤鏡像。但是,如果只采用傳統(tǒng)的方式進(jìn)行取證,內(nèi)存中的數(shù)據(jù)就會丟失。Windows內(nèi)存取證是應(yīng)用計算機(jī)取證工具分析Windows系統(tǒng)內(nèi)存中的敏感信息,從而獲得犯罪證據(jù)的一種技術(shù)。傳統(tǒng)的計算機(jī)取證技術(shù)很難獲得的犯罪證據(jù),如當(dāng)前正在運行的進(jìn)程線程信息、網(wǎng)絡(luò)連接信息等,都可以通過內(nèi)存取證獲得。
內(nèi)存取證技術(shù)是從2005年開始才快速發(fā)展的。在2005年夏季,數(shù)字取證研究工作組(digital forensic research workshop,DFRWS)開展了一次 Forensics Challenge,主題就是針對物理內(nèi)存鏡像的分析。主辦方提供了2個物理內(nèi)存鏡像文件:dfrws2005-physicalmemory1.dmp 和 dfrws2005-physical-memory2.dmp,文件系統(tǒng)的時間表(dfrws2005-timeline.txt),mactime格式的元數(shù)據(jù)(dfrws2005-body-file.fls),并依此對參賽者提出了相關(guān)問題。這場挑戰(zhàn)賽鼓勵選手們分析Windows2000中的內(nèi)存管理機(jī)制。在本次大賽上Chris Betz開發(fā)出了能夠重建進(jìn)程列表并且分析進(jìn)程內(nèi)存信息的工具memparser。George M,Garner Jr.和Robert-Jan Mora開發(fā)出了能夠獲取物理內(nèi)存并對其進(jìn)行分析的工具 kntlist。2006 年,Andreas Schuster[2]提出了一種分析內(nèi)存的方法,并開發(fā)出了相應(yīng)的工具PTfinder。利用此方法可發(fā)現(xiàn)內(nèi)存鏡像中的一些進(jìn)程和線程的信息,此方法只適用于Windows 2000、Windows xp的 sp1/sp2版本和 Windows Server 2003。2010 年,Richard M.Stevens 和 Eoghan Casey[3]剖析了命令提示符歷史數(shù)據(jù)結(jié)構(gòu)并且開發(fā)出了一種能夠從Windows XP內(nèi)存鏡像中重構(gòu)Windows命令提示符歷史記錄的工具。2011年,James Okolica和Gilbert L.Peterson[4]介紹了 Windows剪貼板的結(jié)構(gòu)和恢復(fù)剪貼板中的數(shù)據(jù)的過程,并提出剪貼板內(nèi)容數(shù)據(jù)的獲取方法。此方法對文本有作用,但只能提取被剪切過的文本數(shù)據(jù)。
本文針對Windows提出一種提取系統(tǒng)運行進(jìn)程所使用的物理內(nèi)存的方法。運用此方法可以從系統(tǒng)內(nèi)存鏡像中提取出正常運行和被隱藏的進(jìn)程的EPROCESS結(jié)構(gòu),及相應(yīng)進(jìn)程的內(nèi)存數(shù)據(jù)。這就為進(jìn)一步的取證分析工作打下了堅實的基礎(chǔ)。
內(nèi)核處理器控制區(qū)(kernel processor control region,KPCR)是用來保存與線程切換有關(guān)的全局信息的一種結(jié)構(gòu)。2009年,基于在Windows中KPCR線性地址固定的特點,郭牧和王連海教授[5]提出一種在內(nèi)存鏡像中尋找系統(tǒng)KPCR的方法,通過KPCR還可以找到其他的與內(nèi)核變量有關(guān)的重要信息。2010年,王連海教授[6]又針對其方法進(jìn)行了相應(yīng)的改進(jìn),使之適用于Windows 7。
在Windows的內(nèi)核中有一個活動進(jìn)程鏈表Ps-ActiveProcessList。這個雙向鏈表保存著所有活動進(jìn)程的EPROCESS結(jié)構(gòu),如圖1所示。圖1中,進(jìn)程的EPROCESS結(jié)構(gòu)包含一個具有指針成員FLINK和BLINK的LIST_ENTRY結(jié)構(gòu),這2個指針分別指向其后方進(jìn)程和前方進(jìn)程的LIST_ENTRY。
獲取KPCR以后,可以根據(jù)KPCR內(nèi)的KPRCB尋找到_KTHREAD結(jié)構(gòu),通過_KTHREAD找到_KAPC_STATE結(jié)構(gòu),通過_KAPC_STATE找到EPROCESS結(jié)構(gòu)。最終所找到的就是當(dāng)前正在被執(zhí)行的進(jìn)程的EPROCESS結(jié)構(gòu)。當(dāng)前運行的進(jìn)程被一個雙向鏈表連接在一起,通過所獲得的EPROCESS結(jié)構(gòu)就可以獲得所有活動進(jìn)程的EPROCESS結(jié)構(gòu)。
圖1 進(jìn)程間的鏈接關(guān)系Fig.1 Link relationships between processes
基于KPCR結(jié)構(gòu)對物理內(nèi)存進(jìn)行分析的方法是一種較為有效的方法,為內(nèi)存取證領(lǐng)域提供了一種新的研究方式。但存在著以下的不足:①查找定位存在一定的不確定性。隨著Windows系統(tǒng)版本的不斷更新,其對內(nèi)存大小的要求也越來越高。定位KPCR的限制條件較弱,查找結(jié)果可能較多,查找到的結(jié)構(gòu)區(qū)域都需設(shè)法進(jìn)一步驗證;②無法找出隱藏的進(jìn)程。利用DKOM(direct kernel object manipulation)直接內(nèi)核對象操作技術(shù)在PsActiveProcessList鏈表上刪除了某個進(jìn)程的EPROCESS結(jié)構(gòu)以后,該進(jìn)程將被隱藏起來,但仍會在后臺運行[7]。通過遍歷此鏈表得到活動進(jìn)程的方法將不會得到此進(jìn)程。
根據(jù)KPCR的方法來查找進(jìn)程的過程是,找到當(dāng)前被執(zhí)行的進(jìn)程的EPROCESS結(jié)構(gòu),然后根據(jù)此結(jié)構(gòu)內(nèi)的FLINK和BLINK 2個指針成員來遍歷Ps-ActiveProcessList鏈表,找到所有運行的進(jìn)程。由此可見,通過KPCR的方法無法找到被隱藏進(jìn)程的EPROCESS結(jié)構(gòu)。
每一個進(jìn)程都有自己獨立的尋址空間,有自己獨立的頁目錄和頁表來管理虛擬內(nèi)存到物理內(nèi)存的映射。如果知道一個進(jìn)程的頁目錄基地址,那么尋找一個進(jìn)程的物理地址空間的問題就轉(zhuǎn)換成尋找此進(jìn)程所使用的虛擬地址空間的問題。通過一個進(jìn)程的虛擬地址空間和頁目錄基地址可以找到進(jìn)程使用的物理頁。下面我們以32位系統(tǒng)為例對此方法進(jìn)行描述。
在Windows系統(tǒng)中,每個進(jìn)程都由一個EPROCESS結(jié)構(gòu)來表示。在Windows內(nèi)核中,進(jìn)程是靠EPROCESS結(jié)構(gòu)來識別的。這個EPROCESS結(jié)構(gòu)里面包含了與進(jìn)程相關(guān)的重要的信息,如進(jìn)程內(nèi)的線程信息、當(dāng)前系統(tǒng)所運行的進(jìn)程鏈表的信息、進(jìn)程名字等。Windows 7中與Windows XP中的EPROCESS結(jié)構(gòu)是不同的。
圖2、圖 3分別為 Windows 7,Windows XP下EPROCESS結(jié)構(gòu)的片段。Windows 7中此結(jié)構(gòu)的大小為0x2C0,Windows XP中此結(jié)構(gòu)的大小為0x25C。進(jìn)程的許多信息都可以直接從這個結(jié)構(gòu)體中獲取。
圖2 Windows 7下的EPROCESSFig.2 EPROCESS structure in Windows 7
圖3 Windows XP下的EPROCESSFig.3 EPROCESS structure in Windows XP
Windows 7中:+0x0a8ExitTime是一個_LARGE_INTEGER類型,占用8個字節(jié),該屬性記錄一個進(jìn)程的退出時間,當(dāng)一個進(jìn)程正在運行時此屬性的值為0。
+0x1a8 Peb進(jìn)程環(huán)境塊(process environment block,PEB),每個進(jìn)程都有自己的 PEB信息,PEB中記錄著進(jìn)程的運行參數(shù)、映像裝入地址等信息。EPROCESS結(jié)構(gòu)中PEB屬性的類型是一個指針,指向該進(jìn)程的進(jìn)程控制塊。在Windows XP SP1及以前的版本中PEB的地址是固定的,都為0x7ffdf000,從Windows XP SP2以后系統(tǒng)引入了一個新的特性:PEB地址隨機(jī)化。加入這個新特性后,每一個進(jìn)程的PEB地址都不是固定的(除了system的PEB地址總是零)。盡管如此,PEB的地址還是有規(guī)律可循。系統(tǒng)創(chuàng)建進(jìn)程時設(shè)置PEB的存儲區(qū)域,這是在進(jìn)程用戶模式分區(qū)內(nèi)分配的一塊內(nèi)存。PEB地址低16位隨機(jī)化高16位是固定的,都為0x7ffd。
+0x274 ExitStatus
此屬性表示進(jìn)程的退出狀態(tài),通過進(jìn)程的退出狀態(tài)可以獲知進(jìn)程非正常退出的大致原因。一個運行進(jìn)程默認(rèn)的ExitStatus的狀態(tài)是STATUS_PENDING也稱為STILL_ACTIVE。此屬性占4個字節(jié),一個運行的進(jìn)程對應(yīng)的此屬性的值為0x00000103。
Windows XP中這3個屬性在EPRCESS結(jié)構(gòu)中的位置與Windows 7不同,分別為
+0x078 ExitTime
+0x1b0 Peb
+0x24c ExitStatus
Windows XP中這3個屬性的特性與Windows 7中的特性相同。由以上可得,在內(nèi)存鏡像中檢索出運行進(jìn)程的EPROCESS的方法如下。
Windows 7中,PEB相對于ExitTime的偏移量為0x100,ExitStatus相對于Peb的偏移量為0xCC,然后根據(jù)這3個屬性的值也就可以定位出EPRCESS的位置。
Windows XP中,Peb相對于ExitTime的偏移量為0x138,ExitStatus相對于 Peb的偏移量為0x9C,然后根據(jù)這3個屬性的值就可以定位出EPRCESS的位置。
進(jìn)程頁目錄的物理起始地址——頁目錄基地址保存在EPROCESS結(jié)構(gòu)中,通過頁目錄基地址進(jìn)行虛擬地址到物理地址的轉(zhuǎn)換。
EPROCESS的第1個域即進(jìn)程的進(jìn)程控制塊(process control block,PCB)。PCB是一個 KPROCESS結(jié)構(gòu),此結(jié)構(gòu)位于EPROCESS的第1項,也就是說其地址和進(jìn)程EPROCESS的地址相同。PCB是一種存放進(jìn)程的管理和控制信息的數(shù)據(jù)結(jié)構(gòu),每一個進(jìn)程均有一個PCB,在創(chuàng)建進(jìn)程時,建立PCB,伴隨進(jìn)程運行的全過程,直到進(jìn)程撤消而撤消。
在Windows 7和Windows XP中進(jìn)程的頁目錄基地址均在PCB內(nèi)+0x18處。為DirectoryTable-Base前4個字節(jié)的值。通過此基地址可以進(jìn)行虛擬地址和物理地址之間的轉(zhuǎn)換,如圖4-圖5所示。
虛擬地址描述符(virtual address descriptor,VAD)。一個VAD保存一段被分配地址空間的信息,所有VAD組成一個二叉排序樹來描述用戶地址空間的情況。每個進(jìn)程有自己的用戶地址空間,所以每個進(jìn)程也有自己的VAD二叉排序樹。
每一個VAD結(jié)點的結(jié)構(gòu)如圖6所示。虛擬頁號(virtual page number,VPN),StartingVpn 表示這個內(nèi)存塊的起始虛擬頁號,EndingVpn表示這個內(nèi)存塊的結(jié)束虛擬頁號。Parent是一個指向此VAD節(jié)點的父節(jié)點的指針,LeftChild是一個指向左孩子節(jié)點的指針,RightChild是一個指向右孩子節(jié)點的指針。VadRoot是指向VAD二叉排序樹根節(jié)點的指針。Windows 7中的 VadRoot位于 EPROCESS內(nèi)0x278處,Windows XP中的 VadRoot位于 EPROCESS內(nèi)0x11c處,如圖7所示。
圖4 Windows 7下PCBFig.4 Pcb structure in Windows 7
圖5 Windows XP下PCBFig.5 Pcb structure in Windows XP
圖6 Windows中vad結(jié)構(gòu)Fig.6 Vad structure in Windows
圖7 vad二叉排序樹Fig.7 Vad binary sort tree
此二叉樹是一個AVL自平衡二叉樹[8],這種組織方式完全是方便快速查找。樹中的每一個節(jié)點代表了一段虛擬地址空間。所以程序的代碼段,數(shù)據(jù)段,堆段都會各占用一個或多個VAD節(jié)點。通過遍歷此二叉樹可以得到一個進(jìn)程所使用的代碼段,數(shù)據(jù)段,堆段,進(jìn)而得到此進(jìn)程所使用的物理內(nèi)存。
虛擬首地址=StartingVpn<<12;
虛擬末地址=EndingVpn<<12;
從根結(jié)點開始遍歷整個二叉樹,就可以得到這個進(jìn)程所使用的虛擬地址空間。根據(jù)頁目錄基地址進(jìn)行轉(zhuǎn)換,進(jìn)而得到進(jìn)程所使用的在用戶地址空間的物理內(nèi)存。
鏡像提取工具:DumpIt。原因:用此工具獲得的鏡像文件的位移與實際物理內(nèi)存地址相一致。根據(jù)此算法相應(yīng)的程序已經(jīng)寫出,在多臺計算機(jī)上做了相應(yīng)的實驗。
用dkom技術(shù)隱藏3個進(jìn)程,任務(wù)管理器里面看不到此3個進(jìn)程。做鏡像的時候,通過任務(wù)管理器查看運行的進(jìn)程數(shù)。設(shè)Windows XP SP2為S1,Windows XP SP3 為 S2,Windows 7 為 S3,Windows SP1為S4,用任務(wù)管理器查看的結(jié)果為A,用本文提出的方法找出的結(jié)果為B。實驗結(jié)果如表1所示。
表1 實驗結(jié)果統(tǒng)計表Tab.1 Statistics of experimental results
EPROCESS結(jié)構(gòu)里的ImageFileName屬性代表進(jìn)程的名字,通過此屬性可以驗證結(jié)果的正確性。由表1可知,運用此方法找到的運行進(jìn)程的數(shù)目與系統(tǒng)內(nèi)實際運行的數(shù)目一致(包括被隱藏的進(jìn)程)。我們已對找到的結(jié)果進(jìn)行了人工驗證,結(jié)果表明,所找到的進(jìn)程均為系統(tǒng)內(nèi)運行的進(jìn)程。
綜上可知,此方法能夠找到包括被隱藏的進(jìn)程在內(nèi)的所有活動進(jìn)程,其適用的系統(tǒng)版本有:Windows XP SP2,Windows XP SP3,Windows 7,Windows 7 SP1。
內(nèi)存取證領(lǐng)域還是一個較新的領(lǐng)域,發(fā)展還不是太成熟,缺少能夠應(yīng)用于內(nèi)存取證實踐的工具和方法,且隨著系統(tǒng)的不斷更新,對取證技術(shù)的要求也不斷變化。
本文提出一種內(nèi)存查找取證方法,此方法能夠有效地獲取進(jìn)程內(nèi)存,不僅適用于Windows XP還適用于新的系統(tǒng)Windows 7。但是隨著系統(tǒng)新版本的推出更新?lián)Q代,對于內(nèi)存取證技術(shù)的要求也會發(fā)生相應(yīng)的變化。Linux和即將發(fā)布的Windows 8也需要我們做更進(jìn)一步的研究。
[1]陳龍,王國胤.計算機(jī)取證技術(shù)綜述[J].重慶郵電大學(xué)學(xué)報:自然科學(xué)版,2005,17(6):736-740.CHEN Long,WANG Guoyin.Summary on Computer Forensics[J].Journal of Chongqing University of Posts and Telecommunications:Natural Science Edition,2005,17(6):736-740.
[2]ANDREAS S.Searching for processes and threads in Microsoft Windows memory dumps[EB/OL].[2012-03-01].http://www.dfws.org/2006/proceedings/2-Schuster.pdf.
[3]RICHARD M S,EOGHAN C.Extracting Windows command line details from physical memory[EB/OL].[2012-03-01].http://www.dfrws.org/2010/proceedings/2010-307.pdf.
[4]JAMES O,GILBERT L P.Extracting the Windows clipboard from physical memory[EB/OL].[2012-03-01].http://www.dfrws.org/2011/proceedings/18-350.pdf.
[5]郭牧,王連海.基于KPCR結(jié)構(gòu)的Windows物理內(nèi)存分析方法[J].計算機(jī)工程與應(yīng)用,2009,45(18):74-77.GUO Mu,WANG Lianhai.Windows memory analysis method based on KPCR structure[J].Computer Engineering and Applications,2009,45(18):74-77.
[6]ZHANG Shuhui,WANG Lianhai,ZHANG Rui-chao,et al.Exploratory Study on Memory Analysis of Windows 7 Operating System[C]//Pro.of ICACTE'2010.Cheng-Du:IEEE Press,2010:373-377.
[7]LI Peng,WANG Ruchuan,ZHANG Wei.Key technologies of new malicious code developments and defensive measures in communication networks[J].The Journal of China Universities of Posts and Telecommunications.2010,17(4):69-73.
[8]MARK R,DAVID S.Microsoft Windows Internals[M].Fifth Edition.Washington:Microsoft Press,2009:721-724.