向濤,茍木理
重慶大學計算機學院,重慶 400044
Windows 8下基于鏡像文件的內存取證研究
向濤,茍木理
重慶大學計算機學院,重慶 400044
隨著社會信息化程度的不斷提高和普及,利用計算機和網(wǎng)絡等信息化手段進行作案的犯罪行為也日漸增多,數(shù)字取證在這樣的背景下便逐漸成為人們研究與關注的焦點[1]。數(shù)字取證能為此類案件的偵破和審理提供重要的線索和電子證據(jù)。數(shù)字取證包括計算機取證和網(wǎng)絡取證,計算機取證是指通過對以磁介質進行存儲(例如硬盤、內存、閃存等)的計算機數(shù)據(jù)進行保護、提取、分析和歸檔,從而檢查計算機系統(tǒng),提取和保護計算機犯罪有關證據(jù)的過程。內存取證是計算機取證研究中的一個重點和難點,因為內存取證需要在不關閉目標計算機的情況下獲取易失的內存數(shù)據(jù)。這些數(shù)據(jù)包括系統(tǒng)當前運行的進程、線程信息、注冊表鍵值、網(wǎng)絡連接,以及網(wǎng)頁地址、口令、加密密鑰和正在編輯的文件等駐留在內存中的信息。
內存取證技術是目前國內外關于計算機取證研究的前沿和熱點課題之一。2005年數(shù)字取證工作研究組(Digital Forensic Research Workshop,DFRWS)舉辦了內存分析挑戰(zhàn)大賽,利用Windows 2000的物理內存鏡像文件進行分析提取有用的信息[2]。從此,內存取證逐漸成為了國際上關注的熱點,很多學者圍繞內存取證進行了大量的研究[3-9]。Betz開發(fā)了工具Mempaser[4],它能從Windows 2000的內存鏡像文件中獲取進程和線程的相關信息。文獻[5]通過分析內核中的數(shù)據(jù)結構,提出了一種在Windows 2000到Windows Server 2003內存鏡像文件中搜索進程和線程內核數(shù)據(jù)的方法。Okolica和Peterson基于微軟程序數(shù)據(jù)庫文件格式和內核數(shù)據(jù)結構,設計了一種從Windows NT內核操作系統(tǒng)鏡像文件中提取進程和線程等信息的工具[6]。文獻[7-9]分別研究了如何從Windows XP等操作系統(tǒng)的物理內存中獲取注冊表、命令行輸入和剪貼板等系統(tǒng)信息。
圖1 Windows系統(tǒng)中OBJECT_HEADER結構
但是目前的研究僅局限于Windows 7及其之前推出的操作系統(tǒng),隨著微軟最新操作系統(tǒng)Windows 8的發(fā)布,內存取證的研究工作又面臨新的挑戰(zhàn)。Windows 8是一個具有革命性變化的操作系統(tǒng),同時也是微軟主推的整合個人電腦和手持設備的下一代主流操作系統(tǒng)。目前國內外針對Windows 8平臺的內存取證研究都還比較少,而且通過研究發(fā)現(xiàn),由于Windows 8在設計和實現(xiàn)上有很多改進和變化的地方,使得上述提到的眾多現(xiàn)有內存取證方法和工具不能完全適用于該系統(tǒng)。另外,Windows系統(tǒng)源碼的不開放性,也給其取證分析帶來了一定的困難。
Windows 8雖然沿用了NT內核,但是為了提高系統(tǒng)的可靠性、安全性和可移植兼容性,Windows各版本的內存管理和內核數(shù)據(jù)結構在不斷地進行改變和優(yōu)化,進程和線程相關的內核數(shù)據(jù)結構也在改變[10]。這些演變都給取證人員分析內核及操作系統(tǒng)是如何控制進程和線程等內核對象帶來了困難。
針對上述這些問題,本文基于Windows 8操作系統(tǒng)平臺,研究了其進程、線程相關的內核數(shù)據(jù)結構及其特征。利用這些特征,提出并實現(xiàn)了從其鏡像文件中查找進程(包括隱藏進程和非隱藏進程)和線程信息的算法,為取證人員進一步的分析奠定了基礎。
2.1 相關內核結構
Windows內核對象指進程、線程、設備、文件等對象,它們是按一定數(shù)據(jù)結構,由內核分配的內存塊來進行表示的。內核對象由系統(tǒng)創(chuàng)建,由內核對象管理器維護,并且只能由該內核訪問。
內核對象由內存管理器創(chuàng)建,系統(tǒng)通過調用函數(shù)nt!ObpAllocateObject創(chuàng)建進程和線程對象,并記錄進程和線程的相關信息;在該函數(shù)中,又調用函數(shù)nt!ExAllocate-PoolWithTag在非換頁內存池上分配進程和線程內核對象所需內存空間。
內核對象所在內存區(qū)域之前有內存池頭(POOL_HEADER),內存池頭中的PoolTag域用于對該內核對象進行標注。經(jīng)分析發(fā)現(xiàn),Windows 8下PoolTag的取值與Windows XP和Windows 7下是不一樣的。進程對象中PoolTag的值從“pro”變成了“proc”;線程對象中PoolTag的值從“thr”變成了“thre”。這些變化導致了當前的內存取證工具對鏡像文件中進程和線程信息的檢測失效。
每個內核對象都有一個與之緊鄰的對象頭(OBJECT_ HEADER)。對象頭包含了控制對象生命周期的信息。相比Windows XP系統(tǒng),Windows 8系統(tǒng)的對象頭變化是比較大的。其中,Type、NameInfoOffset、HandleInfoOffset、QuotaInfoOffset域在Windows 8下分別由Lock、TypeIndex、Trace-Flags、InfoMask域所替代,如圖1所示。
內核對象是緊接著對象頭分配的,并且部分重疊,分析發(fā)現(xiàn)內核對象結構體是從對象頭中的Body域偏移量為0x18處開始的。在Windows 7之前的操作系統(tǒng),為了能夠從對象頭中獲取對象類型指針,直接在對象頭里保存了指向對象類型(OBJECT_TYPE)的指針,即對象頭中的Type域指向對象類型,對象類型的數(shù)據(jù)結構定義如圖2所示。
圖2 OBJECT_TYPE結構
然而,在Windows 8中,這部分的結構和定義發(fā)生了如下的變化:(1)Type域被TypeIndex域所取代;(2)所有的對象類型被放在一個內核全局表ObTypeIndexTable里;(3) TypeIndex域并非直接指向對象類型,而是存放全局表ObTypeIndexTable的索引,同一種類型內核對象的對象類型是一樣的,故TypeIndex取值相同;(4)經(jīng)逆向分析,系統(tǒng)通過函數(shù)ObGetObjectType獲取與掩碼對應的對象類型。內核對象、對象頭及對象類型的關系,如圖3所示。
圖3 Windows 8中內核對象、對象頭及對象類型的關系
經(jīng)分析發(fā)現(xiàn),Windows 8中進程對象(EPROCESS)和線程對象(ETHREAD)的對象頭中各特征域的取值情況如下:(1)在進程對象的對象頭中,TypeIndex=0x07;其對應的對象類型中,Name.MaximumLength=0x10,Name.Length= 0x0e,Name.Buffer=”Process”,Index=0x07。(2)線程對象的對象頭中,TypeIndex=0x08;其對應的對象類型中,Name. MaximumLength=0x10,Name.Length=0x0e,Name.Buffer=”Thread”,Index=0x08。
同時,所有的同步對象都有一個子結構DISPATHCER_HEADER,其定義如圖4所示。進程和線程也都是同步對象,因此,進程對象和線程對象的內核控制塊都是以子結構DISPATHCER_HEADER開始的。
圖4 DISPATCHER_HEADER結構
DISPATHCER_HEADER中的Type域代表對象的類型,對不同的對象其取值是不同的。Windows 8中進程對象和線程對象的Type域取值分別為0x03和0x06;域TimerMisc-Flags的取值分別為0x28和0x00;域Abandoned和Size的含義目前尚不清楚。但是,經(jīng)調試分析發(fā)現(xiàn),Windows XP到Windows 8系統(tǒng)的各個版本它們的取值都為0x00。
2.2 地址轉換
Windows 8使用的是虛擬地址,內核中使用的地址不能直接定位到鏡像文件中的物理地址,需要通過虛擬內存管理器提供的分頁機制來實現(xiàn)虛擬地址到物理地址的轉換。EPROCESS結構中的域DirectoryTableBase存放的是進程頁目錄表或者頁目錄指針表的物理地址。當進程切換時,系統(tǒng)會將DirectoryTableBase的值賦給CR3寄存器,并使用CR3寄存器進行虛擬地址到物理地址的轉換[11]。
在32位的x86系統(tǒng)上,物理地址空間的尋址范圍為4 GB。為了解決物理地址尋址空間的局限性問題,Intel公司采取了物理地址擴展(Physical Address Extension,PAE)技術,而PAE技術在32位Windows 8中默認是打開的。
2.2.1 PAE關閉下地址轉換
當系統(tǒng)未啟用PAE時,虛擬地址的高10位是頁目錄表的索引。當頁目錄項的頁面大小標志位PS為0時,虛擬地址中間10位為頁表索引。此時,頁目錄表的每個頁目錄表項都分別指向大小為4 KB的頁表,而頁表的每項又分別指向大小為4 KB物理頁,物理頁內的地址偏移量由虛擬地址的低12位計算而得。當PS為1時,頁目錄表中的每項分別指向頁面大小為4 MB的物理頁。物理頁的地址偏移量由虛擬地址的低22位計算而得。上述具體轉換如圖5所示。
圖5 PAE關閉情況下虛擬地址轉換
2.2.2 PAE開啟下地址轉換
當系統(tǒng)啟用PAE時,物理地址從32位擴展到36位,最大物理內存尋址空間由4 GB增加到64 GB。但是32位虛擬地址空間未變,應用程序可見的地址空間大小仍為4 GB,操作系統(tǒng)利用分頁機制將4 GB的虛擬地址空間映射到64 GB的物理內存上。此時,虛擬地址可以映射為4 KB或2 MB的物理頁,DirectoryTableBase域中存放的頁目錄表的基地址被頁目錄指針表的物理地址覆蓋。
虛擬地址的31-30位存放頁目錄指針表索引,通過它可計算頁目錄指針表項地址;29-21位存放頁目錄表索引,通過它可計算對應頁目錄表項地址。當頁目錄表項中的頁面大小標志PS為1時,頁目錄表項指向2 MB的物理頁,這時頁面偏移量由虛擬地址低21位確定。當PS為0時,頁目錄表項指向頁表;20-12位和低12位分別存放頁表索引和頁面偏移量。上述具體轉換如圖6所示。
圖6 PAE開啟情況下虛擬地址轉換
經(jīng)過前面對Windows 8下進程和線程對象結構和屬性特征的分析,給出在Windows 8鏡像文件中查找進程和線程的方法,具體步驟如下:
步驟1利用內核進程控制區(qū)域(Kernel Processor Control Region,KPCR)進行地址轉換。
由于系統(tǒng)使用虛擬地址,故相關內核數(shù)據(jù)結構中存放的都是虛擬地址,但在鏡像文件中,虛擬地址并不能直接定位到數(shù)據(jù),需要進行地址轉換。例如,當要查找與進程對象相對應的對象類型時,就必須進行地址轉換。
結合文獻[12-13]中給出的方法,查找KPCR的物理地址,以確定系統(tǒng)是否啟用PAE地址轉換,從而進行相應的虛擬地址到物理地址的轉換。
步驟2根據(jù)進程對象的特征,從鏡像文件中提取所有進程對象。
按步長8字節(jié)搜索鏡像文件,并根據(jù)2.1節(jié)分析出的特征來判斷進程對象,將所有搜索到的進程對象保存到數(shù)組中,提取流程如圖7所示。
圖7 鏡像文件分析流程圖
步驟3根據(jù)進程對象的域ActiveProcessLinks定位隱藏的進程。
嵌在進程對象數(shù)據(jù)結構中的域ActiveProcessLinks是一個雙鏈表節(jié)點,在Windows系統(tǒng)中,所有活動進程都連在一起,構成一個循環(huán)雙鏈表。當一個進程被創(chuàng)建時,域ActiveProcessLinks被作為一個節(jié)點加到此循環(huán)雙鏈表中;當一個進程被刪除時,此節(jié)點從雙鏈表中移除。
利用此原理,Ring0級隱藏進程的主要方式有兩種:一種是通過修改系統(tǒng)服務描述符表(System Services Descriptor Table,SSDT)對進程信息查詢函數(shù)NtQuerySystemInfomation函數(shù)進行Hook,從而將隱藏進程的信息從函數(shù)返回中去掉;另一種是從內核維護下的系統(tǒng)當前進程鏈表中摘除自身以達到隱藏目的。因為第一種方式只能在用戶級查詢中做到隱藏進程,對內核而言并沒有達到隱藏的目的,故在此只需考慮用第二種方式進行隱藏的進程。
由第二步查找得到的所有進程對象(可能包含隱藏進程對象),便可以根據(jù)其ActiveProcessLinks值重構進程鏈表,那些不在此鏈表中的進程對象即為隱藏進程,其流程如圖8所示。
圖8 隱藏進程檢測流程圖
步驟4根據(jù)進程對象數(shù)據(jù)結構定位進程擁有的所有線程。
進程塊EPROCESS中內嵌子結構KPROCESS的域ThreadList是一個鏈表頭,該鏈表包含一個進程的當前所有線程。內核通過調用PspCreateThread函數(shù)創(chuàng)建一個線程,并將其加到當前進程的線程鏈表中。通過遍歷此鏈表,便可以定位當前進程的所有線程信息。
本文采用內核版本號分別為NT 6.2.8139.0、NT 6.2.8250.0和NT 6.2.8400.0的32位Windows 8系統(tǒng),在PAE開啟和關閉的情況下分別對提出的算法進行了實驗。首先使用進程隱藏工具FUTo隱藏進程nc.exe,然后使用Mandiant公司開發(fā)的軟件Memoryze[14]提取鏡像物理內存。本文提出的算法在以上三個內核版本的Windows 8下,在PAE開啟和關閉的情況下,均能夠成功地提取出所有隱藏進程和非隱藏進程,以及每個進程所對應的線程信息。
如圖9,是在PAE開啟的狀態(tài)下獲取到的進程信息的截圖,所對應的Windows 8內核版本為NT 6.2.8250.0??梢钥吹剿惴軌虺晒μ崛》请[藏進程和隱藏進程nc.exe,并得到進程ID、父進程ID和進程對象的物理地址。
圖9 從內存鏡像文件中提取出的進程列表
圖10顯示了檢測到隱藏進程nc.exe后,進一步獲得的關于此進程的所有線程信息??梢钥闯?,算法能夠成功獲取各線程對象的物理地址、入口地址和所在模塊等詳細信息。
圖10 進程nc.exe擁有的線程列表
主要研究了微軟最新操作系統(tǒng)Windows 8下內存取證的原理和方法。通過逆向工程等分析手段,對Windows 8下內核對象的結構變化、進程和線程對象的特征,以及地址轉換進行了分析,從而提出了一種基于Windows 8內存鏡像文件的進程和線程提取算法,并且通過重構進程鏈表定位隱藏進程。實驗結果表明,算法不僅能夠成功提取系統(tǒng)隱藏進程和非隱藏進程,而且能夠獲得各進程相關的線程信息,具有較好的準確率和通用性,為內存取證人員的分析提供了堅實可靠的數(shù)據(jù)基礎。
[1]Simson L,Garfinkel L S.Digital forensics research:the next 10 years[J].Digital Investigation,2010,7:S64-S73.
[2]DFRWS.DFRWS 2005 forensics challenge[EB/OL].(2005-08)[2012-05-01].http://www.dfrws.org/2005/challenge/index.shtml.
[3]Burdach M.Digitial forensics of the physical memory[EB/OL].(2005-07)[2012-05-01].http://forensic.seccure.net/pdf/mburdach_ digital_forensics_of_physical_memory.pdf.
[4]Betz C.Memparser[CP/OL].(2005-08)[2012-05-01].http://sourceforge.net/projects/mem-parser.
[5]Schuster A.Searching for processes and threads in Microsoft Windows memory dumps[C]//Proceedings of the 6th Annual Digital Forensic Research Workshop(DFRWS 2006),2006,3:10-16.
[6]Okolica J,Peterson G.Windows operating systems agnostic memory analysis[J].Digital Investigation,2010,7:S48-S56.
[7]Dolan-Gavitt B.Forensic analysis of the Windows registry in memory[J].Digital Investigation,2008,5:S26-S32.
[8]Stevens R,Casey E.Extracting Windows command line details from physical memory[J].Digital Investigation,2010,7:S57-S63.
[9]Okolica J,Peterson G.Extracting the windows clipboard from physical memory[J].Digital Investigation,2011,8:S118-S124.
[10]Russinovich M,Solomon D,Ionescu A.Windows internals[M]. 6th ed.Redmond,WA:Microsoft Press,2012.
[11]Intel.Intel 64 and IA-32 architectures software developer’s manual[M/OL].(2012-05)[2012-05-01].http://download.intel. com/products/processor/manual/325462.pdf.
[12]Zhang R,Wang L,Zhang S.Windows memory analysis based on KPCR[C]//Proceedings of the 15th International Conference on Information Assurance and Security,2009,2:677-680.
[13]郭牧,王連海.基于KPCR結構的Windows物理內存分析方法[J].計算機工程與應用,2009,45(18):74-77.
[14]Mandiant.Memoryze[CP/OL].(2011-09)[2012-05-01].http:// www.mandiant.com/resources/download/memoryze.
XIANG Tao,GOU Muli
College of Computer Science,Chongqing University,Chongqing 400044,China
Memory forensics is a branch of importance in computer forensics,and searching for processes and threads in physical memory dumps is crucial and challenging for memory forensics.This paper investigates the searching of processes and threads in physical memory dumps based on the latest Microsoft operation system Windows 8.By utilizing reverse engineering techniques, the kernel data structures regarding processes and threads on Windows 8 are explored,and their features are identified.Based on these features,an algorithm is proposed for searching processes and threads in Windows 8 physical memory dumps.Experimental results and their analysis indicate that it is capable of extracting information about hidden and non-hidden processes and their threads successfully,thereby providing reliable data foundation for further analysis in memory forensics.
memory forensics;Windows 8;process;thread;physical memory analysis
內存取證是計算機取證的一個重要分支,而獲取內存鏡像文件中進程和線程信息是內存取證技術的重點和難點?;谖④涀钚虏僮飨到y(tǒng)平臺Windows 8,研究其進程和線程的獲取方法。運用逆向工程分析技術對Windows 8下進程和線程相關內核數(shù)據(jù)結構進行分析,提取出相應特征;基于這些特征,提出了一種能夠從物理內存鏡像文件中得到系統(tǒng)當前進程和線程信息的算法。實驗結果和分析表明,該算法能夠成功提取隱藏進程和非隱藏進程,及其各進程相關的線程信息,為內存取證分析提供了可靠的數(shù)據(jù)基礎。
內存取證;Windows 8;進程;線程;物理內存分析
A
TP309
10.3778/j.issn.1002-8331.1206-0397
XIANG Tao,GOU Muli.Memory forensics based on Windows 8 physical memory dumps.Computer Engineering and Applications,2013,49(19):63-67.
國家自然科學基金(No.61103211);中國博士后科學基金特別資助(No.201104302);中央高校基本科研業(yè)務經(jīng)費面上項目(No.CDJZR10180020)。
向濤(1980—),男,博士,副教授,主要研究領域為信息安全;茍木理(1985—),男,碩士研究生,主要研究領域為內存取證。E-mail:txiang@cqu.edu.cn
2012-06-26
2012-10-15
1002-8331(2013)19-0063-05
CNKI出版日期:2012-11-12http://www.cnki.net/kcms/detail/11.2127.TP.20121112.1436.004.html