羅文華 龍立名
(中國(guó)刑事警察學(xué)院網(wǎng)絡(luò)犯罪偵查系 遼寧 沈陽(yáng) 110035)
Windows操作系統(tǒng)通過(guò)Prefetch文件夾實(shí)現(xiàn)“程序預(yù)讀”功能,以提升可執(zhí)行程序的運(yùn)行速度。Prefetch文件夾的電子數(shù)據(jù)取證特性在于基于其中擴(kuò)展名為PF的文件,揭示可執(zhí)行程序運(yùn)行情形,挖掘出程序名稱、存儲(chǔ)位置、最近一次運(yùn)行時(shí)間、運(yùn)行次數(shù)、動(dòng)態(tài)鏈接庫(kù)等[1]。國(guó)內(nèi)已有的討論P(yáng)refetch文件夾取證特性的文獻(xiàn)均未涉及PF文件結(jié)構(gòu)格式,挖掘深度也不深入。同時(shí),隨著Windows操作系統(tǒng)的升級(jí),PF文件的格式也不斷變化。如圖1所示的WinPrefetchView工具,其在Windows 7(含)之前的版本下能夠較為完整地還原程序運(yùn)行狀況,但在Windows 10環(huán)境中卻無(wú)法分析出Process Path、Run Counter、Last Run Time,能夠顯示出的Created Time、Modified Time、File Size基于文件屬性獲得,并不涉及文件的內(nèi)部結(jié)構(gòu)。
圖1 WinPrefetchView在Windows 10環(huán)境下的運(yùn)行結(jié)果
Python是當(dāng)下非常流行的主流編程語(yǔ)言,擁有用戶友好的語(yǔ)法和大量第三方模塊,由此提供了一個(gè)較好的取證支撐平臺(tái)。比較不同版本W(wǎng)indows操作系統(tǒng)環(huán)境下PF文件格式的異同,基于Python強(qiáng)大的函數(shù)功能,完成典型的Windows 7和Windows 10環(huán)境下可執(zhí)行文件操作痕跡的智能取證分析,實(shí)現(xiàn)有別于現(xiàn)有工具的取證深度。
Windows XP、Windows 2003、Windows Vista、Windows 7、Windows 8、Windows 10等操作系統(tǒng)中均存在PF文件,本文所討論的智能工具重點(diǎn)針對(duì)目前國(guó)內(nèi)使用廣泛的Windows 7與Windows 10進(jìn)行解析。
Windows 7中的PF文件通常由文件頭部、節(jié)塊(Section)入口表和具體的節(jié)塊組成,節(jié)塊可以有多個(gè),每個(gè)節(jié)塊包含著以little-endian方式存儲(chǔ)的特定類型信息。PF文件頭長(zhǎng)度為84字節(jié),各部分具體含義如表1所示。其中,對(duì)于“版本號(hào)”域,“0x11”表示W(wǎng)indows XP和2003,“0x17”對(duì)應(yīng)Windows Vista和7,“0x1a”標(biāo)識(shí)Windows 8,“0x1e”則說(shuō)明是Windows 10;偏移0x0010處的程序名稱被限制在29字節(jié)以內(nèi)(因?yàn)檫€需另外加上結(jié)束字符);Prefetch文件夾中PF文件名稱的哈希值部分即取自于偏移0x004C處的信息。
表1 Windows 7中的PF文件頭部
節(jié)塊入口表長(zhǎng)度為156個(gè)字節(jié),各域值含義如表2所示。PF文件默認(rèn)包含A、B、C、D4個(gè)節(jié)塊,在表2中即指示出了各節(jié)塊具體的偏移位置及長(zhǎng)度或條目數(shù)信息。節(jié)塊A負(fù)責(zé)記錄運(yùn)行起始時(shí)間和持續(xù)時(shí)間,同時(shí)指示出文件名相對(duì)于節(jié)塊C起始位置的偏移及文件名長(zhǎng)度,并存儲(chǔ)可執(zhí)行程序?qū)?yīng)的NTFS file reference;節(jié)塊B包含指向運(yùn)行所需的動(dòng)態(tài)鏈接庫(kù)鏈表的指針與調(diào)用模塊的數(shù)量;節(jié)塊C以UTF-16形式記錄可執(zhí)行程序的名稱,相較于文件頭部,此處的名稱不再受存儲(chǔ)空間大小的限制。另外,基于節(jié)塊入口表可以解析出惡意程序操作較為關(guān)注的最后一次運(yùn)行時(shí)間(以FILETIME UTC方式存儲(chǔ))和運(yùn)行次數(shù)信息時(shí)間。
節(jié)塊D主要包含磁盤的卷信息,當(dāng)對(duì)應(yīng)多個(gè)磁盤卷時(shí),節(jié)塊D會(huì)對(duì)應(yīng)出多個(gè)條目。比如一個(gè)存儲(chǔ)于U盤上的程序操作執(zhí)行,但其所需的動(dòng)態(tài)鏈接庫(kù)均來(lái)自于系統(tǒng)盤,此時(shí)節(jié)塊D中就會(huì)同時(shí)含有U盤與系統(tǒng)盤的卷設(shè)備名稱、卷創(chuàng)建時(shí)間、卷序列號(hào)標(biāo)識(shí)等[3]。節(jié)塊D還會(huì)利用其子節(jié)塊E和F分別指示出運(yùn)行涉及的文件(夾)的NTFS file reference及目錄信息。節(jié)塊D的具體條目細(xì)節(jié)參見(jiàn)表3。
表2 節(jié)塊入口表
表3 節(jié)塊D中的條目信息細(xì)節(jié)
Windows 10中的PF文件采用了類似于Windows SuperFetch的壓縮格式,SuperFetch類型的文件是Windows操作系統(tǒng)用來(lái)優(yōu)化內(nèi)存使用模式。文件頭部使用“MAMx04”(即“0x4d0x410x4d0x04”)進(jìn)行標(biāo)識(shí);之后的4字節(jié)有種說(shuō)法是表示未壓縮信息的長(zhǎng)度,但實(shí)驗(yàn)卻未能證實(shí),至少在Windows 10環(huán)境下不是;再后的是4個(gè)字節(jié)的CRC32校驗(yàn)碼,該校驗(yàn)碼主要根據(jù)被壓縮的信息內(nèi)容計(jì)算得到;最后便是采用微軟公司XPRESS Huffman算法壓縮的具體內(nèi)容(表4)。解壓之后的PF文件可以使用Windows 7環(huán)境下相同的方法進(jìn)行解析。
表4 Windows 10中的PF文件結(jié)構(gòu)
需要指出的是“MAM”之后的“x04”也有著特定的含義。該域的前4位指示出文件是否進(jìn)行了CRC32校驗(yàn),以便于后續(xù)的計(jì)算比對(duì);后4位則指明具體使用的壓縮算法:①表示默認(rèn)缺省的壓縮算法;②表示LZ;③表示Xpress;④則表示Xpress Huffman。明確具體的壓縮算法,對(duì)于能否成功予以解壓具有重要的意義。
利用Python語(yǔ)言重點(diǎn)實(shí)現(xiàn)了針對(duì)Windows 7和Windows 10環(huán)境下PF文件的智能取證分析工具。Windows 7下具體分析流程如圖2所示,Windows 10下的解壓流程如圖3所示。其中,圖2中的讀取文件操作利用Read函數(shù)完成,Python中的Read函數(shù)與C語(yǔ)言非常相似,都是通過(guò)參數(shù)fd所指的文件傳送Count個(gè)字節(jié)到Buf 指針?biāo)傅膬?nèi)存中,同時(shí)文件讀寫位置會(huì)隨讀取到的字節(jié)移動(dòng),以便于下一次讀??;數(shù)據(jù)格式轉(zhuǎn)化使用的是Struct模塊的Unpack函數(shù),指定好具體格式與內(nèi)容即可。
圖2 Windows 7環(huán)境下PF文件分析流程
圖3 Windows 10環(huán)境下PF文件的解壓縮流程
圖3中計(jì)算CRC32校驗(yàn)值使用的是Python中Binascii模塊的CRC32函數(shù),默認(rèn)情況下只需將參數(shù)設(shè)置為需要校驗(yàn)的信息內(nèi)容;而實(shí)現(xiàn)解壓功能的核心函數(shù)是Windows API RtlDecompressBufferEx函數(shù),該函數(shù)支持多種算法,通過(guò)指定具體參數(shù)完成Xpress Huffmanyas壓縮數(shù)據(jù)的解壓。
在Windows 10環(huán)境下運(yùn)行可執(zhí)行文件Mspaint.exe(畫(huà)圖工具),之后將Prefetch文件夾下生成的MSPAINT-735AD0E9.pf通過(guò)圖3所示的流程進(jìn)行解壓,然后依照Windows 7分析流程予以深度挖掘。在圖4所示的分析結(jié)果中,除了運(yùn)行次數(shù)(Run Count)、末次運(yùn)行時(shí)間(Last Executed)、動(dòng)態(tài)鏈接庫(kù)等信息之外,智能取證工具腳本還挖掘出了現(xiàn)有軟件無(wú)法實(shí)現(xiàn)的卷信息,包括卷名稱“DEVICEHARDDISKVOLUNE1”、卷創(chuàng)建時(shí)間“2017-07-20 07:06:00.449656”、卷標(biāo)識(shí)“76a2”及運(yùn)行涉及的文件夾列表。
圖4 挖掘出的卷信息與文件夾列表
同時(shí)在動(dòng)態(tài)鏈接庫(kù)列表中提煉出之前未被關(guān)注過(guò)的重要信息,即可執(zhí)行程序曾經(jīng)操作過(guò)的文件信息,包括文件名稱、文件類型和存儲(chǔ)路徑(圖5)。實(shí)驗(yàn)證明PF文件中一般會(huì)保留最近操作過(guò)的8個(gè)文件的痕跡。這也使得PF文件在特定條件下具備了類似于Recent文件夾和跳轉(zhuǎn)列表的可用于分析文件操作痕跡的電子數(shù)據(jù)取證特性[4]。
圖5 可執(zhí)行程序曾經(jīng)操作過(guò)的文件名稱與路徑信息
PF文件是分析可執(zhí)行程序操作痕跡的核心證據(jù)源,其內(nèi)部包含的A、B、C、D乃至E、F節(jié)塊分別對(duì)應(yīng)著價(jià)值巨大的證據(jù)或線索信息。盡管基于結(jié)構(gòu)特征對(duì)PF文件格式予以較為詳盡地解析,但依然存留有個(gè)別區(qū)域,其功用尚需進(jìn)一步探索,如內(nèi)存頁(yè)抓取等內(nèi)存優(yōu)化細(xì)節(jié)機(jī)制。
典型證據(jù)源結(jié)構(gòu)與功能的深入分析是智能取證分析工具研發(fā)的根本,但選擇到合適的編程語(yǔ)言予以實(shí)現(xiàn)也十分關(guān)鍵。Python語(yǔ)言誕生至今不過(guò)20余年,時(shí)至今日已憑借其強(qiáng)大的標(biāo)準(zhǔn)庫(kù)和靈活的可擴(kuò)展性,以及優(yōu)美、清晰、簡(jiǎn)單的編程風(fēng)格,成為目前使用最廣泛的編程語(yǔ)言之一,其未來(lái)發(fā)展?jié)摿σ沧顬闃I(yè)界所看好。PF文件的智能分析涉及數(shù)據(jù)移位、指針跳轉(zhuǎn)、文件讀寫、格式轉(zhuǎn)化、哈希校驗(yàn)、壓縮解壓等復(fù)雜操作,傳統(tǒng)語(yǔ)言或是難以實(shí)現(xiàn),或是需要耗費(fèi)繁重的編程工作量。使用Python語(yǔ)言,借助其強(qiáng)大的模塊函數(shù)與多元化支持特性,只要600余行的代碼即實(shí)現(xiàn)了Windows 10和Windows 7環(huán)境下PF文件的深入分析,使得取證工作事半功倍??梢灶A(yù)見(jiàn),隨著標(biāo)準(zhǔn)庫(kù)的進(jìn)一步豐富,Python將在電子數(shù)據(jù)取證工作中發(fā)揮愈來(lái)愈重要的作用,成為偵查取證人員手中打擊犯罪的利器。
[1]羅文華,鄭志翔.從電子數(shù)據(jù)取證角度看Windows 7操作系統(tǒng)新變化[J].中國(guó)刑警學(xué)院學(xué)報(bào),2015(4):34-37.
[2]Joachimmetz.Windows Prefetch File (PF) format[EB/OL].(2016-11-20)[2017-05-03].https://github.com/libyal/libscca/blob/master/documentation/Windows%20Prefetch%20File%20(PF)%20format.asciidoc,2016.
[3]羅文華,龍立名.從“快播涉黃案”看電子數(shù)據(jù)取證關(guān)鍵技術(shù)[J]. 中國(guó)刑警學(xué)院學(xué)報(bào),2016(3):45-49.
[4]趙志巖,石文昌.基于證據(jù)鏈的電子證據(jù)可信性分析[J].計(jì)算機(jī)科學(xué),2016(7):131-135.