安全的磁盤(pán)清理軟件可以很好地為數(shù)字化信息系統(tǒng)服務(wù)。目前大部分磁盤(pán)清理軟件未能徹底清除在磁盤(pán)中的數(shù)據(jù),對(duì)于磁盤(pán)上已經(jīng)刪除的文件信息在未重新寫(xiě)入新的文件時(shí),Windows只是標(biāo)記,并沒(méi)有進(jìn)行數(shù)據(jù)清理。這就使得可以通過(guò)數(shù)據(jù)恢復(fù)的手段獲取保密信息,大多數(shù)清理軟件只是采用重新填寫(xiě)無(wú)效文件的方式清除磁盤(pán)上的數(shù)據(jù)。而這樣會(huì)大大縮短磁盤(pán)的使用壽命。文中研究了Windows的文件系統(tǒng)NTFS清除磁盤(pán)數(shù)據(jù)的原理,采用直接訪(fǎng)問(wèn)NTFS的主文件列表找到文件具體存儲(chǔ)的位置,并解碼二進(jìn)制文件,從而徹底清除文件,減少了對(duì)操作系統(tǒng)的依賴(lài),避免了大量盲目填寫(xiě)無(wú)效文件的操作,并保護(hù)了磁盤(pán)使用壽命。
1 NTFS系統(tǒng)結(jié)構(gòu)原理
1.1 基本原理
NTFS是Windows NT引入的新型文件系統(tǒng),由于NTFS的結(jié)構(gòu)復(fù)雜,內(nèi)容繁多,這里僅對(duì)NTFS卷上的底層結(jié)構(gòu)做分析。在NTFS格式中,文件以簇的形式分配。最小的單位為扇區(qū),N個(gè)扇區(qū)為一簇。其中,N的值由引導(dǎo)扇區(qū)規(guī)定。NTFS格式磁盤(pán)的數(shù)據(jù)分為4大部分:引導(dǎo)區(qū)、主文件列表、系統(tǒng)文件和文件數(shù)據(jù)區(qū)。
引導(dǎo)區(qū)(Partition boot sector):所有磁盤(pán)格式都有這個(gè)區(qū),占用了磁盤(pán)第一個(gè)扇區(qū)。
主文件列表(Master File List):記錄了卷上所有文件,每個(gè)文件對(duì)應(yīng)了表上的一條記錄。
系統(tǒng)文件(System file):NTFS一共有16個(gè)系統(tǒng)文件,8個(gè)隱藏文件。
文件數(shù)據(jù)區(qū)(File Area):存放文件數(shù)據(jù)。
NTFS跟FAT16,F(xiàn)A332一樣都在引導(dǎo)扇區(qū)中有一些BPB參數(shù),但與FAT32,F(xiàn)AT16并不完全相同。文獻(xiàn)對(duì)NTFS引導(dǎo)扇區(qū)一些重要數(shù)據(jù)的含義進(jìn)行了詳細(xì)介紹。
1.2 主控文件表與元數(shù)據(jù)文件
MFT是一個(gè)對(duì)應(yīng)的數(shù)據(jù)庫(kù),由一系列的文件記錄組成,卷中每一個(gè)文件都有一個(gè)文件記錄。主文件表本身也有自己的文件記錄。實(shí)際上,MFT自身也是一個(gè)文件,因此,主文件列表的第一個(gè)記錄就是它自身。MFT的每個(gè)記錄都有一個(gè)編號(hào),這里稱(chēng)為ID號(hào),這個(gè)ID從0開(kāi)始。MFT自身是NTFS系統(tǒng)的第一個(gè)文件,所以文件$MFT的ID號(hào)為0。
MFT和其他23個(gè)文件一起,用戶(hù)每添加一個(gè)文件ID號(hào)加1。MFT頭的長(zhǎng)度跟偏移處的數(shù)據(jù)含義不變,但屬性列表是可變的,其不同的屬性列表,有著不同的含義,最后能看到MFT表以FFFFFFFFH結(jié)束。
MFT頭的標(biāo)準(zhǔn)信息見(jiàn)文獻(xiàn),它對(duì)MFT表的結(jié)構(gòu)進(jìn)行了全面的分析。MFT前16個(gè)文件屬于系統(tǒng)文件,也稱(chēng)為元文件,用于存放系統(tǒng)中的元數(shù)據(jù),元數(shù)據(jù)文件及其作用見(jiàn)文獻(xiàn)。
1.3 文件的MFT記錄及其包含的屬性
一個(gè)文件通常占用一條文件記錄。然而當(dāng)一個(gè)文件具有多項(xiàng)屬性值的時(shí)候,就可以占用一個(gè)以上的文件記錄。這樣的情況下,第一個(gè)文件記錄就是基本文件記錄。其中存儲(chǔ)了該文件需要其他文件記錄的位置。小文件和小的文件夾將全部存放在MFT記錄中。
文件記錄包含索引信息,小的文件夾記錄完全存儲(chǔ)在MFT結(jié)構(gòu)里。然而大文件與文件夾被組織成為B+樹(shù)結(jié)構(gòu),一個(gè)指針指向一個(gè)外部簇,該簇用來(lái)存放那些MFT內(nèi)存儲(chǔ)不了的文件夾屬性。
在MFT記錄中的每個(gè)屬性都有一個(gè)屬性頭,這個(gè)屬性頭包含一些該屬性的重要信息,如屬性類(lèi)型、大小、名字以及是否為常駐屬性等。
2 具體實(shí)現(xiàn)方法
具體實(shí)現(xiàn)分為兩個(gè)模塊:(1)索引磁盤(pán)中所有文件的數(shù)據(jù)段在磁盤(pán)中存放的起始簇號(hào)。(2)動(dòng)態(tài)建立一個(gè)與磁盤(pán)文件存放相對(duì)的文件樹(shù),對(duì)子樹(shù)進(jìn)行遍歷查找每個(gè)文件數(shù)據(jù)段的簇號(hào),從而可以從扇區(qū)直接清除數(shù)據(jù)信息。最后刪除所建立的子樹(shù),釋放占據(jù)的內(nèi)存空間。
2.1 索引磁盤(pán)中未刪除文件的簇號(hào)
在NTFS中,文件目錄僅是文件名的一個(gè)索引,NTFS使用了一種特殊的方式把文件名組織起來(lái),以便快速訪(fǎng)問(wèn)。當(dāng)創(chuàng)建一個(gè)目錄時(shí),NTFS必須對(duì)目錄中的文件名屬性進(jìn)行索引。
一個(gè)目錄的MFT將其目錄中的文件名與子目錄名進(jìn)行排序,并保存在索引根屬性中。所以可以通過(guò)訪(fǎng)問(wèn)根目錄的索引分配找到磁盤(pán)上面的一級(jí)目錄,并記錄下其MFT參考號(hào),然后在通過(guò)該參考號(hào)獲取MFT文件,進(jìn)而再找到其索引分配,就可以將一級(jí)目錄下的子目錄全部及找到,直到不再有子目錄為止??山⒊稣麄€(gè)磁盤(pán)的目錄樹(shù),每項(xiàng)MFT文件中都記錄了該文件是被刪除或正在被使用的目錄。通過(guò)解析以上分析的屬性就能獲取這些信息,該算法流程如圖1所示。
圖中每一步操作都是根據(jù)MFT表的屬性進(jìn)行編碼。
第一步從分區(qū)信息表即中可以獲得這些有用的信息。讀取特定扇區(qū)的信息可以調(diào)用CreateFile與ReadFile來(lái)實(shí)現(xiàn)。讀取某個(gè)MFT元文件的具體方法是:通過(guò)BPB參數(shù)獲取$MFT的位置,然后根據(jù)源文件的MFT記錄號(hào),移動(dòng)句柄,就可以順利讀取MFT元文件。由于每個(gè)MFT文件的大小是1 kB,所以句柄的偏移dwStartSector=MFT文件記錄號(hào)×2+$MFT所在的扇區(qū)號(hào)。即可訪(fǎng)問(wèn)任何一個(gè)磁盤(pán)的MFT元數(shù)據(jù)文件信息。
第二步根據(jù)根目錄的MFT文件信息,解析索引A0H屬性從而找出索引信息,這涉及到解碼二進(jìn)制文件。
第三步根據(jù)索引中的信息找出根目錄的子目錄的MFT編號(hào),再根據(jù)這個(gè)編號(hào)打開(kāi)MFT文件內(nèi)容,找出30H屬性與MFT屬性頭,解析文件名,以及標(biāo)記文件是否為目錄,是否被刪除的信息。
第四步如果該文件是目錄,則繼續(xù)查找它下面的子目錄,否則轉(zhuǎn)第五步。
第五步 如果該文件已刪除,則返回第一步;否則,打開(kāi)它對(duì)應(yīng)的MFT文件,然后解析80H屬性,找到文件數(shù)據(jù)段開(kāi)始的簇號(hào),并記錄下來(lái)。
2.2 建立磁盤(pán)對(duì)應(yīng)的文件樹(shù)
建立一個(gè)N叉樹(shù)來(lái)表示每一個(gè)磁盤(pán)中的文件存放,只是它的數(shù)據(jù)信息就是上面獲取的文件數(shù)據(jù)段開(kāi)始的簇的編號(hào)。遍歷文件樹(shù)的過(guò)程,即是獲取簇號(hào)以及對(duì)相應(yīng)簇的信息進(jìn)行清除的過(guò)程。每個(gè)磁盤(pán)中MFT表的數(shù)量巨大,所以在遍歷完根目錄下子目錄的所有文件時(shí),要?jiǎng)h除該子樹(shù),便于釋放內(nèi)存,從而減少算法的空間開(kāi)銷(xiāo)。而且N叉樹(shù)的數(shù)據(jù)結(jié)構(gòu)本身對(duì)遍歷效率也有很大提升,筆者采用深度優(yōu)先遞歸搜索,并對(duì)此進(jìn)行優(yōu)化,取得了良好效果。
測(cè)試平臺(tái)為windows7,測(cè)試工具為winhex。清除之前可以看到新建文本文檔大小是6.9 kB,所在簇的信息如圖2所示。
執(zhí)行程序后結(jié)果如圖3所示。可以看到文件的大小歸0,并且80H的信息發(fā)生變化,原本存儲(chǔ)的索引內(nèi)容全部被清除為0,即文件的數(shù)據(jù)信息全部被清除。
3 結(jié)束語(yǔ)
NTFS文件系統(tǒng)十分復(fù)雜,這里主要針對(duì)NTFS系統(tǒng)管理磁盤(pán)的MFT文件進(jìn)行分析,解析它的一系列屬性,得到每個(gè)文件的數(shù)據(jù)段信息的開(kāi)始簇號(hào)。通過(guò)對(duì)磁盤(pán)建立文件樹(shù),標(biāo)記所有未刪除文件的數(shù)據(jù)段開(kāi)始的簇號(hào),從而可以直接清除剩余磁盤(pán)簇的信息,達(dá)到繞過(guò)操作系統(tǒng)直接對(duì)扇區(qū)進(jìn)行清除的目的,避免了數(shù)據(jù)恢復(fù)的可能。