數(shù)據(jù)恢復(fù)是一門比較有用的技術(shù),尤其是當(dāng)硬盤、U盤、手機存儲卡等發(fā)生數(shù)據(jù)丟失時,如何找回丟失的文件和數(shù)據(jù)則成為最關(guān)鍵的問題。能否找回數(shù)據(jù)不僅和存儲介質(zhì)有關(guān),而且和操作系統(tǒng)以及介質(zhì)所在的文件系統(tǒng)有很大的關(guān)系,基本上,分區(qū)表及文件系統(tǒng)(File System,簡稱FS)是決定數(shù)據(jù)能否找回的關(guān)鍵,因為它決定了數(shù)據(jù)存儲的邏輯結(jié)構(gòu),一旦FS被破壞,即便物理上數(shù)據(jù)依然存在,可因為數(shù)據(jù)已經(jīng)失去完整性和連續(xù)性,所以找回數(shù)據(jù)就變得相當(dāng)困難。分區(qū)表則是決定整個磁盤的布局,從分區(qū)表可以得知分區(qū)數(shù)量、主/擴展分區(qū)及邏輯分區(qū)的位置與大小等,所以分區(qū)表丟失對數(shù)據(jù)的破壞也是異常嚴(yán)重的。本文僅談?wù)撐募到y(tǒng)的結(jié)構(gòu)。
Windows上常見的文件系統(tǒng)有FAT16/32,NTFS,exFAT等,F(xiàn)AT目前基本只有U盤上使用,硬盤上一般都用NTFS,因為FAT32下單個文件最大不能超4G而且文件信息有限,NTFS則不受這個限制,而且加入了安全描述符(Security Descriptor),也就是我們可以為文件或目錄設(shè)置不同的權(quán)限。但是FAT32在U盤下有時還是很方便,當(dāng)然也可以格式化成NTFS,不過格成NTFS會遇到一種特殊的情況,比如到了某臺不受你控制的電腦,你可能因為當(dāng)前權(quán)限原因而無法刪除U盤上的文件,問題就變得麻煩了。除此之外,也可格成exFAT,exFAT介于FAT和NTFS兩者之間,exFAT下文件大小可以超過4G,所以比FAT32好用。雖然FAT32和NTFS的存儲數(shù)據(jù)方式不同,但某些原理還是相似的,所以,了解了FAT,也就更容易了解NTFS。下面以FAT32為例簡單談一下如何實現(xiàn)FAT下數(shù)據(jù)的讀取和恢復(fù)。
FAT12/16由DBR(保留區(qū))、FAT表、根目錄和數(shù)據(jù)區(qū)組成,F(xiàn)AT32則沒有根目錄,根目錄位于數(shù)據(jù)區(qū)和文件放在一起。目錄(Directory)和文件夾是一樣的東西,只是不同的叫法,以下統(tǒng)稱目錄。DBR扇區(qū)中記錄了分區(qū)基本信息,如每扇區(qū)字節(jié)數(shù)、每簇扇區(qū)數(shù)、保留扇區(qū)數(shù)等等。DBR開頭三個字節(jié)是匯編指令,類似于EB XX XX,意思是跳轉(zhuǎn)到引導(dǎo)代碼處。如果將首字節(jié)0xEB改成其它數(shù)字比如00,分區(qū)便無法訪問,雙擊分區(qū)會提示未格式化什么的,不過這只是當(dāng)前電腦的操作系統(tǒng)不識別,如果把U盤或TF卡放到其它系統(tǒng)中去,比如放到隨身播放器中還是能夠聽音樂的,因為播放器系統(tǒng)不一定會檢查這個字節(jié)的合法性。下面說一下簇,簇是文件系統(tǒng)的存儲單位,由若干扇區(qū)組成,一個文件若存放了一個簇的前半部分,那簇的后半部分就不能再存放其它文件,也就是說,一個簇不能同時存兩個文件。比如假設(shè)一個簇大小是8192字節(jié),有個文件大小是1字節(jié),那么它會占據(jù)某個簇的第1個字節(jié),實際上它所占的空間是8192字節(jié),剩余8191字節(jié)就被浪費了,所以理論上簇是越小越好,但也不能太小,否則尋址不方便。下面看FAT表的結(jié)構(gòu),F(xiàn)AT表中,每4個字節(jié)也就是32位為一項,每一項中記錄著簇的編號,前兩項不記錄簇號,第三項在偏移0x8處,為第一個簇,也就是2號簇,后面是3號,依次編號,每個FAT項的內(nèi)容是下一個簇的編號。如果內(nèi)容是FF FF FF 0F,則說明該簇沒有下一下關(guān)聯(lián)的簇,是獨立簇,獨立簇存放的是不超過一個簇大小的文件內(nèi)容,就這樣,每個簇都指向下一個簇,如此不停地跳來跳去,最終就能找到一個文件的所有內(nèi)容,當(dāng)跳到FF FF FF 0F,說明這是文件內(nèi)容的最后一個簇。文件內(nèi)容的位置在FAT表中記錄,那文件的名字和大小等信息保存在哪里呢?文件的大小等信息其實是另一個目錄的內(nèi)容。根目錄中首先保存著根目錄下所有文件和目錄(以下不說明,文件將包括目錄,目錄也是文件)的信息,每一項信息大小是32個字節(jié),其中有文件短名、長名、刪除標(biāo)記、屬性、創(chuàng)建時間、大小、起始簇號等信息,一項信息開頭為0,說明已經(jīng)到頭了,系統(tǒng)會認(rèn)為下面沒有子目錄和文件了,表示已經(jīng)搜索完該目錄內(nèi)的所有文件。如果將根目錄中第一個字節(jié)改為0,那該分區(qū)下就成了空白,將看不到任何文件,其實這不完全等于隱藏,因為如果系統(tǒng)再創(chuàng)建文件時會尋找目錄項開頭為0的項,然后替換它。如果一目錄項是文件(通過屬性判斷),項中保存著文件內(nèi)容所在的第一個簇,如果是目錄,則項中保存著目錄的內(nèi)容,目錄的內(nèi)容正是目錄內(nèi)文件和子目錄信息,這些信息又是一系列目錄項,甚至占多個簇(如果目錄內(nèi)文件過多),這樣一層一層就能遍歷目錄內(nèi)所有文件。
創(chuàng)建文件時,首先在FAT中為該文件分配簇,0大小文件不分配。然后在根目錄一層層找到它的父目錄,然后在父目錄中為它分配目錄項,記錄文件起始簇、文件時間等信息。如果文件名超過8.3或名字含有特殊字符或中文,就為它建立長文件名目錄項,短名按一定規(guī)則重新命名。刪除文件時,一是清除文件FAT表中的簇號,將簇標(biāo)記為沒有使用,以便讓給其它文件,二是目錄項開頭字節(jié)被改成0xE5,表示已刪除,整個過程文件內(nèi)容沒有做任何改變。若只改刪除標(biāo)記文件也會消失,但簇未釋放,文件暫時被隱藏,但不代表系統(tǒng)以后不會清理它,模擬這個過程我們可以實現(xiàn)強刪任意文件,不管它是否有保護(hù)或正在運行。一個文件被刪除,目錄項并沒有被立即清空,里面仍記錄著文件內(nèi)容的首簇,所以我們能找到文件內(nèi)容開始一少部分字節(jié),假設(shè)1個簇大小為8192字節(jié),如果文件大小小于1個簇,比如512字節(jié),那么只要簇沒有被立即占用,我們就能完全恢復(fù)該文件,如果文件為16384字節(jié),就要占兩個簇,第一個簇讀完,這時我們到FAT中查看該簇記錄的下一個簇,因為文件被刪,文件所有簇被清空,改為00 00 00 00,所以就不能再繼續(xù)讀取了,恢復(fù)就變得困難多了,至少不能按常規(guī)方法恢復(fù),除非文件是連續(xù)存儲的,這樣我們按簇順序讀取,就能把它恢復(fù)。因而,在FAT下恢復(fù)文件具有一定概率。用過數(shù)據(jù)恢復(fù)軟件的人可能會遇到這種情況,有時已經(jīng)看到一個文件的名字,恢復(fù)出來卻是亂碼,出現(xiàn)這種情況正是前面說的原因。其實,看到0還不算可怕,如果看到非0,那才悲劇,說明已經(jīng)被另一個文件替換了,這樣就連首簇內(nèi)容也無法恢復(fù)了。從可恢復(fù)性上看,NTFS和FAT32就不同,NTFS下如果文件簇沒有被覆蓋,理論上文件百分之百可以被恢復(fù),或者說,相對而言NTFS文件系統(tǒng)可恢復(fù)性更高。下面說隱藏。FAT32下能否簡單隱藏一個文件呢?要隱藏一個文件,可以通過改屬性標(biāo)志實現(xiàn),但不是改變我們通常所說的Hidden(隱藏)屬性,而是指改卷標(biāo)屬性。設(shè)置普通的隱藏屬性后,文件還會在資源管理器中看到,但設(shè)置了卷標(biāo)屬性,文件無法再通過文件管理器看到,不過一旦改了驅(qū)動器卷標(biāo)名,文件目錄項會丟失,所以最好只對目錄進(jìn)行隱藏??梢詫⒁粋€目錄增加卷標(biāo)屬性,它就看不到了,從而實現(xiàn)了底層隱藏,就連殺毒軟件也檢測不到它的存在。事實上真有這么強大嗎?事實上確實是這樣,因為就連操作系統(tǒng)或許都已經(jīng)檢測不到它了,因為你破壞了它的結(jié)構(gòu)。文件是邏輯上的東西,改了關(guān)鍵字節(jié),文件的邏輯結(jié)構(gòu)會發(fā)生改變,換句話說,操作系統(tǒng)已經(jīng)不認(rèn)為它是一個有效的文件了,它只是磁盤上的一堆數(shù)據(jù)。其實對于物理磁盤而言,并不存在什么文件,只存在數(shù)據(jù)0和1,硬盤也根本不知道什么叫文件,就像CPU不知道什么是操作系統(tǒng)一樣,它只關(guān)心寄存器指令。經(jīng)過測試,通過這種方法將目錄隱藏后改卷標(biāo)名并不影響目錄本身,取消屬性后仍然能看到該目錄及其下面的所有文件,不過卷標(biāo)屬性是只讀的,不能通過SetFileAttributes函數(shù)更改,所以只能用DDM(Direct Disk Manipulation,意為“直接磁盤操作”,即直接操作磁盤來訪問文件)技術(shù)實現(xiàn)。那能不能禁止文件被復(fù)制和訪問呢?辦法是有的,還是改屬性,將屬性第6bit設(shè)為1,它就不能被運行和復(fù)制了,任何對該文件或目錄的訪問都會提示“拒絕訪問”,有人順便會把第7bit也就是最后1位也設(shè)為1,這個其實沒有必要,7bit其實是Normal(標(biāo)準(zhǔn))屬性,值為0x80,就是不含其它屬性的屬性,F(xiàn)AT中值存儲為0,兩者一樣,只是在設(shè)置屬性時加以區(qū)分。目前為止,F(xiàn)AT下文件的遍歷、隱藏、保護(hù)和刪除都已講完,了解更多請上網(wǎng)。具體實現(xiàn)方法及代碼請參考《自己動手寫數(shù)據(jù)恢復(fù)軟件》一文。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。