對(duì) MFT偏移 的修正 ---親歷一次數(shù)據(jù)修復(fù)
前陣子,我在一次正常開(kāi)機(jī)后,打開(kāi)QQ空間,突然系統(tǒng)死機(jī)。點(diǎn)擊鼠標(biāo)無(wú)反應(yīng),按鍵ctrl+alt+del想殺進(jìn)程確無(wú)反應(yīng),于是只好按主機(jī)reset鍵強(qiáng)制重啟,結(jié)果RP爆發(fā),百年一遇…
重啟后,無(wú)法進(jìn)XP系統(tǒng),用PE光盤進(jìn),發(fā)現(xiàn)C盤和E盤都提示“文件或目錄損壞且無(wú)法讀取”,于是用ptdd重建mbr,仍進(jìn)不了系統(tǒng)。重啟又進(jìn)入PE,發(fā)現(xiàn)此250G的5個(gè)分區(qū)的硬盤中,E盤反而可以正常讀取了,其他分區(qū)出現(xiàn)上面那個(gè)提示。用PTDD重建分區(qū)表,沒(méi)解決。 后來(lái)在網(wǎng)上搜過(guò)“文件或目錄損壞且無(wú)法讀取”的解決方法,最多提到的是chkdsk /f, 但是在PE里,提示無(wú)法識(shí)別ntfs。于是只好把硬盤掛載到室友的電腦里,用chkdsk /f修復(fù),修復(fù)后我在Xp雙擊這些分區(qū),原來(lái)的C盤,F(xiàn)盤G盤依舊無(wú)法進(jìn)入,還是那個(gè)錯(cuò)誤提示。而D盤可以了。后來(lái)掛載到我電腦另一個(gè)硬盤的linux里,竟然能進(jìn)F和G盤,里面有FOUND.000這類文件夾,在里面找到了不少修復(fù)回來(lái)的文件,隨機(jī)在不同目錄點(diǎn)了幾個(gè)都能用。
于是接下來(lái)要解決的問(wèn)題有:
1.同樣全部是ntfs系統(tǒng),為什么XP無(wú)法讀取F和G分區(qū),而linux可以?(雖然不可以在windows里讀取,但至少在linux下可以把數(shù)據(jù)導(dǎo)出備份,成功了一點(diǎn)點(diǎn))
2.如果從數(shù)據(jù)修復(fù)的角度看,現(xiàn)在只剩下C分區(qū)了。頭疼… PTDD,DISKGEN,還有用過(guò)一些磁盤錯(cuò)誤掃描,都檢查不出什么錯(cuò)誤。(這里明顯我是病急亂投醫(yī)…)
本著不修復(fù)好不罷休的精神吧,雖然C分區(qū)的數(shù)據(jù)真的沒(méi)有了也不至于損失多慘重,可恰好我可以在另一個(gè)硬盤linux里的虛擬機(jī)里的XP上網(wǎng),所以也不需要急用電腦而不得不重裝系統(tǒng)。(雙系統(tǒng)的好處之一 o(∩_∩)o )之后是上網(wǎng)找
專業(yè)論壇,搜索期刊。順便做下廣告,我覺(jué)得中國(guó)硬盤基地技術(shù)論壇不錯(cuò)。我也是第一次從這里知道可以用winhex修復(fù)數(shù)據(jù)。并且也通過(guò)搜索得知我的故障可能是MFT有錯(cuò)。在里面看過(guò)一句話,“你要是不會(huì)手動(dòng)16進(jìn)制寫mft,不知道他的規(guī)則,計(jì)算方式。就別費(fèi)勁了,你從現(xiàn)在學(xué),學(xué)3個(gè)月有可能能學(xué)會(huì)”。天啊,估計(jì)我沒(méi)這耐性,更主要是我還有不少事情做…不過(guò)我試著去了解吧,趁機(jī)能懂點(diǎn)東西也不錯(cuò)。于是,從一開(kāi)始不懂mft,然后慢慢的去了解ntfs的文件系統(tǒng)…其實(shí)一共也不需花多少時(shí)間,中間快20天都忙著考試和找工。這里還有個(gè)小插曲,因?yàn)榭催^(guò)這方面的書,那時(shí)候印象較深,還去筆試面試了一個(gè)數(shù)據(jù)修復(fù)公司,吹吹自己會(huì)用winhex和其他修復(fù)軟件,通過(guò)了。說(shuō)1月中旬給個(gè)回復(fù)去不去,去的話開(kāi)始實(shí)習(xí)了,不過(guò)待遇感覺(jué)太低所以不想了的。畢竟生活壓力吧,還有綜合考慮興趣與待遇,還有發(fā)展。
說(shuō)點(diǎn)硬盤ntfs文件系統(tǒng)的,或許很多人也聽(tīng)過(guò)了。之前我沒(méi)怎么了解,后來(lái)借此機(jī)會(huì)也趁機(jī)學(xué)學(xué)了。硬盤由引導(dǎo)扇區(qū)(Boot Sector)與各分區(qū)組成。不超過(guò)四個(gè)主分區(qū),原因是主引導(dǎo)記錄(MBR)里的分區(qū)表里只有64字節(jié),一共只可描述4個(gè)分區(qū)表項(xiàng),從winhex里看,描述一個(gè)分區(qū)表項(xiàng)用16字節(jié)。有人可以分七八個(gè)分區(qū)是因?yàn)橛玫綌U(kuò)展分區(qū),現(xiàn)在我們的普遍分法是一個(gè)主分區(qū)+一個(gè)擴(kuò)展分區(qū),然后擴(kuò)展分區(qū)又是由相應(yīng)的EBR(即擴(kuò)展MBR)里的分區(qū)表來(lái)描述。
一個(gè)以C盤為主分區(qū),DEF為擴(kuò)展分區(qū)的硬盤數(shù)據(jù)結(jié)構(gòu)如下所示:
關(guān)于主引導(dǎo)記錄MBR。一般都占用63個(gè)扇區(qū),即從第0-62扇區(qū)(這里有個(gè)例外,虛擬機(jī)里我看過(guò)只有56個(gè)扇區(qū)),而實(shí)際有寫入內(nèi)容的一般只有一個(gè)扇區(qū),及常說(shuō)的0柱面0磁道1扇區(qū)。1個(gè)扇區(qū)512字節(jié),MBR其實(shí)分三部分,1.引導(dǎo)代碼446節(jié) 2.分區(qū)表64字節(jié) 3.結(jié)束標(biāo)記55AA,及2個(gè)字節(jié)。
如果,兩藍(lán)色豎線把第一個(gè)扇區(qū)劃分為三部分,及上述的MBR三部分。兩藍(lán)豎線間為分區(qū)表。每16字節(jié)為一個(gè)分區(qū)表項(xiàng),兩個(gè)緊挨著的數(shù)字為一個(gè)字節(jié)。
第一個(gè)分區(qū)中:第一個(gè)紅色框內(nèi)80代表活動(dòng)分區(qū)。綠色框01 01 00代表磁頭號(hào)、扇區(qū)號(hào)、柱面號(hào)。第一個(gè)藍(lán)色框07代表NTFS分區(qū)。緊接著三條綠橫線,分別是本分區(qū)結(jié)束磁頭號(hào)、扇區(qū)號(hào)、柱面號(hào),然后是本分區(qū)之前已用的扇區(qū)數(shù)(3F000000,必須倒過(guò)來(lái),即0000003F,轉(zhuǎn)為10進(jìn)制63,即MBR要占用63扇區(qū),注意MBR是不屬于磁盤第一個(gè)分區(qū)!),最后是本分區(qū)的總扇區(qū)數(shù)(E5588101,倒過(guò)來(lái),018158E5,即是25254117個(gè)扇區(qū),25254117*512/1024/1024/1024=12.04G)
第二個(gè)分區(qū):第二個(gè)紅色框00表示非活動(dòng)區(qū)。綠色框00 C1 FF代表磁頭號(hào)、扇區(qū)號(hào)、柱面號(hào)。第二個(gè)藍(lán)色框0F代表擴(kuò)展分區(qū)。三條綠線所表達(dá)的也與上面相同。(注意這里的第二個(gè)分區(qū)代表擴(kuò)展分區(qū),切勿與通常的D盤相混淆?。。。?br>因無(wú)其他主分區(qū),所以第三、第四個(gè)分區(qū)表項(xiàng)為0。
最后以55AA結(jié)尾,代表MBR結(jié)束。
到這里,給道題目,如何知道D盤的EBR在哪里?
很簡(jiǎn)單,從第一個(gè)分區(qū)表項(xiàng)得知,第一個(gè)分區(qū)有25254117個(gè)扇區(qū),而在第一個(gè)分區(qū)前的MBR有63個(gè)扇區(qū),因?yàn)檎麄€(gè)硬盤扇區(qū)數(shù)從0記起,所以MBR扇區(qū)數(shù)+第一個(gè)分區(qū)扇區(qū)數(shù)=63+25254117=25254180,即通過(guò)轉(zhuǎn)到25254180扇區(qū)即可。這里就是D盤前面的EBR了。
對(duì)紅線進(jìn)行分析(紅線前面446個(gè)字節(jié),因?yàn)槭菙U(kuò)展分區(qū),不需要啟動(dòng)代碼,用0填充):
00:非活動(dòng)分區(qū)
01 C1 FF 起始磁頭號(hào)、扇區(qū)號(hào)、柱面號(hào)
07:NTFS分區(qū)
FE FF FF:本分區(qū)結(jié)束磁頭號(hào)、扇區(qū)號(hào)、柱面號(hào)。其實(shí)可以發(fā)現(xiàn),實(shí)際不需要理會(huì)這一項(xiàng),所有分區(qū)表項(xiàng)都用這三個(gè)字節(jié)來(lái)表示本分區(qū)結(jié)束磁頭、扇區(qū)和柱面的。
3F 00 00 00:如前面分析MBR,倒過(guò)來(lái)是00 00 00 3F ,即63個(gè)扇區(qū)。
8D 0D 23 03:倒過(guò)來(lái)是03 23 0D 8D,轉(zhuǎn)為10進(jìn)制是52628877,即本分區(qū)有52628877扇區(qū),25.09G。
為計(jì)算第二個(gè)EBR在哪里只需將前面的“MBR扇區(qū)數(shù)+第一個(gè)分區(qū)扇區(qū)數(shù)”+“EBR扇區(qū)數(shù)+第二個(gè)分區(qū)扇區(qū)數(shù)”
………
略去對(duì)后面幾個(gè)分區(qū)的計(jì)算。
剛剛是對(duì)MBR,EBR(EBR實(shí)際與MBR類似,只是少了啟動(dòng)代碼)的分析,現(xiàn)在對(duì)具體分區(qū)分析(以修復(fù)好的C盤為例)。
通過(guò)翻閱資料得知,NTFS文件系統(tǒng)的結(jié)構(gòu)是
如何進(jìn)入具體分區(qū)呢?選擇winhex里的“工具—打開(kāi)磁盤”,選中相應(yīng)物理磁盤即可打開(kāi)。我的硬盤(修復(fù)好后)顯示如下:
雙擊想要看的分區(qū)即可,如partition 1,進(jìn)入…
會(huì)看到很多此分區(qū)的文件,甚至包括一些即使你在文件夾選項(xiàng)里勾選“顯示隱藏文件”都無(wú)法看到的文件。比如以$開(kāi)頭的文件。每個(gè)NTFS分區(qū)中都有這種文件,如下:
注意:MFT里的11到15號(hào)記錄是為以后的元數(shù)據(jù)文件保留的。
以上是的截圖來(lái)自網(wǎng)上,補(bǔ)充下$Boot 、$MFT 、$MFTMirr的一些資料,因?yàn)榇舜涡迯?fù)與這幾個(gè)有關(guān)。
$Boot:NTFS的卷啟動(dòng)扇區(qū),也叫分區(qū)啟動(dòng)扇區(qū),卷啟動(dòng)記錄等。雖叫扇區(qū),其實(shí)包含了16個(gè)磁盤扇區(qū)(8KB),即你看到的$Boot文件大小是8KB。在winhex里雙擊相應(yīng)的分區(qū)后,進(jìn)去看到的該分區(qū)的第一個(gè)扇區(qū)就是$Boot所占的第一個(gè)分區(qū)。包含了BIOS參數(shù)塊(BIOS Parameter Bloce,即BPB)和卷啟動(dòng)代碼。BPB里包含此分區(qū)基本信息,如分區(qū)格式,大小等。至于卷啟動(dòng)代碼,是表示如何裝載WIN NT,2000等系統(tǒng)的NTLDR,把控制權(quán)交給它,得以繼續(xù)裝載系統(tǒng)其他部分。
對(duì)于$Boot里的BPB用以下的截圖說(shuō)明下,彩色部分就是BPB,
對(duì)于$MFT文件,就是從BPB里定位的?。?!這句話很重要。
而我自己C盤的情況是
對(duì)比這里的說(shuō)明:
圖中第一條藍(lán)色粗線是表示$MFT第一簇簇號(hào),00 00 0C 00 00 00 00 00 ,倒過(guò)來(lái)是00000000000C0000,即16進(jìn)制C0000轉(zhuǎn)為10進(jìn)制是786432,表示MFT在第786432簇(注意這里表示的是相對(duì)于本分區(qū)的簇?cái)?shù),而不是整個(gè)硬盤)。接下來(lái),轉(zhuǎn)去786432簇,看看是不是
通過(guò)Go To Sector到786432,與單擊$MFT去到的扇區(qū)都是一樣的。說(shuō)明定位沒(méi)錯(cuò)。
接下來(lái)看下$MFT吧…
$MFT:(Master File Table)文件。主文件列表。此文件是NTFS分區(qū)中最重要的文件,記錄了分區(qū)中所有文件(包括$MFT自身)的基本信息。通過(guò)$MFT就可以訪問(wèn)分區(qū)中的所有文件和系統(tǒng)數(shù)據(jù)。$MFT由多個(gè)MFT記錄單元組成,每一個(gè)文件的描述占用一到多個(gè)(一個(gè)不夠的情況下)$MFT記錄單元。其中前十二個(gè)記錄單元中記錄著這里的十二個(gè)系統(tǒng)文件的信息。每個(gè)記錄單元記錄著文件的建立時(shí)間、在分區(qū)中的位置、長(zhǎng)度、屬性、文件名等信息。
MFT中的第一個(gè)記錄就是$MFT自身,編號(hào)為0。每個(gè)文件記錄占用1KB,即兩個(gè)扇區(qū)。
識(shí)別一項(xiàng)MFT的起始很簡(jiǎn)單,看開(kāi)頭的4個(gè)字節(jié)是否46 49 4C 45 ,其相應(yīng)的ASCII碼是FILE?,F(xiàn)在就看MFT怎樣記錄其本身$MFT吧。
同理,MFT的鏡像$MFTMirr用同樣的方法也可以計(jì)算得出和定位,$MFTMirr是對(duì)MFT里的重要文件備份,只有4K,即備份了4個(gè)文件記錄單元而已。
其實(shí)說(shuō)了上面這些,還沒(méi)涉及到故障的解決,有人會(huì)說(shuō),明明可以在winhex里選中$MFT就定位了,為何這般復(fù)雜,實(shí)際上,我此次故障,就是遇到MFT偏移了!
說(shuō)了前面這么多,只是為NTFS文件系統(tǒng)結(jié)構(gòu)做個(gè)很大概的描述,實(shí)際上真的很復(fù)雜。
在故障處理前,我雙擊C盤出現(xiàn)了這種情況:
看來(lái)問(wèn)題跟這個(gè)MFT是有些關(guān)系了的…進(jìn)去后,傻眼了,沒(méi)有其他的文件,只有以下這幾個(gè),郁悶。
方法一:用前面的方法,從分區(qū)引導(dǎo)扇區(qū)計(jì)算出MFT位置。所以,證明前面說(shuō)的不算是廢話。
方法二:留意提示,看到了offset C0000000 和 offset 18158E000 字樣,那就過(guò)去看看吧。 發(fā)現(xiàn)C0000000里,不是一項(xiàng)文件記錄的起始,文件記錄的其實(shí),一定是“46 49 4C 45”開(kāi)頭的,仔細(xì)找下,很明顯偏移兩行了?。。∵@就是故障所在。MFT里的第一項(xiàng)文件記錄正是MFT本身,而現(xiàn)在本身位置都記錄錯(cuò)了,如何定位其余文件呢?所以,此分區(qū)下的所有文件不可見(jiàn)!接下來(lái)嘗試修復(fù)了。至于另外一個(gè)18158E000,其實(shí)可以猜測(cè)到是$MFTMirr的…
其實(shí)我曾經(jīng)想過(guò)找相關(guān)MFT的修復(fù)軟件試下,但始終覺(jué)得會(huì)否因軟件“誤判”,反而搞亂了。
畢竟對(duì)于數(shù)據(jù)修復(fù),一般是“只需一次成功,不許多次失敗的”。還是手動(dòng)吧…
其實(shí)到這里我已經(jīng)找到了故障所在,和處理方法了,只是即使想手動(dòng)也有點(diǎn)下不了手…期間在學(xué)校某個(gè)地方做過(guò)一次實(shí)驗(yàn),也是一件壞事…呃,把它的某個(gè)分區(qū),用winhex寫0了…寫0了是什么概念應(yīng)該猜到吧。不過(guò)也自私慶幸幸好不是在自己的硬盤這樣操作!這款軟件是有一定危險(xiǎn)性的。
拿修復(fù)$MFTMirr舉例吧…$MFT的我忘了截圖。找到18158E000的那個(gè)扇區(qū)里(可以看到偏移了三行)…選中46 49 4C 45開(kāi)頭的一段數(shù)據(jù),多大好呢,我是一直選到非0的末尾,后面全0的就不選了。原因:記錄一個(gè)文件其實(shí)有時(shí)候不需要用到1KB的。
粘貼到正確位置…
就這樣,手工的找,手工的修復(fù),看到就修復(fù),反正間隔1KB就一個(gè)記錄…所幸不是很多,10來(lái)個(gè)而已。
保存退出,重啟…以為應(yīng)該好了,默默的等待一種喜悅。結(jié)果啟動(dòng)不了。沒(méi)辦法,只好到另一個(gè)硬盤的linux里進(jìn)去看,久違的那個(gè)分區(qū)是出現(xiàn)了,可是掛載不了,如圖提示:
有點(diǎn)郁悶,現(xiàn)在只好把硬盤掛到室友的XP下去chkdsk下了,懶了,不想再研究了。
結(jié)果,在室友那里chkdsk修復(fù)后,把硬盤掛回自己電腦,啟動(dòng),見(jiàn)到了久違的XP和久違的桌面!??!我成功了!??!也許對(duì)于牛人來(lái)說(shuō),這不算什么,但是畢竟對(duì)于我,因?yàn)槭峭ㄟ^(guò)自己努力去嘗試的,所以,有點(diǎn)成就感吧。
寫到這里基本完了...不過(guò)仍然有我不明白的地方,文中可能有些表述不當(dāng),還請(qǐng)指正下的,比較僅僅一個(gè)文件系統(tǒng),還只是NTFS,都?jí)蜓芯亢荛L(zhǎng)時(shí)間了。我現(xiàn)在存在的疑問(wèn)是:
1.為什么有兩個(gè)分區(qū)F和G,是NTFS的,在linux下可以是識(shí)別并正常讀取里面的文件,但是在windows XP里不行。這是我至今還未解決的疑問(wèn)。
2.在我用winhex修復(fù)并重啟后,雖然在XP和linux下讀取不了,但是在winhex里是可以看到完整的文件的,并且沒(méi)有found.000這個(gè)文件夾,如果我此時(shí)導(dǎo)出文件,相信文件位置不會(huì)出現(xiàn)錯(cuò)亂。但是用chkdsk掃描修復(fù)后,為什么多出這么多零碎的文件放進(jìn)found.000里了...
此次事件的總結(jié):
1.一開(kāi)始嘗試修復(fù)時(shí),重建MBR,重建分區(qū)表,都是很傻的做法。當(dāng)時(shí)病急亂投醫(yī)...當(dāng)硬盤出現(xiàn)誤操作而又想盡力恢復(fù)數(shù)據(jù)時(shí),切忌再往里頭寫數(shù)據(jù),最好是先把硬盤拆下來(lái),再到網(wǎng)上,或相關(guān)書本查詢。
2.硬盤數(shù)據(jù)修復(fù),一般是只許一次成功,不許多次失敗。所以,在方案的取舍,切忌一個(gè)個(gè)的試,最好有其他硬件模擬試驗(yàn)。我以前曾經(jīng)誤操作而用一個(gè)XP鏡像覆蓋全盤,后來(lái)用移動(dòng)硬盤試過(guò)可以用PTDD重建分區(qū)表,做過(guò)實(shí)驗(yàn)了,也就有大的把握確定成功率。
3.任何事情,只要投入時(shí)間,愿意琢磨下,即使不成功,也多少有點(diǎn)回報(bào)的。像我在某個(gè)網(wǎng)站看到的那句話,說(shuō)“你要是不會(huì)手動(dòng)16進(jìn)制寫mft,不知道他的規(guī)則,計(jì)算方式。就別費(fèi)勁了,你從現(xiàn)在學(xué),學(xué)3個(gè)月有可能能學(xué)會(huì)” 看到后確實(shí)有點(diǎn)打擊,不過(guò)其實(shí)現(xiàn)在我還沒(méi)懂多少,至少能取回?cái)?shù)據(jù)了。