羅文華
(中國(guó)刑事警察學(xué)院 網(wǎng)絡(luò)犯罪偵查系,遼寧 沈陽110854)
Windows操作系統(tǒng)環(huán)境下,每個(gè)進(jìn)程都被賦予自己的虛擬地址空間。以32位操作系統(tǒng)為例,每個(gè)進(jìn)程的虛擬地址空間為4GB,因此32位指針可以尋址從0x00000000至0xFFFFFFFF之間的任意地址。雖然每一個(gè)32位進(jìn)程可使用4GB的地址空間,但并不意味著每一個(gè)進(jìn)程實(shí)際擁有4GB的物理地址空間。4GB僅僅是一個(gè)虛擬地址空間,進(jìn)程實(shí)際可以得到的物理內(nèi)存要遠(yuǎn)小于其虛擬地址空間。并且,進(jìn)程的虛擬地址空間是為每個(gè)進(jìn)程所私有的,在進(jìn)程內(nèi)運(yùn)行的線程對(duì)內(nèi)存空間的訪問都被限制在調(diào)用進(jìn)程之內(nèi),而不能訪問屬于其他進(jìn)程的內(nèi)存空間。這樣,在不同的進(jìn)程中可以使用相同地址的指針來指向?qū)儆诟髯哉{(diào)用進(jìn)程的內(nèi)容而不會(huì)由此引起混亂。
為進(jìn)一步保證操作系統(tǒng)安全,進(jìn)程的虛擬地址空間被設(shè)計(jì)者人為地分為兩個(gè)部分——用戶空間與內(nèi)核空間。32位操作系統(tǒng)中,用戶最大可以使用3GB的空間,主要存儲(chǔ)程序執(zhí)行所需的管理結(jié)構(gòu)(如進(jìn)程環(huán)境塊、線程環(huán)境塊等)與數(shù)據(jù);內(nèi)核則可占據(jù)從3GB到4GB的這段地址,管理諸如進(jìn)程塊(包括執(zhí)行體進(jìn)程塊、核心進(jìn)程塊)、線程塊(包括執(zhí)行體線程塊、核心線程塊)、句柄表(包含所有已被進(jìn)程打開對(duì)象的指針)一類的系統(tǒng)結(jié)構(gòu)(見圖1)。用戶進(jìn)程通常情況下只能訪問用戶空間的虛擬地址,需要進(jìn)行系統(tǒng)調(diào)用(代表用戶進(jìn)程在內(nèi)核態(tài)執(zhí)行)時(shí)才可以訪問內(nèi)核空間。用戶空間對(duì)應(yīng)進(jìn)程,每當(dāng)進(jìn)程切換,用戶空間就會(huì)隨之變化;而內(nèi)核空間則由內(nèi)核負(fù)責(zé)映射,并不隨進(jìn)程改變,是固定的[1]。
圖1 特定進(jìn)程的用戶空間與系統(tǒng)空間內(nèi)容信息
以往的內(nèi)存電子數(shù)據(jù)取證研究往往重點(diǎn)關(guān)注系統(tǒng)空間中的管理結(jié)構(gòu)分析,相對(duì)忽視了用戶空間中與特定進(jìn)程直接關(guān)聯(lián)的數(shù)據(jù)內(nèi)容剖析,無法全面深刻揭示應(yīng)用程序的細(xì)節(jié)。然而,實(shí)踐發(fā)現(xiàn)系統(tǒng)空間中存儲(chǔ)的一般性進(jìn)程信息證據(jù)價(jià)值并不高,很難與特定的用戶行為進(jìn)行關(guān)聯(lián)。因此,研究進(jìn)程用戶空間中典型數(shù)據(jù)結(jié)構(gòu)的證據(jù)屬性,挖掘應(yīng)用程序行為秘密,業(yè)已成為內(nèi)存電子數(shù)據(jù)取證領(lǐng)域新的關(guān)注熱點(diǎn)。
本節(jié)重點(diǎn)以32位Windows 7操作系統(tǒng)為背景,結(jié)合用戶空間中最重要的進(jìn)程環(huán)境塊、線程環(huán)境塊、虛擬地址描述符等數(shù)據(jù)結(jié)構(gòu),描述其取證特性與分析方法。
每一個(gè)Windows進(jìn)程都有一個(gè)執(zhí)行體進(jìn)程塊(EPROCESS),負(fù)責(zé)描述進(jìn)程的基本信息(如進(jìn)程ID、父進(jìn)程ID、程序名、進(jìn)程優(yōu)先級(jí)、內(nèi)存管理信息、設(shè)備映像等),并指向其他與進(jìn)程控制相關(guān)的數(shù)據(jù)結(jié)構(gòu)。EPROCESS結(jié)構(gòu)的首部是核心進(jìn)程塊(KPROCESS,也成PCB),主要包含CPU調(diào)度時(shí)需要的信息,如進(jìn)程狀態(tài)、時(shí)間片大小等。需要指出的是,EPROCESS與KPROCESS均位于系統(tǒng)空間中,然而另一描述進(jìn)程的重要結(jié)構(gòu)——進(jìn)程環(huán)境塊(PEB)則處于用戶空間。PEB位于EPROCESS頭部偏移0x1a8處(見圖2),重點(diǎn)存放進(jìn)程運(yùn)行所需的環(huán)境信息,因?yàn)槠渲械臄?shù)據(jù)經(jīng)常需要用戶進(jìn)行修改,放在系統(tǒng)空間中會(huì)導(dǎo)致系統(tǒng)隱患和頻繁的操作模式切換,因此該結(jié)構(gòu)位于用戶空間中。
圖2 EPROCESS頭部偏移0x1a8處含有指向PEB結(jié)構(gòu)的指針
PEB結(jié)構(gòu)中(見圖3),有如下域值信息值得取證調(diào)查人員特別關(guān)注。ImageBaseAddress(偏移0x008處)域可以用來找尋映像(即可執(zhí)行文件)的基地址;Ldr(偏移0x008處)列舉所有被加載的模塊(利用下文所述VAD結(jié)構(gòu)也可實(shí)現(xiàn)此目的);基于ProcessParameters(偏移0x010處)則可以抽取進(jìn)程傳遞的參數(shù);Process Heap(偏移0x018處)指向堆指針列表,NumberOfHeaps(偏移0x088處)給出了堆列表的大小,ProcessHeaps(偏移0x090處)則直接指向了堆列表中的第一個(gè)堆(即缺省堆),綜合上述三種域值信息能夠?qū)崿F(xiàn)歸屬于特定進(jìn)程的堆結(jié)構(gòu)分析;AnsiCodePageData(偏移0x058處)、OemCodePageData(偏移 0x05C 處)、UnicodeCase TableData(偏移0x060處)分別指向了代碼頁中特定編碼格式的數(shù)據(jù),可在其指定的頁面空間中實(shí)現(xiàn)已知關(guān)鍵字的搜索。
圖3 PEB結(jié)構(gòu)體具體信息(部分)
每個(gè)進(jìn)程都有一個(gè)或多個(gè)線程,這些線程由執(zhí)行體線程塊(ETHREAD)(主要包含有線程創(chuàng)建時(shí)間、結(jié)束時(shí)間、當(dāng)前狀態(tài)、優(yōu)先級(jí)別等信息)進(jìn)行描述。ETHREAD的首部為核心線程塊(KTHREAD),其內(nèi)存儲(chǔ)有分發(fā)器(內(nèi)核中負(fù)責(zé)調(diào)度的例程集合)頭部、總用戶時(shí)間、總內(nèi)核時(shí)間、棧結(jié)構(gòu)等。ETHREAD和它所指向的結(jié)構(gòu)通常都位于系統(tǒng)地址空間中,唯一的例外是線程環(huán)境塊(TEB)。由于操作系統(tǒng)要在TEB中保存頻繁使用的線程相關(guān)數(shù)據(jù),因此它位于用戶地址空間中。KTHREAD結(jié)構(gòu)偏移0x088處即為指向TEB結(jié)構(gòu)體的指針(見圖4),它存放在比PEB所在地址低的地方。進(jìn)程中的每個(gè)線程都有自己的一個(gè)TEB,并主要以棧的方式進(jìn)行存儲(chǔ)[1]。
圖4 KTHREAD頭部偏移0x088處含有指向TEB結(jié)構(gòu)的指針
TEB的首部為NT_TIB結(jié)構(gòu)格式的NtTib域,基于其內(nèi)含的StackBase與StackLimit可實(shí)現(xiàn)棧信息的深度挖掘;偏移0x030處的ProcessEnvironmentBlock指向PEB結(jié)構(gòu),用于線程與所屬進(jìn)程的關(guān)聯(lián);偏移0x040處的Win32ThreadInfo則含有32位進(jìn)程的描述信息;ActivationContextStackPointer(偏移 0x1a8 處)負(fù)責(zé)指向棧的上下文數(shù)據(jù);StaticUnicodeString(偏移0xbf8 處)、StaticUnicodeBuffer(偏移 0xc00 處)、Thread PoolData(偏移0xf90)指向了非二進(jìn)制信息的存儲(chǔ)區(qū)域,可用于關(guān)鍵字搜索;0xf6c處的WinSockData則描述了網(wǎng)絡(luò)通訊數(shù)據(jù)(如果存在的話)。具體信息如圖5所示。
圖5 TEB結(jié)構(gòu)體具體信息(部分)
Windosws系統(tǒng)使用虛擬地址描述符VAD描述進(jìn)程的虛擬地址空間。對(duì)于每一個(gè)進(jìn)程,內(nèi)存管理器都需要為其分配一組VAD節(jié)點(diǎn),用來描述該進(jìn)程地址空間的狀態(tài)。這些VAD節(jié)點(diǎn)被組織成一棵自平衡的二叉樹,以便使查找過程迅速高效。當(dāng)一個(gè)進(jìn)程提出內(nèi)存空間請(qǐng)求時(shí),內(nèi)存管理器就創(chuàng)建一個(gè)VAD節(jié)點(diǎn)來保存此次內(nèi)存請(qǐng)求所提供的相關(guān)信息,比如被保留的地址范圍、共享或是私有、是否可被繼承,以及應(yīng)用頁面的保留屬性等。EPROCESS頭部偏移0x278處的VadRoot域使用MMVAD結(jié)構(gòu)描述VAD二叉樹節(jié)點(diǎn),內(nèi)含該VAD節(jié)點(diǎn)的左右孩子節(jié)點(diǎn)、所屬進(jìn)程等信息(見圖6),因此利用該結(jié)構(gòu)可以實(shí)現(xiàn)特定進(jìn)程涉及的所有VAD節(jié)點(diǎn)的遍歷。另外,依靠VAD二叉樹能夠確定地址空間類型,私有(private)或是已映射(mapped)。所謂私有是指該區(qū)域只存在于特定進(jìn)程的地址空間中,而已映射區(qū)域卻可以存在于多個(gè)進(jìn)程的地址空間中[2]。
圖6 MMVAD結(jié)構(gòu)體具體信息
基于圖6還可發(fā)現(xiàn)該結(jié)構(gòu)體中包含有一指向MSUBSECTION結(jié)構(gòu)的指針MappedSubsection(偏移0x024處),MSUBSECTION結(jié)構(gòu)首部為指向控制區(qū)域CONTROL_AREA的指針,如果該指針為空,則表示該區(qū)域?qū)傩詾樗接校駝t為已映射。已映射區(qū)域可細(xì)分為FILE_OBJECT和SECTION_OBJECT兩種類型,F(xiàn)ILE_OBJECT表示磁盤文件在內(nèi)存中的映射,SECTION_OBJECT則表示多個(gè)進(jìn)程間的共享內(nèi)存區(qū)域(如果CONTROL_AREA結(jié)構(gòu)體中的FilePointer指針為空,即表示該區(qū)域類型為 SECTION_OBJECT)。CONTROAL_AREA結(jié)構(gòu)首部就是指向SEGMENT結(jié)構(gòu)的指針,而在SEGMENT結(jié)構(gòu)中同樣含有一指針指向CONTROAL_AREA結(jié)構(gòu)。在使用Rootkit技術(shù)修改EPROCESS結(jié)構(gòu)體中的雙向鏈表指針ActiveProcessLinks,使進(jìn)程從鏈表中脫離的情況下,可通過掃描SEGMENT結(jié)構(gòu)體,逆向發(fā)現(xiàn)被隱藏的進(jìn)程[3]。利用VAD二叉樹可以發(fā)現(xiàn)進(jìn)程間的共享區(qū)域,直至挖掘出對(duì)象句柄表(Object Handle Table)的細(xì)節(jié)信息,具體流程如圖7所示。
圖7 基于VAD發(fā)現(xiàn)共享的內(nèi)存區(qū)域
本節(jié)利用Windbg(Windows平臺(tái)下的用戶態(tài)和內(nèi)核態(tài)調(diào)試工具)工具,重點(diǎn)基于第2節(jié)所述管理結(jié)構(gòu)說明針對(duì)進(jìn)程用戶空間的電子數(shù)據(jù)取證方法具體應(yīng)用。Windbg能夠用于調(diào)試在線系統(tǒng)和鏡像文件 (擴(kuò)展名為DMP),利用工具自帶的“process”命令可獲得特定進(jìn)程的EPROCESS結(jié)構(gòu)的內(nèi)存地址信息,利用該地址可以追溯用戶空間中其他重要的管理結(jié)構(gòu)。實(shí)例中“win32dd.exe”的EPROCESS結(jié)構(gòu)首地址為0x87ccb030,其結(jié)構(gòu)頭部偏移0x1a8處出現(xiàn)有“Peb:0x7ffdd000_PEB”,可知該進(jìn)程環(huán)境塊的起始地址為0x7ffdd000。圖8所示為基于0x7ffdd000地址解析出的PEB內(nèi)容。
圖8 起始地址為0x7ffdd000的PEB具體信息(部分)
以Ldr域?yàn)槔撚虍?dāng)前值為 0x77df7880,指向PEB_LDR_DATA結(jié)構(gòu)。深入分析該結(jié)構(gòu)發(fā)現(xiàn),其內(nèi)含有名為 InLoadOrderModuleList(0x221990-0x245648)和 InMemoryOrderModuleList(0x221998-0x245650)的鏈表(LIST_ENTRY)(見圖9)。依據(jù)鏈表存儲(chǔ)的地址,即可實(shí)現(xiàn)加載模塊的挖掘。
圖9 起始地址為0x77df7880的PEB_LDR_DATA具體信息
按照 EPROCESS→KPROCESS→ThreadListHead→ETHREAD→KTHREAD→TEB的次序,找尋到該進(jìn)程的第一個(gè)線程的地址為0x87e7e298,其具體內(nèi)容如圖10所示。該結(jié)構(gòu)體中最重要的就是首部NtTib域,其中含有StackBase、StackLimit等歸屬于特定線程的棧屬性,利用這些信息可以抽取出被調(diào)用函數(shù)的地址及參數(shù)。
圖10 起始地址為0x87e7e298的TEB具體信息(部分)
EPROCESS頭部偏移0x278處的VadRoot值為0x875c9780,其左右孩子節(jié)點(diǎn)地址分別為0x87dd3 b00、0x87ff0ac8,Subsection 結(jié)構(gòu)與 MappedSubsection結(jié)構(gòu)的指針同為0x88518a70(見圖11)。需要指出的是,每個(gè)VAD二叉樹節(jié)點(diǎn)均為MMVAD結(jié)構(gòu),因此基于根節(jié)點(diǎn)可以獲知整個(gè)二叉樹的信息。
圖11 VAD二叉樹根節(jié)點(diǎn)信息
vad命令后接二叉樹根節(jié)點(diǎn)地址可以顯示該樹全部節(jié)點(diǎn)信息(見圖12),其中包括每個(gè)樹節(jié)點(diǎn)的虛擬地址、所在層級(jí)、提交類型、讀寫權(quán)限等。以DLL文件為例,通常就包含在提交類型為“Mapped”、讀寫權(quán)限為“EXECUTE_WRITECOPY”的VAD空間中。如果要對(duì)DLL文件進(jìn)行調(diào)查,便可重點(diǎn)針對(duì)此類VAD空間進(jìn)行挖掘。
圖12 獲取VAD二叉樹信息
選取0x87a7bef8節(jié)點(diǎn)描述的虛擬地址區(qū)域進(jìn)行解析,其 MappedSubsection域值為 0x87afc428;MappedSubsection域中ControlArea指針值為0x87 afc3d8;ControlArea域中包含有指向Segment的指針0x8ac56c50;而Segment域中包含有指向ControlArea的指針0x87afc3d8(見圖13)。利用互逆的這兩個(gè)指針可實(shí)現(xiàn)進(jìn)程結(jié)構(gòu)體與對(duì)象句柄的追蹤。另外,ControlArea域中還包含有一名為FilePointer的指針,負(fù)責(zé)指向具體的FILE_OBJECT對(duì)象;在該對(duì)象的FileName域中會(huì)出現(xiàn)有被調(diào)用的動(dòng)態(tài)鏈接庫文件的完整路徑與文件名稱。
圖13 基于內(nèi)存數(shù)據(jù)結(jié)構(gòu)獲取DLL文件信息
文中重點(diǎn)分析對(duì)象是Windows操作系統(tǒng)內(nèi)存轉(zhuǎn)儲(chǔ)(DMP)文件,同時(shí) ProDiscover IR、Mandiant Memoryze、Moonsols DumpIt等工具也可生成該格式文件。而對(duì)于由DD(已升級(jí)到Windows和Linux環(huán)境下均可使用)、Mantech mdd等工具生成的內(nèi)存映像文件,則無法使用WinDbg進(jìn)行信息獲取,但可使用Winhex一類的十六進(jìn)制編輯器完成取證分析。另外,本文應(yīng)用實(shí)例基于特定進(jìn)程,在需要針對(duì)整個(gè)鏡像中的進(jìn)程用戶空間進(jìn)行深度分析時(shí),可借助開源工具Volatility予以實(shí)現(xiàn)[4]。進(jìn)程用戶空間中還有一些用于實(shí)現(xiàn)特定功能或傳遞關(guān)鍵信息的子結(jié)構(gòu),進(jìn)一步挖掘這些結(jié)構(gòu)的電子數(shù)據(jù)取證特性,從而全面深刻揭示用戶程序操作行為,將是課題組下一步的重點(diǎn)工作。
參考文獻(xiàn):
[1]Russinovich MR,Solomon DA.Microsoft windows Internals:Windows Server 2008 and Window Vista[M].5th ed.USA:Microsoft Press,2012:146-253.
[2]Okolica J,Peterson GL.Windows operating systems agnostic memory analysis[J].Digital Investigation 2010,(7)::48-56.
[3]Hejazi SM,Talhi C,Debbabi M.Extraction of forensically sensitive information from windows physical memory[J].Digital Investigation,2009,6(S1):121-131.
[4]羅文華,湯艷君.基于Volatility的內(nèi)存信息調(diào)查方法研究[J].中國(guó)司法鑒定,2012,(4):90-93.