施 陶 王劍雄 李宗陽 李晨昊
(河北建筑工程學院,河北 張家口 075000)
GPT分區(qū)模式是一種區(qū)別于傳統(tǒng)的主引導記錄(MBR)分區(qū)方案的一種新的磁盤分區(qū)表結(jié)構(gòu)標準,具有更加靈活的分區(qū)機制.由于Windows10操作系統(tǒng)在個人PC中的普及,以及用來引導Windows10操作系統(tǒng)的磁盤必須采用GPT分區(qū)模式,這導致使用GPT分區(qū)模式的磁盤在個人PC磁盤中所占比例非常高.與傳統(tǒng)的MBR分區(qū)模式相比,GPT模式具有很多明顯的優(yōu)點.首先,GPT磁盤支持大小超過2TB的磁盤,而且每個分區(qū)的大小也不在受到2TB的約束.其次,Windows系統(tǒng)下的GPT磁盤最多可以有128個主分區(qū),而不再僅限于MBR模式下的4個.再者,GPT磁盤的分區(qū)表自帶備份,相比于MBR磁盤則更加安全.即便如此,在日常生活中,還是會常常出現(xiàn)由于誤操作、病毒或者物理損壞等原因造成磁盤無法讀取,從而損失里面重要的數(shù)據(jù).而這其中,有很大一部分是由于分區(qū)表損壞引起的,由此可見,GPT分區(qū)表的恢復是至關重要的.
GPT磁盤主要由6個部分組成,按照前后順序分別為保護MBR、GPT頭、分區(qū)表、分區(qū)區(qū)域、分區(qū)表備份、GPT頭備份.
保護MBR位于GPT磁盤的第一個扇區(qū),也就是0號扇區(qū),是為了防止某些無法識別GPT磁盤的程序誤以為磁盤沒有進行分區(qū)進而對磁盤進行一些錯誤的操作,對于文件系統(tǒng)本身來說沒有什么實際的作用.
GPT頭位于GPT磁盤的第二個扇區(qū),即1號扇區(qū).它記錄了GPT磁盤中各個重要組成部分所在的位置以及它們的一些屬性信息,如分區(qū)表的起始位置和結(jié)束位置、分區(qū)表的項數(shù)以及每一項的字節(jié)數(shù)等.除此之外,還記錄了分區(qū)表和GPT頭本身的CRC校驗和.需要指出的是,GPT頭中記錄的分區(qū)區(qū)域起始位置有時并不準確,實際情況以分區(qū)表中的記錄為準.
分區(qū)表占用了GPT磁盤第2到33號扇區(qū),總共32個扇區(qū),最多可以容納128個分區(qū)表項,其中每個分區(qū)表項占用128個字節(jié).分區(qū)表是GPT磁盤中極其重要的組成部分,它記錄了分區(qū)類型GUID、分區(qū)GUID、分區(qū)的起始地址和結(jié)束地址、分區(qū)的屬性以及分區(qū)的名字,如圖1所示.
分區(qū)表之后便是分區(qū)區(qū)域,通常起始于34號扇區(qū),但不一定,比如圖1中所示分區(qū)表中的第一個分區(qū)就起始于2048號扇區(qū).分區(qū)區(qū)域通常由多個具體的分區(qū)組成,如EFI系統(tǒng)分區(qū)、微軟保留分區(qū)、主分區(qū)等.分區(qū)區(qū)域之后緊跟著分區(qū)表的備份,同樣占用32個扇區(qū),再之后便是GPT頭的備份,占用整個GPT磁盤的最后一個扇區(qū).需要注意的是GPT頭的備份并不是和GPT頭完全一樣,它們的結(jié)構(gòu)相同,但個別參數(shù)不同.
圖1 2號扇區(qū)的分區(qū)表
分區(qū)表中每一個表項都對應著分區(qū)區(qū)域的一個具體分區(qū),記錄著這些分區(qū)的分區(qū)類型GUID、分區(qū)GUID、分區(qū)的起始地址和結(jié)束地址、分區(qū)的屬性以及分區(qū)的名字等信息.當分區(qū)表損壞導致磁盤無法使用時,我們可以根據(jù)分區(qū)區(qū)域存儲的數(shù)據(jù)手動計算出分區(qū)的數(shù)量以及它們的起始地址和結(jié)束地址,然后利用WinHex軟件填入被損壞的分區(qū)表的對應位置即可.在這個過程中,我們可能會遇到使用不同文件系統(tǒng)的分區(qū),比如最常見的FAT32和NTFS文件系統(tǒng).在FAT32文件系統(tǒng)的DBR中,偏移20H~23H處的四個字節(jié)記錄了整個分區(qū)的扇區(qū)總數(shù),該分區(qū)結(jié)束地址=分區(qū)起始地址+分區(qū)扇區(qū)總數(shù)-1.同樣,在NTFS文件系統(tǒng)DBR的偏移28H~2FH處,也記錄了整個NTFS分區(qū)的扇區(qū)總數(shù),當然,這不包括最后一個扇區(qū),即DBR備份扇區(qū),因此該分區(qū)結(jié)束地址=分區(qū)起始地址+分區(qū)扇區(qū)總數(shù).
除了各個分區(qū)的起始地址和結(jié)束地址,分區(qū)表中剩下的參數(shù)經(jīng)過多次實驗驗證發(fā)現(xiàn),對于數(shù)據(jù)恢復來說并非是必填不可的,因此我們可以隨意填入一些合理的數(shù)據(jù)即可,甚至可以不填.在這之后,利用WinHex軟件提供的工具計算出整個分區(qū)表區(qū)域和GPT頭的CRC校驗碼,分別填入GPT頭中對應的位置.GPT頭中的其它參數(shù)除了GPT頭備份所在扇區(qū)號和分區(qū)區(qū)域結(jié)束扇區(qū)號都是固定不變的,將它們對應的值依次填入即可.而GPT頭備份所在扇區(qū)號和分區(qū)區(qū)域結(jié)束扇區(qū)號則可以根據(jù)之前重建分區(qū)表時得出的數(shù)據(jù)獲得.至此,整個分區(qū)表的重建工作就已經(jīng)完成,無法識別的磁盤可以正常工作,丟失的文件也可以正常訪問了.
本次實驗的平臺是Windows10操作系統(tǒng),數(shù)據(jù)恢復和分析工具是WinHex18.3軟件,使用的工具是一塊采用GPT分區(qū)模式的磁盤.為了模擬分區(qū)表損壞,磁盤無法打開的情況,利用WinHex將該磁盤的GPT頭、分區(qū)表以及它們的備份全部填充為0.進行本步操作后,操作系統(tǒng)已無法正常讀取該磁盤.本次實驗的目標即重建該磁盤的GPT頭和分區(qū)表,使得該磁盤可以被操作系統(tǒng)正常訪問.
下面開始恢復操作,具體步驟如下:
第一步:使用WinHex打開該磁盤,由于GPT磁盤的第一個分區(qū)通常起始于34號扇區(qū)或者2048號扇區(qū),我們利用WinHex直接跳轉(zhuǎn)到這兩個扇區(qū)查看,果然在2048號扇區(qū)找到了一個FAT32分區(qū)的DBR,接著由這個扇區(qū)偏移20H~23H處的記錄得到這個分區(qū)的大小為614400個扇區(qū),由此計算出第一個分區(qū)的起始地址為2048,結(jié)束地址為2048+614400-1=616447.
第二步:跳轉(zhuǎn)到第一個分區(qū)結(jié)束后的下一個扇區(qū),即616448號扇區(qū),發(fā)現(xiàn)這個扇區(qū)并沒有寫入任何數(shù)據(jù).其實這是由于在Windows環(huán)境下,GPT磁盤的第二個分區(qū)通常用作微軟保留分區(qū),在沒有特殊情況下不寫入任何數(shù)據(jù).接著利用WinHex提供的搜索功能向后搜索FAT32或NTFS文件系統(tǒng)DBR的首字節(jié)值EB,很快在681984號扇區(qū)找到一個NTFS分區(qū)的DBR,因此,第二個分區(qū)(即微軟保留分區(qū))的起始地址為616448,結(jié)束地址為681983.
第三步:由687983號扇區(qū)偏移28H~2FH處的記錄可知,當前NTFS分區(qū)的大小為10190847個扇區(qū),由此可計算出第三個分區(qū)的起始地址為681984,結(jié)束地址為681984+10190847=10872831.
第四步:跳轉(zhuǎn)到10872832號扇區(qū),發(fā)現(xiàn)此扇區(qū)是FAT32文件系統(tǒng)的DBR,同樣,由其偏移20H~23H處的記錄可得當前分區(qū)的大小為10190848個扇區(qū),進而可得,該分區(qū)起始地址為10872832,結(jié)束地址為10872832+10190848-1=21063679.
第五步:接著跳轉(zhuǎn)到21063680號扇區(qū),又發(fā)現(xiàn)了一個NTFS分區(qū)的DBR,同樣由其偏移28H~2FH處記錄的參數(shù)得到此分區(qū)的大小為9508574個扇區(qū),所以這第五個分區(qū)的起始地址為21063680號扇區(qū),結(jié)束地址為21063680+9508574=30572254.
第六步:同樣跳轉(zhuǎn)到30572255號扇區(qū),發(fā)現(xiàn)這個扇區(qū)并不是文件系統(tǒng)的DBR且當前扇區(qū)距離磁盤尾部已經(jīng)非常近,由此便可判斷從當前扇區(qū)開始的32個扇區(qū),即30572255~30572286號扇區(qū),是分區(qū)表備份的位置.之后的30572287號扇區(qū)便是GPT頭備份的地址.至此,各個分區(qū)的起始地址和結(jié)束地址都已明了,如表1所示.
表1 各分區(qū)位置信息
第七步:將前面得到的地址數(shù)據(jù)轉(zhuǎn)換成十六進制依次填入2號扇區(qū)中的對應位置,同時,填入分區(qū)的GUID.由于分區(qū)GUID用于唯一標識分區(qū),故5個分區(qū)的GUID只需不同即可,可以填入任意數(shù)據(jù).填好后的分區(qū)表如圖2所示.
第八步:將0x4546492050415254000001005C000000填入位于1號扇區(qū)的GPT頭的前16個字節(jié),再將GPT頭所在扇區(qū)號、GPT頭備份所在扇區(qū)號、分區(qū)區(qū)域起始扇區(qū)號、分區(qū)區(qū)域結(jié)束扇區(qū)號和分區(qū)表起始扇區(qū)號等信息依次填入對應位置.需要注意的是,此處記錄的分區(qū)區(qū)域起始扇區(qū)號通常為34,即分區(qū)表之后的第一個扇區(qū).
第九步:使用WinHex計算出整個分區(qū)表區(qū)域的CRC32校驗碼,填入1號扇區(qū)中偏移58H~5BH中的位置,再計算GPT頭的CRC32校驗碼填入1號扇區(qū)偏移10H~13H處,保存.至此,恢復工作已經(jīng)全部完成,重新打開資源管理器,發(fā)現(xiàn)磁盤已經(jīng)可以正常識別,打開磁盤,里面的文件也已全部恢復.
圖2 重建后的分區(qū)表
GPT分區(qū)模式的磁盤在個人電腦領域非常常見,而GPT分區(qū)表的恢復又在GPT磁盤數(shù)據(jù)恢復領域占有舉足輕重的地位.本文通過實驗的方式,總結(jié)出了一種快速恢復GPT分區(qū)表,進而恢復磁盤數(shù)據(jù)的方法.實驗結(jié)果表明,這種方法確實快速、有效.然而,美中不足的是,此方法比較依賴各個分區(qū)的DBR,在DBR也被損壞時便無法工作,因此這種情況下的恢復還有待研究.