從事數據恢復的人士,必須非常熟悉各種文件系統類型,例如:FAT,NTFS,HFS+,EXT2/3,ReFS,UFS等。你的電腦數據每天都在受著諸如病毒、惡意代碼、黑客、誤操作等的威脅!那么如何才能恢復你的數據呢?希望本文能對你有所幫助!
要深入學習數據恢復,并非是一件容易的事,要想成為一個數據恢復專家,沒有深厚的理論知識是不可能的,你必須了十分了解磁盤的邏輯結構,就讓我們來看看需要學習的理論知識吧。 當我們對文件進行訪問時,你有沒有想過,操作系統是如何對文件進行操作的呢?這些文件又是如何存放在磁盤當中的呢?先來看看硬盤的總體結構,在介紹硬盤總體結構之前有必要介紹一下硬盤的參數,硬盤是以磁頭(Heads),柱面(Cylinders),扇區(Sectors)進行訪問的。其中: 磁頭數(Heads)表示硬盤總共有幾個磁頭,也就是有幾面盤片, 最大為 255 (用 8 個二進制位存儲); 柱面數(Cylinders) 表示硬盤每一面盤片上有幾條磁道,最大為 1023 (用 10 個二進制位存儲); 扇區數(Sectors) 表示每一條磁道上有幾個扇區, 最大為 63(用 6 個二進制位存儲). 每個扇區一般是 512個字節,學習過匯編語言的朋友可能想到了,BIOS中斷13H的入口參數中,CH是磁道號其值為0H~FEH(最多255個磁道),CL中低6位為扇區號,其值為1H~3FH(最多63個扇區),DH為磁頭號的低位,CL中的高2位為磁頭號的高位,也就是說,磁頭號最多由10位二進制數表示,(1111111111)2=(1023)10,也就是說最多可以表示的磁頭數為1024個。請大家記住這些在我們以后的學習中還會用到的,由此可以看出基于這種訪問方式我們最大能訪問的磁盤容量為: 255 * 1023 * 63 * 512字節=8414461440/1048576=8024.66M 只有大約8G的空間,這是因為早期磁盤還很小,想想當年你擁有一塊200M硬盤時的喜悅心情吧!就好象當年的科學家們以為1K內存已經很大了一樣,讓電腦用戶很長一段時間都為配置DOS下的內存而煩惱。而今,你肯定擁有一塊大于8G的硬盤了,你能夠用她,應該多虧了一種較新的硬盤訪問技術——擴展 Int13H 技術。采用線性尋址方式存取硬盤, 所以突破了 8 G的限制, 而且還加入了對可拆卸介質(如活動硬盤)的支持,因為是談數據恢復不是談編程,關于擴展INT13H技術我在此就不詳述了。
硬盤數據(基于FAT結構)總體結構如下:
1、主引導扇區(Master boot sector) (占用一個扇區)
2、第一個分區的引導扇區(Boot sector)(占用一個扇區)
3、第一個分區的FAT1 (占用空間由磁盤大小和FAT類型來定)
4、第一個分區的FAT2 (占用空間由磁盤大小和FAT類型來定)
5、第一個分區的根目錄區
6、第一個分區數據區 (用來存放各種文件的數據)
7、擴展分區表 (占用一個扇區 )
8、第二個分區的引導扇區(Boot sector)(占用一個扇區)
9、第二個分區的FAT1 (占用空間由磁盤大小和FAT類型來定)
10、第二個分區的FAT2 (占用空間由磁盤大小和FAT類型來定)
11、第二個分區的根目錄區
12、第二個分區數據區 (用來存放各種文件的數據)
13、擴展分區表 . . .
注意:當你的硬盤沒有擴展分區的時候,你就沒有擴展分區表了;當你只有一個硬盤分區的時候你的硬盤結構到6就完了。
(一)主引導扇區(Master boot sector)的結構: 它是硬盤的第一個扇區, 由主引導程序(MasterBoot Record簡稱MBR),硬盤分區表(Disk Partition Table簡稱DPT )和結束標識三部分組成。其結構如下:
1、偏移0H~1BDH 主引導程序(占446個字節,但實際可能并沒有到這么多的字節)
2、偏移1BEH~1FDH 硬盤分區表(占64個字節,每個分區項占16個字節,最多可容納4個分區項)
3、偏移1FEH~1FFH 結束標識 (占2個字節,結束標志,總為55H AAH)
主引導程序我在此就不分析了,需要注意的是在主引導程序中有一些出錯信息,一些引導型病毒往往會覆蓋這些信息來將自己嵌入到主引導程序中去,并將主引導程序開始的幾個字節改為一條跳轉指令,通過觀察主引導程序的變化,往往可以讓我們看出自己的電腦是否有引導型病毒,一旦發現異常,我們可以用FDISK/MBR命令來覆蓋原有的MBR。結束標識的兩個字節總是55H AAH,該標識只是用于判斷這個扇區是否是有效的主引導扇區,如果主引導程序發現沒有這個結束標識,將會認為操作系統丟失,并顯示“Missing Operating System”。
硬盤分區表: 從偏移1BEH~1FDH的64個字節存放的是硬盤分區表,其中最多包含4個分區項,每個分區項由16個字節構成,其結構如下:
1、1BEH~1CDH 分區項1
2、1CEH~1DDH 分區項2
3、1DBH~1EDH 分區項3
4、1EFH~1FDH 分區項4
注意:沒有用到的分區項上的記錄總是16個十六進制碼00H
我們再來看看每個分區項的詳細含義,假設我們的一個分區占用的16個字節被標為00H~0FH,
其結構如下:
00H 引導標識字節,其值只能為00H或80H,為00H時表示該分區不可引導,為80H時表示該分區可用于引導 。
在許多諸如BOOT MAGIC之類的軟件都是利用了這一原理,實現多操作系統引導的,了解了這一原理,你也可以寫出你自己的多操作系統引導程序了。
01H 分區起始磁頭號
02H 其高2位為分區起始柱面號的高位,底6位為分區起始扇區號
03H 分區起始柱面號的低位
04H 分區系統標志,當該值為00H時,表示此分區為不可識別的系統;為04H時該分區為FAT16分區;為05H或0FH該分區為 擴展分區;為0B時該分區為FAT32分區 ;為83H時表示該分區為Linux分區, 為07時該分區為NTFS分區等等。一些如PQMAGIC磁盤軟件在隱藏分區操作時就是將此字節的內容保存后在把它改為00H。
05H 分區結束磁頭號
06H 其高2位為分區結束柱面號的高位,底6位為分區結束扇區號
07H 分區結束柱面號的低位
08H~0BH 此4個字節為在線性尋址方式下的分區的扇區地址。當分區大于8G時,擴展INT13H是通過該信息進行尋址的,我們可以發現在這種方式下尋址最多可訪問的空間為:FFFFFFFFH扇*512B/扇=2048G,也就是說我們用擴展INT13H最大可以訪問的空間為2048G,這個數字現在對我們來說是非常大的,但誰都不能想象計算機的發展之快,到時到底要如何來突破這個限制呢?現在誰也不知道。注意:此4個字節是從高位到低位排列的!例如我的分區表第一個分區項此4字節的內容為“3FH 00H 00H 00H”,它代表該分區是從0000003FH開始的,也就是從線性地址63扇開始的(線性地址把硬盤的第一個扇記為0H扇) 0CH~0FH 此4個字節為以扇區為單位的該分區大小(總扇區數),此4個字節同樣是從高位到低 位排列的 !
(二)引導扇區(Boot sector)的結構: 當主引導程序找到了帶有引導標識為80H的分區后,就會將該分區的引導扇區讀入到內存地址為0000:7C00 處,并把控制權交給引導扇區中的引導程序,讓我們來看看其中一些需要了解的地方:
1、0H~02H 一條跳轉指令,指針指向后面的引導程序
2、03H~0AH 廠商名和系統版本
3、0BH~0CH 每扇字節數,一般為512字節
4、0DH 每簇扇區數(有關簇的概念我們在后面會詳細介紹),對于FAT32的磁盤該字節一般為08H,既每簇為8H*512B=4K。
5、0EH~0FH 保留扇區數
6、10H 磁盤FAT的個數,一般為2個
7、11H~12H 對于FAT16的磁盤為根目錄的最大目錄項,對于FAT32的磁盤該值總為“00H 00H”
8、13H~14H 對于軟盤或早期小硬盤該處為分區總扇區數,對于硬盤一般此值為“00H 00H”
9、15H 介質描述,對于1.44軟盤此處長為“F0H”,對于硬盤此處長為“F8H”
10、16H~17H 對于軟盤或早期小硬盤該處為每個FAT占用的扇區數,對于硬盤一般此值為“00H 00H”
11、18H~19H 每道扇區數,一般為“3FH 00H”,即每道有63個扇區
12、1AH~1BH 磁頭數,一般為“FFH 00H”,即每個柱面有255個磁頭
13、1CH~1FH 隱含扇區數
14、20H~23H 對于大硬盤來說該處存放的是該分區占用的扇區數
15、24H~27H 對于大硬盤來說該處存放的是每個FAT占用的扇區數
16、40H 該處為磁盤BIOS信息,第一塊硬盤為“80H”,一般軟盤為“00H”
17、47H~51H 用戶設置的卷標,如果沒有卷標此處常為字符串“NO NAME ”
18、52H~59H 文件系統,對于FAT32文件系統此處常為“FAT32 ”
19、1FEH~1FFH 結束標識,和上文提到的主引導區的結束標識一樣為“55H AAH” 以上是引導扇區的一些信息,在上面我們可以獲得一些有用的信息,我們也可以想象一下為什么當我們在分區上單擊右鍵在分區屬性中可以看到一些分區信息,比如分區大小,文件系統等等,知道原理,你也可以直接調用這些參數了。
(三)磁盤文件分配表(FAT) 在介紹FAT之前,我們要先了解有關簇的概念,簇(Cluster)是文件數據區被劃分成的具有大小相等的區域用于磁盤文件的計量分配單位。一個簇可能有1、2、4、8、16、32、64或128(必須是2的冪)個扇區構成,但對于一種磁盤系統是其值往往是一定的,比如FAT16中每簇一般為32K(占64個扇),FAT32中每簇一般為4K(占8個扇)。
要理解操作系統為什么要用簇對磁盤進行管理,還是得學習FAT,FAT32磁盤中在系統引導區之后有一些保留未用的扇區,再后面有一個以 F8H FFH FFH 0FH 開始的FAT表,(對于FAT16是以F8H FFH開始的),每個FAT項占32位(4個字節),FAT16的每個FAT項占16位(2個字節),不同的FAT值有不同的含義:
FAT12的表項值 FAT16的表項值 FAT32的表項值 值的含義 000H 0000H 00000000H 未用的空簇 001H~FEFH 0001H~FFEFH 00000001H~0FFFFFEFH 文件已使用的簇 FF0H~FF6H FFF0H~FFF6H 0FFFFFF0H~0FFFFFF6H 系統保留簇 FF7H FFF7H 0FFFFFF7H 壞簇 FFF8H~FFFH FFF8H~FFFFH 0FFFFFF8H~0FFFFFFFH 文件的最后一簇
注意:在FAT表項中的16進制碼總是從高向底排列的。 我們再來看看系統是如何利用FAT表來管理和訪問文件的。系統在創建一個新文件時,逐一掃描FAT,跳過已經分配的簇,將該簇分給文件,其簇號作為該文件的起始簇號被放在該文件的文件目錄項中(關于文件目錄項我們將在后面詳談),如果此文件的大小只需要一個簇就可以放下的話,在該簇對應的FAT項中將放文件最后一簇的標志(一般是FFH FFH FFH F0H,即其值為0FFFFFFFH),如果文件大小一個簇放不下,系統就會在繼續尋找FAT表中未用的簇,找到后將該簇的簇號寫到上一簇對應的FAT項中,如果此時已經可以存下該文件的數據,系統就會在此簇對應的FAT中記上最后簇的標志,否則就繼續找下一空簇......
也就是說FAT和簇是一一對應的關系,對于FAT32的FAT來說每4個字節為1個FAT項(對于FAT16的FAT每2個字節為一個FAT項),從0~N個FAT項分別對應0~N個簇,在我們對文件進行訪問時,總是先訪問文件的目錄項,找到首簇簇號,再找到該簇號對應的FAT項,在其中找到下一簇的簇號,再在下一簇對應的FAT項中找到再下一簇的簇號......
一直到在FAT項中找到有文件最后一簇的標志,我們對該文件的查找才結束。(當然也可能在首簇對應的FAT中該文件就結束了)這樣就形成了一個鏈,我們把它稱為盤簇鏈。 簡要介紹一下FAT12系統,FAT12現在只用于軟盤,因為是每個FAT占12位所以是每2個字節含有3個FAT項,我們來看看FAT12系統在尋找簇鏈的過程:將10進制簇號*1.5并取整,該值為FAT相對位移,在該處存放的是下一簇的簇號,以此類推。 一個問題:到底每簇占多少扇區合適?文件所占簇數為: 文件占用的簇數=[文件長度/每簇所占空間]取整+1 文件在最后一個簇存放的時候不可能剛好放滿,沒有放滿的空間就浪費了(就好象我們打電話不可能每個電話都打到X分59.99秒,即使你通話時間為X分1秒你也要付出X+1分的電話費),
我們可以來計算一下你的FAT系統磁盤空間浪費的大小: 浪費的空間大小=文件個數/2*每簇字節數(平均每個文件浪費半個簇的空間) 這樣看來好象簇越小浪費的空間也越小,但是有個矛盾的地方是簇越小FAT所用的空間就會越大,同時簇小了,簇鏈就越長,訪問文件的時間就會加長,這又是一種資源上的浪費,因此,簇的大小應該是以提高文件的訪問時間和充分利用磁盤空間為原則的。
(四)目錄項的結構 在第2個FAT表(系統一般有兩個同樣的FAT表)后我們可以找到該分區的根目錄區,在上面有許多目錄項(注意:目錄項并非根目錄才有),讓我們先來復習一下FAT16的目錄項各個字節的含義: 由32個字節構成: 0
0H~07H 文件的文件名,其中00H為以下值時有些特定含義:
00H 表項為空表項 E5H 文件已被刪除
05H 實際該字節為的值為E5H 08H~0AH 文件的擴展名
0BH 文件屬性
8位文件屬性字節含義如下:
B7~B6 未用
B5 歸檔位
B4 子目錄(代表該文件是一個目錄或叫文件夾)
B3 卷標(卷標也解釋為一種特殊的文件)
B2 系統文件
B1 隱藏文件
B0 只讀文件
0CH~15H FAT16系統保留未用
16H~17H 系統最后修改時間,其中: 16H字節的0~4位是以2秒為增量的秒
16H字節的5~7位和17H字節的0~2位是分鐘
17H字節的3~7位是小時 1
8H~19H 文件最后修改的日期,其中: 18H字節0~4位是天號
18H字節5~7位和19H字節0位是月份
19H字節的1~7位為年號,0~119分別代表1980~2099
1AH~1BH 文件的起始簇號(我們在之前已經介紹了)
1CH~1FH 文件的長度(單位為字節) 我們知道用在FAT16系統下的文件名有一些弊端,如:文件名最多只能有8個字符(或4個漢字),擴展名最多有3個字符,不分大小寫,不能用一些特殊字符等。在FAT32系統這些問題已經得到解決,我們來看看FAT32系統是如何解決長文件名問題的。假如在你的電腦中有一個文件名為abcdefghijklmnopqrstuvwxyz111111.txt的文件名,那么該文件在磁盤目錄中就占用了4個已32字節為單位的目錄項,其中有3個目錄項是用來描述長文件名的,有1個目錄項是用來兼容老的FAT系統的,我們來看看例子中前3個用于描述長文件名的目錄項
: 43H 31H 00H 31H 00H 31H 00H 31H 00H 31H 00H 0FH 00H 27H 31H 00H 2EH 00H 74H 00H 78H 00H 74H 00H 00H 00H 00H 00H FFH FFH FFH FFH
02H 6EH 00H 6FH 00H 70H 00H 71H 00H 72H 00H 0FH 00H 27H 73H 00H 74H 00H 75H 00H 76H 00H 77H 00H 78H 00H 00H 00H 79H 00H 7AH 00H
01H 61H 00H 62H 00H 63H 00H 64H 00H 65H 00H 0FH 00H 27H 66H 00H 67H 00H 68H 00H 69H 00H 6AH 00H 6BH 00H 00H 00H 6CH 00H 6DH 00H
不難看出描述長文件名的目錄項中的一些規則:
在每個目錄項的32個字節中,(1)、偏移0H處:代表了長文件描述目錄項的序號,其中高4位如果為0100則表示此項為最后一個目錄項,低4位表示此長文件名的目錄項的序號。如果此長文件名描述目錄只用到了1個目錄項,則此值為41H,如果此值為E5H代表此文件已被刪除;(2)、偏移0BH~0CH處:其值總為0FH 00H;(3)、偏移0D處:該長文件目錄項的標號,同一個長文件目錄的不同目錄項該值總相同(比如本例中3個目錄項該值都為27H);(4)、偏移1AH~1BH處:該值總為00H 00H;(5)從偏移01H~1FH跳過前4項提到的字節,總是一個文件名的ASCII碼接一個00H排列的,如果文件名的ASCII碼在一個目錄項還未寫完,則會接到下一個目錄項(實際上這些目錄項都是從高到低排列的)同樣的位置繼續寫,如果已經寫完,則系統會在最后一個ACSII碼后寫00H,最多寫3個00H,如果3個00H寫完后,目錄項還有空余位置,則系統會把這些位置全部寫上FFH。 同時FAT32系統還有一個類似與FAT16的目錄項(緊接著長文件名的目錄的后面),同樣占32個字節:
00H~07H 文件的文件名
08H~0AH 文件的擴展名
0BH 文件屬性 0CH 保留未用
0EH~0FH 文件創建時間
10H~11H 文件最后訪問日期
12H~13H 文件創建日期
14H~15H 文件起始簇號的高16位
16H~17H 系統最后修改時間,
其中:
16H字節的0~4位是以2秒為增量的秒
16H字節的5~7位和17H字節的0~2位是分鐘
17H字節的3~7位是小時
18H~19H 文件最后修改的日期,其中: 18H字節0~4位是天號
18H字節5~7位和19H字節0位是月份
19H字節的1~7位為年號,0~119分別代表1980~2099 1AH~1BH 文件的起始簇號的低16位 1CH~1FH 文件的長度(單位為字節)
注意:其中文件名為DOS兼容文件名,比如上例中在DOS下的文件名為ABCDEF~1.TXT;其首字節含義同FAT16系統;文件屬性字節含義同FAT16系統;在FAT32系統中增加了最后訪問日期和文件創建時間日期,其計算原理同FAT16中的最后修改的時間和日期。
(六)擴展分區表 我們已經學習了在主引導扇區中的分區表的偏移04H,是分區系統標志,當該值為05H或0FH表示該分區為擴展分區,其實它并非一個真正意義上的分區項,此分區項只是指向一個擴展分區表,這樣做是為了解決分區表中最多只能有4個分區項的問題,擴展分區表也是從擴展分區表所在的扇區偏移1BEH~偏移1FD,該扇區0H~1BDH一般為1BEH個00H,同樣要以結束標志55H AAH結束。 同樣,在擴展分區表中也可能存在指向下一個擴展分區表的分區項。
假如您的硬盤數據丟失了,請聯系我們華軍行,我們有更加專業的數據恢復工程師為您服務!