數(shù)據(jù)恢復(fù)是一門比較有用的技術(shù),尤其是當(dāng)硬盤蠢壹、U盤嗓违、手機(jī)存儲(chǔ)卡等發(fā)生數(shù)據(jù)丟失時(shí),如何找回丟失的文件和數(shù)據(jù)則成為最關(guān)鍵的問(wèn)題图贸。能否找回?cái)?shù)據(jù)不僅和存儲(chǔ)介質(zhì)有關(guān)蹂季,而且和操作系統(tǒng)以及介質(zhì)所在的文件系統(tǒng)有很大的關(guān)系,基本上疏日,分區(qū)表及文件系統(tǒng)(File System乏盐,簡(jiǎn)稱FS)是決定數(shù)據(jù)能否找回的關(guān)鍵,因?yàn)樗鼪Q定了數(shù)據(jù)存儲(chǔ)的邏輯結(jié)構(gòu)制恍,一旦FS被破壞父能,即便物理上數(shù)據(jù)依然存在,可因?yàn)閿?shù)據(jù)已經(jīng)失去完整性和連續(xù)性净神,所以找回?cái)?shù)據(jù)就變得相當(dāng)困難何吝。分區(qū)表則是決定整個(gè)磁盤的布局溉委,從分區(qū)表可以得知分區(qū)數(shù)量、主/擴(kuò)展分區(qū)及邏輯分區(qū)的位置與大小等爱榕,所以分區(qū)表丟失對(duì)數(shù)據(jù)的破壞也是異常嚴(yán)重的瓣喊。本文僅談?wù)撐募到y(tǒng)的結(jié)構(gòu)。
? ? Windows上常見(jiàn)的文件系統(tǒng)有FAT16/32黔酥,NTFS藻三,exFAT等,F(xiàn)AT目前基本只有U盤上使用跪者,硬盤上一般都用NTFS棵帽,因?yàn)镕AT32下單個(gè)文件最大不能超4G而且文件信息有限,NTFS則不受這個(gè)限制渣玲,而且加入了安全描述符(Security Descriptor)逗概,也就是我們可以為文件或目錄設(shè)置不同的權(quán)限。但是FAT32在U盤下有時(shí)還是很方便忘衍,當(dāng)然也可以格式化成NTFS逾苫,不過(guò)格成NTFS會(huì)遇到一種特殊的情況,比如到了某臺(tái)不受你控制的電腦枚钓,你可能因?yàn)楫?dāng)前權(quán)限原因而無(wú)法刪除U盤上的文件铅搓,問(wèn)題就變得麻煩了。除此之外搀捷,也可格成exFAT狸吞,exFAT介于FAT和NTFS兩者之間,exFAT下文件大小可以超過(guò)4G指煎,所以比FAT32好用蹋偏。雖然FAT32和NTFS的存儲(chǔ)數(shù)據(jù)方式不同,但某些原理還是相似的至壤,所以威始,了解了FAT,也就更容易了解NTFS像街。下面以FAT32為例簡(jiǎn)單談一下如何實(shí)現(xiàn)FAT下數(shù)據(jù)的讀取和恢復(fù)黎棠。
? ? FAT12/16由DBR(保留區(qū))、FAT表镰绎、根目錄和數(shù)據(jù)區(qū)組成脓斩,F(xiàn)AT32則沒(méi)有根目錄,根目錄位于數(shù)據(jù)區(qū)和文件放在一起畴栖。目錄(Directory)和文件夾是一樣的東西随静,只是不同的叫法,以下統(tǒng)稱目錄。DBR扇區(qū)中記錄了分區(qū)基本信息燎猛,如每扇區(qū)字節(jié)數(shù)恋捆、每簇扇區(qū)數(shù)、保留扇區(qū)數(shù)等等重绷。DBR開(kāi)頭三個(gè)字節(jié)是匯編指令沸停,類似于EB XX XX,意思是跳轉(zhuǎn)到引導(dǎo)代碼處昭卓。如果將首字節(jié)0xEB改成其它數(shù)字比如00愤钾,分區(qū)便無(wú)法訪問(wèn),雙擊分區(qū)會(huì)提示未格式化什么的候醒,不過(guò)這只是當(dāng)前電腦的操作系統(tǒng)不識(shí)別能颁,如果把U盤或TF卡放到其它系統(tǒng)中去,比如放到隨身播放器中還是能夠聽(tīng)音樂(lè)的火焰,因?yàn)椴シ牌飨到y(tǒng)不一定會(huì)檢查這個(gè)字節(jié)的合法性劲装。下面說(shuō)一下簇胧沫,簇是文件系統(tǒng)的存儲(chǔ)單位昌简,由若干扇區(qū)組成,一個(gè)文件若存放了一個(gè)簇的前半部分绒怨,那簇的后半部分就不能再存放其它文件纯赎,也就是說(shuō),一個(gè)簇不能同時(shí)存兩個(gè)文件南蹂。比如假設(shè)一個(gè)簇大小是8192字節(jié)犬金,有個(gè)文件大小是1字節(jié),那么它會(huì)占據(jù)某個(gè)簇的第1個(gè)字節(jié)六剥,實(shí)際上它所占的空間是8192字節(jié)晚顷,剩余8191字節(jié)就被浪費(fèi)了,所以理論上簇是越小越好疗疟,但也不能太小该默,否則尋址不方便。下面看FAT表的結(jié)構(gòu)策彤,F(xiàn)AT表中栓袖,每4個(gè)字節(jié)也就是32位為一項(xiàng),每一項(xiàng)中記錄著簇的編號(hào)店诗,前兩項(xiàng)不記錄簇號(hào)裹刮,第三項(xiàng)在偏移0x8處,為第一個(gè)簇庞瘸,也就是2號(hào)簇捧弃,后面是3號(hào),依次編號(hào)擦囊,每個(gè)FAT項(xiàng)的內(nèi)容是下一個(gè)簇的編號(hào)塔橡。如果內(nèi)容是FF FF FF 0F梅割,則說(shuō)明該簇沒(méi)有下一下關(guān)聯(lián)的簇,是獨(dú)立簇葛家,獨(dú)立簇存放的是不超過(guò)一個(gè)簇大小的文件內(nèi)容户辞,就這樣,每個(gè)簇都指向下一個(gè)簇癞谒,如此不停地跳來(lái)跳去底燎,最終就能找到一個(gè)文件的所有內(nèi)容,當(dāng)跳到FF FF FF 0F弹砚,說(shuō)明這是文件內(nèi)容的最后一個(gè)簇双仍。文件內(nèi)容的位置在FAT表中記錄,那文件的名字和大小等信息保存在哪里呢桌吃?文件的大小等信息其實(shí)是另一個(gè)目錄的內(nèi)容朱沃。根目錄中首先保存著根目錄下所有文件和目錄(以下不說(shuō)明,文件將包括目錄茅诱,目錄也是文件)的信息逗物,每一項(xiàng)信息大小是32個(gè)字節(jié),其中有文件短名瑟俭、長(zhǎng)名翎卓、刪除標(biāo)記、屬性摆寄、創(chuàng)建時(shí)間失暴、大小、起始簇號(hào)等信息微饥,一項(xiàng)信息開(kāi)頭為0逗扒,說(shuō)明已經(jīng)到頭了,系統(tǒng)會(huì)認(rèn)為下面沒(méi)有子目錄和文件了欠橘,表示已經(jīng)搜索完該目錄內(nèi)的所有文件矩肩。如果將根目錄中第一個(gè)字節(jié)改為0,那該分區(qū)下就成了空白简软,將看不到任何文件蛮拔,其實(shí)這不完全等于隱藏,因?yàn)槿绻到y(tǒng)再創(chuàng)建文件時(shí)會(huì)尋找目錄項(xiàng)開(kāi)頭為0的項(xiàng)痹升,然后替換它建炫。如果一目錄項(xiàng)是文件(通過(guò)屬性判斷),項(xiàng)中保存著文件內(nèi)容所在的第一個(gè)簇疼蛾,如果是目錄肛跌,則項(xiàng)中保存著目錄的內(nèi)容,目錄的內(nèi)容正是目錄內(nèi)文件和子目錄信息,這些信息又是一系列目錄項(xiàng)衍慎,甚至占多個(gè)簇(如果目錄內(nèi)文件過(guò)多)转唉,這樣一層一層就能遍歷目錄內(nèi)所有文件。
? ? 創(chuàng)建文件時(shí)稳捆,首先在FAT中為該文件分配簇赠法,0大小文件不分配。然后在根目錄一層層找到它的父目錄乔夯,然后在父目錄中為它分配目錄項(xiàng)砖织,記錄文件起始簇、文件時(shí)間等信息末荐。如果文件名超過(guò)8.3或名字含有特殊字符或中文侧纯,就為它建立長(zhǎng)文件名目錄項(xiàng),短名按一定規(guī)則重新命名甲脏。刪除文件時(shí)眶熬,一是清除文件FAT表中的簇號(hào),將簇標(biāo)記為沒(méi)有使用块请,以便讓給其它文件娜氏,二是目錄項(xiàng)開(kāi)頭字節(jié)被改成0xE5,表示已刪除负乡,整個(gè)過(guò)程文件內(nèi)容沒(méi)有做任何改變牍白。若只改刪除標(biāo)記文件也會(huì)消失脊凰,但簇未釋放抖棘,文件暫時(shí)被隱藏,但不代表系統(tǒng)以后不會(huì)清理它狸涌,模擬這個(gè)過(guò)程我們可以實(shí)現(xiàn)強(qiáng)刪任意文件切省,不管它是否有保護(hù)或正在運(yùn)行。一個(gè)文件被刪除帕胆,目錄項(xiàng)并沒(méi)有被立即清空朝捆,里面仍記錄著文件內(nèi)容的首簇,所以我們能找到文件內(nèi)容開(kāi)始一少部分字節(jié)懒豹,假設(shè)1個(gè)簇大小為8192字節(jié)芙盘,如果文件大小小于1個(gè)簇,比如512字節(jié)脸秽,那么只要簇沒(méi)有被立即占用儒老,我們就能完全恢復(fù)該文件,如果文件為16384字節(jié)记餐,就要占兩個(gè)簇驮樊,第一個(gè)簇讀完,這時(shí)我們到FAT中查看該簇記錄的下一個(gè)簇,因?yàn)槲募粍h囚衔,文件所有簇被清空挖腰,改為00 00 00 00,所以就不能再繼續(xù)讀取了练湿,恢復(fù)就變得困難多了猴仑,至少不能按常規(guī)方法恢復(fù),除非文件是連續(xù)存儲(chǔ)的肥哎,這樣我們按簇順序讀取宁脊,就能把它恢復(fù)。因而贤姆,在FAT下恢復(fù)文件具有一定概率榆苞。用過(guò)數(shù)據(jù)恢復(fù)軟件的人可能會(huì)遇到這種情況,有時(shí)已經(jīng)看到一個(gè)文件的名字霞捡,恢復(fù)出來(lái)卻是亂碼坐漏,出現(xiàn)這種情況正是前面說(shuō)的原因。其實(shí)碧信,看到0還不算可怕赊琳,如果看到非0,那才悲劇砰碴,說(shuō)明已經(jīng)被另一個(gè)文件替換了躏筏,這樣就連首簇內(nèi)容也無(wú)法恢復(fù)了。從可恢復(fù)性上看呈枉,NTFS和FAT32就不同趁尼,NTFS下如果文件簇沒(méi)有被覆蓋,理論上文件百分之百可以被恢復(fù)猖辫,或者說(shuō)酥泞,相對(duì)而言NTFS文件系統(tǒng)可恢復(fù)性更高。下面說(shuō)隱藏啃憎。FAT32下能否簡(jiǎn)單隱藏一個(gè)文件呢芝囤?要隱藏一個(gè)文件,可以通過(guò)改屬性標(biāo)志實(shí)現(xiàn)辛萍,但不是改變我們通常所說(shuō)的Hidden(隱藏)屬性悯姊,而是指改卷標(biāo)屬性。設(shè)置普通的隱藏屬性后贩毕,文件還會(huì)在資源管理器中看到悯许,但設(shè)置了卷標(biāo)屬性,文件無(wú)法再通過(guò)文件管理器看到耳幢,不過(guò)一旦改了驅(qū)動(dòng)器卷標(biāo)名岸晦,文件目錄項(xiàng)會(huì)丟失欧啤,所以最好只對(duì)目錄進(jìn)行隱藏∑羯希可以將一個(gè)目錄增加卷標(biāo)屬性邢隧,它就看不到了冈在,從而實(shí)現(xiàn)了底層隱藏,就連殺毒軟件也檢測(cè)不到它的存在包券。事實(shí)上真有這么強(qiáng)大嗎?事實(shí)上確實(shí)是這樣付秕,因?yàn)榫瓦B操作系統(tǒng)或許都已經(jīng)檢測(cè)不到它了,因?yàn)槟闫茐牧怂慕Y(jié)構(gòu)询吴。文件是邏輯上的東西亮元,改了關(guān)鍵字節(jié),文件的邏輯結(jié)構(gòu)會(huì)發(fā)生改變爆捞,換句話說(shuō),操作系統(tǒng)已經(jīng)不認(rèn)為它是一個(gè)有效的文件了盗温,它只是磁盤上的一堆數(shù)據(jù)苛秕。其實(shí)對(duì)于物理磁盤而言肌访,并不存在什么文件艇劫,只存在數(shù)據(jù)0和1惩激,硬盤也根本不知道什么叫文件,就像CPU不知道什么是操作系統(tǒng)一樣风钻,它只關(guān)心寄存器指令。經(jīng)過(guò)測(cè)試鸣个,通過(guò)這種方法將目錄隱藏后改卷標(biāo)名并不影響目錄本身羞反,取消屬性后仍然能看到該目錄及其下面的所有文件囤萤,不過(guò)卷標(biāo)屬性是只讀的,不能通過(guò)SetFileAttributes函數(shù)更改澄惊,所以只能用DDM(Direct Disk Manipulation富雅,意為“直接磁盤操作”掸驱,即直接操作磁盤來(lái)訪問(wèn)文件)技術(shù)實(shí)現(xiàn)没佑。那能不能禁止文件被復(fù)制和訪問(wèn)呢?辦法是有的,還是改屬性远剩,將屬性第6bit設(shè)為1,它就不能被運(yùn)行和復(fù)制了锥余,任何對(duì)該文件或目錄的訪問(wèn)都會(huì)提示“拒絕訪問(wèn)”,有人順便會(huì)把第7bit也就是最后1位也設(shè)為1驱犹,這個(gè)其實(shí)沒(méi)有必要足画,7bit其實(shí)是Normal(標(biāo)準(zhǔn))屬性,值為0x80淹辞,就是不含其它屬性的屬性,F(xiàn)AT中值存儲(chǔ)為0象缀,兩者一樣,只是在設(shè)置屬性時(shí)加以區(qū)分霞怀。目前為止莉给,F(xiàn)AT下文件的遍歷廉沮、隱藏、保護(hù)和刪除都已講完废封,了解更多請(qǐng)上網(wǎng)丧蘸。具體實(shí)現(xiàn)方法及代碼請(qǐng)參考《自己動(dòng)手寫數(shù)據(jù)恢復(fù)軟件》一文。
---------------------
作者:遠(yuǎn)方235
來(lái)源:CSDN
原文:https://blog.csdn.net/zzmzzff/article/details/80298379
版權(quán)聲明:本文為博主原創(chuàng)文章力喷,轉(zhuǎn)載請(qǐng)附上博文鏈接!