陳培德,吳建平,王麗清,朱辰龍,鄧 劍
(1.云南省電子計(jì)算中心,云南 昆明 650223;2.云南大學(xué) 信息學(xué)院,云南 昆明 650223)
GPT是GUID partition table的縮寫,其含義是“全局唯一標(biāo)識磁盤分區(qū)表”[1]。它是Windows Server 2003中的一種新型磁盤架構(gòu),是一種基于Itanium計(jì)算機(jī)中的可擴(kuò)展固件接口使用的磁盤分區(qū)架構(gòu)[1]。GPT的出現(xiàn)替代了舊式的MBR(master boot record)[2-3],解決了MBR分區(qū)表不支持容量大于2 TB分區(qū)的問題[4]。
而NTFS文件系統(tǒng)則是Windows操作系統(tǒng)重要的組成部分,但是由于計(jì)算機(jī)病毒的破壞、掉電、用戶誤Ghost、GPT分區(qū)至MBR分區(qū)誤轉(zhuǎn)等各種原因,導(dǎo)致GPT分區(qū)表被破壞的情況時有發(fā)生。當(dāng)GPT分區(qū)表被破壞后,用戶通過查找的方式獲得GPT分區(qū)中各卷的容量,并通過重建GPT分區(qū)的來恢復(fù)。
然而在GPT分區(qū)的硬盤中,當(dāng)GPT分區(qū)表、NTFS_DBR和NTFS_DBR備份同時被破壞后,恢復(fù)數(shù)據(jù)的難度系數(shù)也就更大。鑒于目前國內(nèi)尚未有人展開同時恢復(fù)GPT分區(qū)、NTFS_DBR和NTFS_DBR備份的相關(guān)研究工作,文中針對這種情況進(jìn)行了開創(chuàng)性的探索與研究。
一個GPT磁盤主要由保護(hù)的MBR、GPT頭、GPT分區(qū)表、GPT分區(qū)區(qū)域等6個部分組成,大致結(jié)構(gòu)如圖1所示,6個部分說明如下:
在圖1中,n為GPT磁盤的總扇區(qū)數(shù),GPT磁盤的扇區(qū)號范圍為0 ~(n-1)。
第1部分為保護(hù)MBR,存儲在整個GPT磁盤的0號扇區(qū),該扇區(qū)由磁盤簽名[5]、1個MBR分區(qū)表和結(jié)束標(biāo)志3個部分組成。其中,MBR分區(qū)表固定如下:
00 00 02 00 EE FF FF FF 01 00 00 00 FF FF FF FF
從MBR分區(qū)表可知:分區(qū)標(biāo)志為0XEE,而相對扇區(qū)為1(存儲形式為01 00 00 00),總扇區(qū)數(shù)為4 294 967 295(存儲形式為FF FF FF FF),也就是該分區(qū)總數(shù)的最大值[6]。也就是說,該磁盤已經(jīng)沒有剩余空間再進(jìn)行MBR分區(qū),即該磁盤已經(jīng)成為GPT磁盤。
第2部分為GPT頭,存儲在整個GPT磁盤的1號扇區(qū)[7],在1號扇區(qū)中,只使用了92個字節(jié);主要描述了GPT頭簽名、版本號、GPT頭所占字節(jié)數(shù)(注:一般為92)、GPT頭CRC校驗(yàn)和、GPT頭所在扇區(qū)號(注:一般為1)、GPT頭備份所在扇區(qū)號、GPT分區(qū)區(qū)域開始扇區(qū)號(注:一般為34)、GPT分區(qū)區(qū)域結(jié)束扇區(qū)號、GPT磁盤的GUID、GPT分區(qū)表開始扇區(qū)號、每個GPT分區(qū)表所占字節(jié)數(shù)(注:一般為128)、GPT分區(qū)表的個數(shù)(注:固定為128)、GPT分區(qū)表的CRC校驗(yàn)和等信息。
第3部分為GPT分區(qū)表,存儲在GPT磁盤的2~33號扇區(qū),共占用32個扇區(qū)[8];從GPT頭可知,每個GPT分區(qū)表占128字節(jié)[9],所以,在這32個扇區(qū)中最多可以存放128個GPT分區(qū)表[9],而每個GPT分區(qū)表管理一個分區(qū);在每個分區(qū)表中記錄著該分區(qū)的開始扇區(qū)號、結(jié)束扇區(qū)號、分區(qū)類型的GUID、分區(qū)名、分區(qū)屬性和分區(qū)GUID。第1個分區(qū)表為系統(tǒng)保留,因此,用戶在GPT磁盤上最多還可以再建立127個分區(qū)。
第4部分為GPT分區(qū)區(qū)域,是GPT磁盤中最大的一塊區(qū)域[8],也是GPT磁盤最重要的組成部分;位于GPT磁盤的中間位置,其開始扇區(qū)號和結(jié)束扇區(qū)號在GPT頭已定義。一般情況下,該區(qū)域的開始扇區(qū)號為34,而結(jié)束扇區(qū)號為GPT磁盤總扇區(qū)數(shù)減去35。該區(qū)域由該GPT磁盤中各個具體的分區(qū)組成,各分區(qū)的開始扇區(qū)號和結(jié)束扇區(qū)號在各分區(qū)表中均有定義。
第5部分為GPT分區(qū)表備份,存儲在GPT磁盤的倒數(shù)33號扇區(qū)~倒數(shù)2號扇區(qū),也是占用32個扇區(qū)[8]。是第3部分,即GPT磁盤的2 ~ 33號扇區(qū)的備份。
第6部分為GPT頭備份,存儲在GPT磁盤的倒數(shù)2號扇區(qū)[10],但該扇區(qū)不是GPT頭的簡單復(fù)制。在這個扇區(qū)中,也是使用了92個字節(jié);主要描述了GPT頭簽名、版本號、GPT頭所占字節(jié)數(shù)(注:一般為92)、GPT頭CRC校驗(yàn)和、GPT頭備份所在扇區(qū)號、GPT頭所在扇區(qū)號(注:一般為1)、GPT分區(qū)區(qū)域開始扇區(qū)號(注:一般為34)、GPT分區(qū)區(qū)域結(jié)束扇區(qū)號、GPT磁盤的GUID、GPT分區(qū)表開始扇區(qū)號、每個GPT分區(qū)表所占字節(jié)數(shù)(注:一般為128)、GPT分區(qū)表的個數(shù)(注:固定為128)、GPT分區(qū)表的CRC校驗(yàn)和等信息。
當(dāng)用戶將硬盤中的一個分區(qū)采用NTFS文件系統(tǒng)對其格式化后,在該分區(qū)上就建立了一個NTFS文件系統(tǒng)的結(jié)構(gòu),NTFS文件系統(tǒng)的結(jié)構(gòu)大致如圖2所示。
元文件SBOOT…某元文件…數(shù)據(jù)或文件某元文件數(shù)據(jù)或文件…DBR備份
圖2 某NTFS文件系統(tǒng)的總體布局
從圖2可知,NTFS文件系統(tǒng)主要由元文件、文件夾、數(shù)據(jù)和其他用戶文件等組成[11-12]。其中:一些信息對于NTFS文件系統(tǒng)來說是非常重要的,存儲這些重要信息所對應(yīng)的文件就是元文件[13]。元文件是NTFS系統(tǒng)最重要的組成部分,它主要負(fù)責(zé)管理整個NTFS文件系統(tǒng)。在NTFS文件系統(tǒng)中,元文件主要有$MFT、$MFTMirr、$LogFile、$Volume、$Attrdef、$Root、$Bitmap、$Boot等。
其中:元文件$Boot在NTFS卷中的位置是固定不變的,位于NTFS卷的0號簇[11],該元文件所占簇?cái)?shù)與每個簇的扇區(qū)數(shù)有關(guān),NTFS_DBR則是元文件$Boot的重要組成部分,位于NTFS卷的0號扇區(qū)。由于NTFS_DBR比較重要,所以,在NTFS卷的最后一個扇區(qū)存儲著NFTS_DBR備份。如果NTFS_DBR被破壞,可以通過NTFS_DBR備份來恢復(fù);但是如果NTFS_DBR和NTFS_DBR備份同時被破壞,只有通過計(jì)算NTFS_DBR中BPB參數(shù)的形式來恢復(fù)。
(1)實(shí)驗(yàn)環(huán)境。
操作系統(tǒng):Windows 7。
硬盤:虛擬硬盤。
數(shù)據(jù)恢復(fù)軟件:WinHex 15.08。
(2)制作實(shí)驗(yàn)素材的步驟。
步驟1:在Windows 7桌面上,右擊“計(jì)算機(jī)”圖標(biāo),從彈出的快捷菜單中選擇“管理”,出現(xiàn)“計(jì)算機(jī)管理”窗口,在導(dǎo)航窗格中選擇“存儲→磁盤管理”,選擇菜單欄上的“操作→創(chuàng)建VHD”后,在“創(chuàng)建和附加虛擬硬盤”窗口中指定虛擬硬盤位置為G盤的根目錄,虛擬硬盤文件名為a2.vhd,虛擬硬盤大小為2 GB。
步驟2:選擇菜單欄上的“操作→附加VHD”后,附加a2.vhd文件為虛擬磁盤1,將光標(biāo)移動到磁盤1處,將磁盤1初始化成GPT磁盤。
步驟3:在磁盤1上建立1個分區(qū),分區(qū)大小為450 MB,文件系統(tǒng)選擇NTFS,將其進(jìn)行格式化。
步驟4:重復(fù)步驟3共計(jì)3次,在磁盤1上依次再建立3個分區(qū),分區(qū)大小分別為390 MB、630 MB和510 MB文件。
完成以上操作后,在磁盤1中4個分區(qū)對應(yīng)4個邏輯盤情況如下:
序號盤符文件系統(tǒng)容量(單位:MB)1H盤 NTFS4502I盤 NTFS3903J盤 NTFS6304K盤 NTFS510
分別復(fù)制一定數(shù)量的文件夾和文件到4個邏輯盤中;并記錄下4個邏輯盤的NTFS_DBR和NTFS_DBR備份所在扇區(qū)號。
分離虛擬磁盤1,使用Winhex軟件打開a2.vhd文件;將4個邏輯盤的NTFS_DBR和NTFS_DBR備份所在扇區(qū)號填充為00。
將a2.vhd文件附加為虛擬磁盤1,并刪除4個邏輯盤,然后再轉(zhuǎn)換成MBR磁盤。
至此,實(shí)驗(yàn)素材已制作完成。
重建GPT分區(qū)的基本思路:分別計(jì)算H盤、I盤、J盤和K盤的容量;重建GPT分區(qū)的方法如下:
(1)通過NTFS元文件$MFT或者元文件$MFTMirr的0號記錄80H非常駐屬性計(jì)算出NTFS文件系統(tǒng)每個簇的扇區(qū)數(shù)。
(2)通過NTFS元文件$MFT的8號記錄80H屬性計(jì)算NTFS總簇?cái)?shù)。
(3)通過NTFS卷總簇?cái)?shù)和每個簇的扇區(qū)數(shù),計(jì)算NTFS卷的容量。
重建GPT分區(qū)操作步驟如下:
步驟1:啟動WinHex軟件。
步驟2:打開a2.vhd文件,并映象為磁盤。
步驟3:查找元文件$MFT或者$MFTMirr的0號記錄,在65 680號扇區(qū)找到,如圖3所示。
步驟4:計(jì)算每個簇的扇區(qū)數(shù)。
從圖3可知,NTFS文件系統(tǒng)分配給元文件$MFT的空間為524 288字節(jié),占512個簇;在元文件$MFT或者$MFTMirr的0號記錄80H屬性中的存儲形式分別為“00 00 08 00 00 00 00 00”和“00 02”。
根據(jù)元文件NTFS文件系統(tǒng)分配給元文件$MFT的空間和所占簇?cái)?shù),可以計(jì)算出第1個卷(即H盤)每個簇的扇區(qū)數(shù)。
圖3 第1個NTFS元文件$MFT或者$MFTMirr的0號記錄80H屬性
NTFS文件系統(tǒng)分配給元文件$MFT的空間=每個簇的扇區(qū)數(shù)×所占簇?cái)?shù)×512字節(jié)/簇
524 288字節(jié)=每個簇的扇區(qū)數(shù)×512簇×
512字節(jié)/簇
每個簇的扇區(qū)數(shù)=2
步驟5:查找元文件$MFT的8號記錄,在372 880號扇區(qū)找到,如圖4所示。
從圖4可知,NTFS文件系統(tǒng)的最后一個簇號為460 799,其存儲形式為“FF 07 07”。
步驟6:計(jì)算NTFS卷的容量。
NTFS文件系統(tǒng)的簇號范圍為0~460 799,即總簇?cái)?shù)為460 800。
圖4 第1個NTFS元文件$MFT的8號記錄80H屬性
步驟7:重復(fù)步驟3至步驟5,可以計(jì)算出第2個(即I盤)至第4個(即K盤)卷中NTFS系統(tǒng)的每個簇扇區(qū)數(shù)和容量。在GPT磁盤中,4個卷的基本情況如下:
序號每個簇的扇區(qū)數(shù)卷的容量(單位:MB) 12450212839033263042510
NTFS卷的容量=總簇?cái)?shù)×每個簇的扇區(qū)數(shù)×
512字節(jié)/扇區(qū)÷1 024÷1 024 MB=
460 800×2×512÷1 024÷1 024 MB=
450 MB步驟8:退出WinHex。
步驟9:進(jìn)入“計(jì)算機(jī)”管理窗口,選擇菜單欄上的“操作→附加VHD”后,附加G盤根目錄的a2.vhd文件為虛擬磁盤1,并轉(zhuǎn)換成GPT磁盤。
步驟10:在磁盤1上依次建立4個GPT分區(qū),磁盤1中4個分區(qū)依次對應(yīng)4個卷的容量分別為450 MB、390 MB、630 MB和510 MB。
注:千萬不要對4個卷進(jìn)行(快)格式化操作。
至此,4個卷的GPT分區(qū)已經(jīng)重建完成。
步驟11:分離a2.vhd,使用WinHex打開a2.vhd,并映象為磁盤,從主窗口可以得到分區(qū)2、分區(qū)3、分區(qū)4和分區(qū)5的開始扇區(qū)分別為65 664、987 264、1 785 984和3 076 224(注:分區(qū)1為微軟保留分區(qū))。
重建NTFS_DBR的基本思路:計(jì)算NTFS_DBR中的每個簇的扇區(qū)數(shù)、隱藏扇區(qū)數(shù)、總扇區(qū)數(shù)等七個BPB參數(shù)?;痉椒ㄈ缦拢?/p>
(1)每個簇的扇區(qū)數(shù):通過NTFS元文件$MFT或者元文件$MFTMirr的0號記錄80H非常駐屬性計(jì)算出NTFS文件系統(tǒng)每個簇的扇區(qū)數(shù)。
(2)隱藏扇區(qū)數(shù):通過NTFS_DBR所在扇區(qū)號獲得,即建立GPT分區(qū)后,每個卷在整個硬盤中的開始扇區(qū)號。
注:系統(tǒng)對該參數(shù)的正確性不進(jìn)行校驗(yàn),也可以不計(jì)算該參數(shù),重建NTFS_DBR中沒有計(jì)算該參數(shù)。
(3)總扇區(qū)數(shù):總?cè)萘哭D(zhuǎn)換為扇區(qū)數(shù)后減1。
(4)元文件$MFT的開始簇號:從元文件$MFT或$MFTMirr的0號記錄80H屬性數(shù)據(jù)運(yùn)行列表中的開始簇號獲得。
(5)元文件$MFTMirr的開始簇號:從元文件$MFT或$MFTMirr的1號記錄80H屬性數(shù)據(jù)運(yùn)行列表中的開始簇號獲得。
(6)元文件$MFT每條記錄大小描述和索引節(jié)點(diǎn)大小描述[1]:以每個簇的扇區(qū)數(shù)為依據(jù)通過查詢表1獲得,見表1。
表1 每個簇的扇區(qū)數(shù)與$MFT記錄大小、索引節(jié)點(diǎn)大小對應(yīng)表
將同一版本的NTFS_DBR復(fù)制到每個NTFS_DBR所在扇區(qū)號,并修改每個簇的扇區(qū)數(shù)、隱藏扇區(qū)數(shù)等這七參數(shù)[14]。
重建NTFS_DBR操作步驟如下:
步驟1:啟動WinHex軟件。
步驟2:打開a2.vhd文件,并映象為磁盤。
步驟3:查找元文件$MFT或者$MFTMirr的0號記錄,在65680號扇區(qū)找到,如圖3所示。
步驟4:計(jì)算每個簇的扇區(qū)數(shù)。
NTFS文件系統(tǒng)分配給元文件$MFT的空間=每個簇的扇區(qū)數(shù)×所占簇?cái)?shù)×512字節(jié)/簇
524 288字節(jié)=每個簇的扇區(qū)數(shù)×512簇×
512字節(jié)/簇
每個簇的扇區(qū)數(shù)=2
步驟5:計(jì)算總扇區(qū)數(shù)。
總扇區(qū)數(shù)=總?cè)萘俊? 024×1 024÷512-1=
450×1 024×1 024÷512-1=
921 599
步驟6:元文件$MFT的開始簇號:從圖3可知,元文件$MFT的開始簇號為153 600(注:存儲形式為00 58 02)。
步驟7:元文件$MFTMirr的開始簇號:將光標(biāo)移動到65 682號扇區(qū),即元文件$MFT或$MFTMirr的1號記錄開始扇區(qū)號,可以得到元文件$MFTMirr的開始簇號為8(注:存儲形式為08)。
步驟8:以每個簇的扇區(qū)數(shù)為依據(jù),通過查詢表1獲得元文件$MFT每條記錄大小描述和索引節(jié)點(diǎn)大小描述。
第1個NTFS文件系統(tǒng)每個簇的扇區(qū)數(shù)為2,從表1可以查找到,元文件$MFT每條記錄大小描述為1,每個索引節(jié)點(diǎn)大小描述為4。
步驟9:綜合步驟4至步驟8,重建第1個NTFS_DBR需要計(jì)算的BPB參數(shù),如下所示。
字節(jié)偏移字節(jié)數(shù)含義值0X0D1每個簇的扇區(qū)數(shù)20X288扇區(qū)總數(shù)921 5990X308$MFT的開始簇號153 6000X388$MFTMirr的開始簇號80X401每個$MFT記錄大小描述1個簇0X441每個索引節(jié)點(diǎn)大小描述4個簇
轉(zhuǎn)換成在NTFS_DBR中的存儲形式,如下所示:
字節(jié)偏移含義在NTFS_DBR中的存儲形式0X0D每個簇的扇區(qū)數(shù)020X28扇區(qū)總數(shù)FF 0F 0E 00 00 00 00 000X30$MFT的開始簇號00 58 02 00 00 00 00 000X38$MFTMirr的開始簇號08 00 00 00 00 00 00 000X40每個$MFT記錄大小描述010X44每個索引節(jié)點(diǎn)大小描述04
步驟10:重復(fù)步驟4至步驟9,重建第2個NTFS_DBR需要計(jì)算的BPB參數(shù),如下所示:
字節(jié)偏移字節(jié)數(shù)含義值0X0D1每個簇的扇區(qū)數(shù)1280X288扇區(qū)總數(shù)798 7190X308$MFT的開始簇號2 0800X388$MFTMirr的開始簇號10X401每個$MFT記錄大小描述1 024字節(jié)0X441每個索引節(jié)點(diǎn)大小描述4 096字節(jié)
轉(zhuǎn)換成在NTFS_DBR中的存儲形式,如下所示:
字節(jié)偏移含義在NTFS_DBR中的存儲形式0X0D每個簇的扇區(qū)數(shù)800X28扇區(qū)總數(shù)FF2F 0C 00 00 00 00 000X30$MFT的開始簇號20 08 00 00 00 00 00 000X38$MFTMirr的開始簇號01 00 00 00 00 00 00 000X40每個$MFT記錄大小描述F60X44每個索引節(jié)點(diǎn)大小描述F4
步驟11:重復(fù)步驟4至步驟9,重建第3個NTFS_DBR需要計(jì)算的BPB參數(shù),如下所示:
字節(jié)偏移字節(jié)數(shù)含義值0X0D1每個簇的扇區(qū)數(shù)320X288扇區(qū)總數(shù)1 290 2390X308$MFT的開始簇號13 4400X388$MFTMirr的開始簇號10X401每個$MFT記錄大小描述1 024字節(jié)0X441每個索引節(jié)點(diǎn)大小描述4 096字節(jié)
轉(zhuǎn)換成在NTFS_DBR中的存儲形式,如下所示:
字節(jié)偏移含義在NTFS_DBR中的存儲形式0X0D每個簇的扇區(qū)數(shù)200X28扇區(qū)總數(shù)FF AF 13 00 00 00 00 000X30$MFT的開始簇號80 34 00 00 00 00 00 000X38$MFTMirr的開始簇號01 00 00 00 00 00 00 000X40每個$MFT記錄大小描述F60X44每個索引節(jié)點(diǎn)大小描述F4
步驟12:重復(fù)步驟4至步驟9,重建第4個NTFS_DBR需要計(jì)算的BPB參數(shù),如下所示:
字節(jié)偏移字節(jié)數(shù)含義值0X0D1每個簇的扇區(qū)數(shù)20X288扇區(qū)總數(shù)1 044 4790X308$MFT的開始簇號1740800X388$MFTMirr的開始簇號80X401每個$MFT記錄大小描述1簇0X441每個索引節(jié)點(diǎn)大小描述4簇
轉(zhuǎn)換成在NTFS_DBR中的存儲形式,如下所示:
字節(jié)偏移含義在NTFS_DBR中的存儲形式0X0D每個簇的扇區(qū)數(shù)020X28扇區(qū)總數(shù)FF EF 0F 00 00 00 00 000X30$MFT的開始簇號00 A8 02 00 00 00 00 000X38$MFTMirr的開始簇號08 00 00 00 00 00 00 000X40每個$MFT記錄大小描述010X44每個索引節(jié)點(diǎn)大小描述04
步驟13:將同一版本NTFS_DBR復(fù)制到65 664號扇區(qū),并修改第1個NTFS_DBR中的BPB參數(shù)并存盤,如圖5所示,至此,第1個卷的NTFS_DBR已經(jīng)恢復(fù)完成。
圖5 恢復(fù)第1個卷的NTFS_DBR
步驟14:將同一版本NTFS_DBR復(fù)制到987 264號扇區(qū),修改第2個NTFS_DBR中的BPB參數(shù);將同一版本NTFS_DBR復(fù)制到1 785 984號扇區(qū),并修改第3個NTFS_DBR中的BPB參數(shù);將同一版本NTFS_DBR復(fù)制到3 076 224號扇區(qū),并修改第4個NTFS_DBR中的BPB參數(shù)[14]。
至此,第2~4個卷的NTFS_DBR已經(jīng)恢復(fù)完成。
步驟15:通過NTFS_DBR恢復(fù)NTFS_DBR備份。由于NTFS_DBR備份位于每個NTFS卷的最后一個扇區(qū)[15],4個NTFS_DBR備份依次分別位于987 263、1 785 983、3 076 223和4 120 703號扇區(qū),分別將65 664號扇區(qū)復(fù)制到987 263號扇區(qū),將987 264號扇區(qū)復(fù)制到1 785 983號扇區(qū),將1 785 984號扇區(qū)復(fù)制到3 076 223號扇區(qū),將3 076 224號扇區(qū)復(fù)制到4 120 703號扇區(qū)。
注:由于NTFS文件系統(tǒng)對NTFS_DBR備份是否存在并不進(jìn)行校驗(yàn),步驟15也可以省略。
由于計(jì)算機(jī)病毒的破壞、用戶使用Ghost軟件對GPT磁盤誤操作、誤將GPT磁盤轉(zhuǎn)換為MBR磁盤、突然掉電等因素等,導(dǎo)致GPT分區(qū)、NTFS_DBR和NTFS_DBR備份同時被破壞的現(xiàn)象時有發(fā)生。通過實(shí)驗(yàn)的方式,依據(jù)NTFS文件系統(tǒng)元文件$MFT的0號記錄、1號記錄和6號記錄的80H屬性相關(guān)參數(shù),提出重建GPT分區(qū)、NTFS_DBR和NTFS_DBR備份的基本思路、方法與步驟。作者在該實(shí)驗(yàn)中過程中,只使用了15分鐘的時間,就恢復(fù)了GPT磁盤中的4個邏輯盤中的全部文件夾和文件。實(shí)踐證明:該方法具有方便、快捷、簡單實(shí)用的特點(diǎn)。