陳培德,吳建平
(云南大學 信息學院,云南 昆明 650223)
全局唯一標識GPT是globally unique identifier partition table的縮寫,其含義是“全局唯一標識磁盤分區表”[1],它是可擴展固件接口(EFI)標準的一部分[2]。GPT的出現是為了替代舊式的MBR(master boot record)[3],主要解決了MBR分區表不支持容量大于2.2 TB的分區問題[4]。
由于MBR分區最多包含4個項目,多于4分區則采用擴展分區的形式來管理,每個分區項目定義了主分區在磁盤上的位置[5]。
目前,微軟公司Windows 10使用了GPT磁盤分區格式,同時Windows 10不再支持MBR。計算機如果使用Windows 10就必須采用MBR分區格式,這樣不同分區表誤操作、誤轉換的結果是硬盤中原有的磁盤分區表丟失,磁盤中的數據不能正常讀取。在Windows 7和Windows 10用戶數量龐大的今天,這種因GPT分區表問題導致硬盤中的數據無法讀取和使用的問題較為突出[6]。
當GPT存儲磁盤出現誤操作或操作系統本身故障所造成的分區表損壞、數據不可見、不可讀的數據等問題的時候,有可能是GPT分區表的邏輯出錯,可以通過一定的技術手段,對保存在臺式機硬盤、筆記本硬盤、服務器硬盤等設備上丟失的寶貴數據進行搶救和恢復。
從整體來看,GPT磁盤主要由6大部分組成[7]。即保護MBR、GPT頭、GPT分區表、GPT分區區域(即文件系統所在區域)、GPT分區表備份和GPT頭備份[8]。大致結構如圖1所示[8](注:假設GPT磁盤的扇區號范圍為0 ~n-1,其中n為GPT磁盤的總扇區數)。

圖1 GPT磁盤的整體結構
(1)保護MBR。
保護MBR位于GPT磁盤的0號扇區[9],也是由主引導記錄、磁盤簽名、MBR分區表和結束標志4個部分組成[10-11]。在MBR分區表中,分區標志為0XEE[2],相對扇區為1,總扇區數為4 294 967 295,也就是分區總數的最大值[2],即該磁盤已經被GPT分區占用,不能再進行MBR分區。
(2)GPT頭。
GPT頭位于GPT磁盤的1號扇區[12],該扇區是在將MBR磁盤轉換成GPT磁盤后自動生成的,GPT頭定義了GPT分區各參數的基本信息[12],GPT頭也就是對整個GPT磁盤的整體描述。其定義如表1所示。

表1 GPT頭各項參數含義

續表1
(3)GPT分區表。
GPT分區表位于GPT磁盤的2~33號扇區,共占用32個扇區,每個分區表占128字節,最多可以容納128個分區表,由于第1個分區表為系統保留,所以用戶在GPT磁盤上最多可以再建立127個分區,每個分區表管理一個分區。其定義如表2所示。

表2 GPT分區表各項參數含義

表3 GPT分區類型GUID定義說明[2]
(4)分區區域。
GPT分區區域是整個GPT磁盤中最大的區域,位于GPT磁盤的中間位置,GPT分區區域的開始扇區和結束扇區由GPT頭定義[2],一般情況下,開始扇區為34號扇區,而結束扇區為GPT磁盤總扇區數減去35。該區域由多個具體的分區組成,如:微軟保留分區、EFI系統分區、LDM元數據分區、LDM數據分區、OEM分區和主分區等[2]。各分區的開始扇區和結束扇區在各分區表中均有定義。
(5)分區表備份。
一般情況下,分區表備份位于GPT磁盤的倒數33號扇區~倒數2號扇區,也是占用32個扇區,是GPT分區表位于GPT磁盤的2~33號扇區的備份。其定義如表4所示。

表4 GPT頭備份各參數含義
(6)GPT頭備份。
GPT頭備份位于GPT磁盤的倒數1號扇區,該扇區也是在將MBR磁盤轉換成GPT磁盤后自動生成的,GPT頭備份也是定義了GPT分區各參數的基本信息,但該扇區不是GPT頭的簡單備份,GPT頭備份對GPT分區各參數基本信息的定義與GPT頭對GPT分區各參數基本信息的定義稍有不同。GPT頭備份也是對整個GPT磁盤的整體描述。
(1)操作系統:Windows 7;
(2)數據恢復軟件及分析工具:WinHex 15.08。
(1)在Windows 7操作系統下,使用Windows 7的虛擬磁盤管理功能在D盤的根目錄上建立一個名為abc1.vhd的文件,文件大小為1 GB;
(2)將abc1.vhd文件附加為虛擬磁盤1,轉換成GPT磁盤;在磁盤1上依次建立6個分區,磁盤1中6個分區的容量分別為150 MB、60 MB、100 MB、180 MB、230 MB和270 MB;
(3)使用WinHex軟件打開磁盤1,將磁盤1的0號扇區以文件的形式保存,文件為“保護MBR.vhd”;
將磁盤1的1號扇區以文件的形式保存,文件為“GPT頭.vhd”;
將磁盤1的2~3號扇區以文件的形式保存,文件名為“GPT分區表.vhd”;
將磁盤1的2 097 151號扇區以文件的形式保存,文件為“GPT頭備份.vhd”;
至此,保護的MBR、GPT頭、GPT分區表、GPT頭備份的模板已制作完成。
(4)分離abc1.vhd文件。
(1)在Windows 7操作系統下,使用Windows 7的虛擬磁盤管理功能在D盤的根目錄上建立一個名為abc2.vhd的文件,文件大小為2 GB;
(2)將abc2.vhd文件附加為虛擬磁盤2,轉換成GPT磁盤;在磁盤1上依次建立4個分區,并對4個分區進行快速格式化操作,文件系統均選擇NTFS,磁盤1中4個分區依次對應4個邏輯盤情況如下:
H盤,文件系統:NTFS,容量:350 MB
I盤,文件系統:NTFS,容量:600 MB
J盤,文件系統:NTFS,容量:800 MB
K盤,文件系統:NTFS,容量:260 MB
(3)分別在H盤、I盤、J盤和K盤中存儲一些文件夾和文件;
(4)將H盤、I盤、J盤和K盤的GPT分區刪除;并將GPT磁盤轉換為MBR磁盤。
至此,實驗素材已制作完成。
(1)恢復0號扇區保護的MBR;
(2)恢復GPT頭;
(3)恢復GPT頭備份;
(4)恢復GPT分區表和GPT分區表備份。
恢復GPT分區的基本方法如下:
(1)通過計算機管理中的磁盤管理功能將MBR磁盤轉換為GPT磁盤;從而實現恢復0號扇區保護的MBR、GPT頭和GPT頭備份;
(2)由于將MBR磁盤轉換為GPT磁盤后,在2號扇區只存儲了一個微軟保留的GPT分區表,所以,GPT頭中的“GPT頭CRC32校驗和”和“GPT分區表CRC32校驗和”這兩個參數要重新計算[13];
(3)同理,GPT頭備份中的“GPT頭備份CRC32校驗和”和“GPT分區表備份CRC32校驗和”這兩個參數也要重新計算;
(4)通過WinHex的“掃描丟失分區”獲得4個邏輯盤的開始扇區號和4個邏輯盤的容量,通過4個邏輯盤的容量可以計算4個邏輯盤的總扇區數;
(5)通過4個邏輯盤的開始扇區號和總扇區數,可以計算4個邏輯盤的結束扇區號;
(6)將“GPT分區表.vhd”文件復制到GPT分區表所在扇區號,并修改4個GPT分區表中的開始扇區號和結束扇區號;
(7)通過GPT分區表恢復GPT分區表備份;
(8)通過GPT分區表計算GPT頭和GPT頭備份中的“GPT分區表CRC32校驗和”;
(9)計算GPT頭中的“GPT頭CRC32校驗和”;
(10)計算GPT頭備份中“GPT頭備份CRC32校驗和”。
通過以上操作,可以完整恢復GPT分區表、GPT分分區表備份、GPT頭和GPT頭備份。
根據恢復GPT分區的基本思路與方法,恢復GPT分區的步驟如下:
1、獲得4個邏輯盤的基本情況。
(1)在Windows 7操作系統下,啟動WinHex;
(2)文件-->打開-->選擇D盤根目錄上的abc2.vhd文件,打開D盤根目錄上的abc2.vhd文件;
(3)專家-->映象文件為磁盤,將abc2.vhd文件映像為磁盤;
(4)工具-->磁盤工具-->掃描丟失分區,可以獲得4個丟失分區的基本情況,如圖2所示;

圖2 獲得4個丟失分區的情況
(5)從圖2可以獲得4個邏輯盤的文件系統、容量和開始扇區號,填入表5中;
(6)通過各邏輯盤容量可以計算出各邏輯盤的總扇區數;
H盤總扇區數=容量*1 024*1 024/512
=350*1 024*1 024/512
=716 800
I盤總扇區數=容量*1 000*1 024*1 024/512
=0.6*1 024*1 024*1 024/512
=1 228 800
J盤總扇區數=容量*1 024*1 024*1 024/512
=0.8*1 024*1 024*1 024/512
=1 638 400
K盤總扇區數=容量*1 024*1 024/512
=260*1 024*1 024/512
=532 480
(7)通過各邏輯盤的總扇區數和DBR所在扇區號可以計算DBR備份所在扇區號;
H盤結束扇區= H盤開始扇區+H盤總扇區數-1
=65 664+716 800-1
=782 463
I盤結束扇區= I盤開始扇區+I盤總扇區數-1
=782 464+1 228 800-1
=2 011 263
J盤結束扇區= J盤開始扇區+J盤總扇區數-1
=2 011 264+1 638 400-1
=3 649 663
K盤結束扇區= K盤開始扇區+K盤總扇區數-1
=3 649 664+532 480-1
=4 182 143
將H盤、I盤、J盤和K盤的總扇區數和結束扇區號填入表5。

表5 磁盤1各邏輯盤基本情況
2、將MBR磁盤轉換為GPT磁盤。
(8)在Windows 7操作系統下,使用Windows 7的虛擬磁盤管理功能附加D盤根目錄上的abc2.vhd文件為磁盤1;
(9)將光標移動到“磁盤1 基本2 GB 聯機”處,右擊,從彈出的快捷菜單中選擇“轉換成GPT磁盤(V)”;
至此,磁盤1由MBR磁盤轉換為GPT磁盤。
(10)將光標移動到“磁盤1 基本1.97 GB 聯機”處,右擊,從彈出的快捷菜單中選擇“分離VHD”,將磁盤1分離。
3、重建4個邏輯盤GPT分區表。
(1)在Windows 7操作系統下,啟動WinHex;
(2)文件-->打開-->選擇D盤根目錄上的abc2.vhd文件,打開D盤根目錄上的abc2.vhd文件;
(3)專家-->映像文件為磁盤,將abc2.vhd文件映像為磁盤;
(4)打開“GPT分區表.vhd”文件,并全選該文件,單擊“復制”按鈕;
(5)將標移動到abc2.vhd文件的2號扇區開始位置,單擊“粘貼”按鈕;
(6)視圖-->模板管理器-->GPT Partition table,在圖3中分別輸入4個邏輯盤的開始扇區和結束扇區。

圖3 通過模版輸入4個分區的開始扇區和結束扇區
至此,GPT分區表已恢復。
4、恢復4個邏輯盤GPT分區表備份。
(7)從GPT頭可以獲得GPT分區表備份在4 194 271號扇區,將2號扇區復制到4 194 271號扇區,至此,GPT分區表備份已恢復。
5、重建GPT頭。
(8)選中2號扇區到33號扇區,即GPT分區表所在扇區號;
(9)工具-->比較Hash值-->CRC32(32Bit),可以獲得GPT分區表的CRC32校驗和為“F0E2AC5D”;GPT分區表的CRC32校驗和在GPT頭中的存儲形式采用小頭位序,占4個字節,所以,在GPT頭扇區偏移0X58~0X5B中的存儲形式為“5D AC E2 F0”;
(10)將1號扇區偏移0X58~0X5B處的值修改為“5D AC E2 F0”(注:存儲形式);
(11)將1號扇區偏移0X20~0X23處的值修改為“00 00 00 00 00”(注:存儲形式);
(12)選中1號扇區偏移0X00~0X5B這92個字節;
(13)工具-->比較Hash值-->CRC32(32Bit),可以獲得GPT頭的CRC32校驗和為“DE370F6F”;GPT頭的CRC32校驗和在GPT頭中的存儲形式采用小頭位序,占4個字節,所以,在GPT頭扇區偏移0X20~0X23中的存儲形式為“6F 0F 37 DE”;
(14)將1號扇區偏移0X20~0X23處的值修改為“6F 0F 37 DE”(注:存儲形式);然后存盤。
至此,GPT頭已恢復。
6、重建GPT頭備份。
(15)將光標移動到4 194 303號扇區,將偏移0X58~0X5B處的值修改為“5D AC E2 F0”(注:存儲形式);即修改GPT分區表備份的CRC32校驗和;
(16)將4 194 303號扇區偏移0X20~0X23處的值修改為“00 00 00 00 00”(注:存儲形式);
(17)選中4 194 303號扇區偏移0X00~0X5B,工具-->比較Hash值-->CRC32(32Bit),可以獲得GPT頭的CRC32校驗和為“7E5F9703”;
(18)將4 194 303號扇區偏移0X20~0X23處的值修改為“03 97 5F 7E”(注:存儲形式);然后存盤。
至此,GPT頭備份已恢復。
完成以上操作后,GPT磁盤中的保護MBR、GPT頭、GPT分區表、GPT分區表備份和GPT頭備份已成功恢復。通過計算機管理中的磁盤管理附加abc2.vhd后,在資源管理器中可以看到到H盤、I盤、J盤和K盤符。
如果GPT磁盤總容量小于2.2 TB,且分區總數小于4個時,也可以在硬盤0號扇區通過重建4個MBR的形式來恢復各邏輯盤中的全部數據。
由于MBR分區表存儲在0號扇區,邏輯盤的開始扇區也就是0號扇區MBR分區表中的相對扇區;根據相對扇區、總扇區數和分區標志可以得到存儲在0號扇區的4個MBR分區表如表6所示。

表6 存儲在0號扇區的4個MBR分區
使用WinHex軟件打開abc2.vhd,并映像為磁盤,將H盤、I盤、J盤和K盤的4個MBR分區填入到0號扇區偏移0X01BE~0X01FD處,如圖4所示;然后存儲并退出WinHex;即可恢復0號扇區的4個MBR分區表。

圖4 在0號扇區輸入4個分區的MBR分區表
通過計算機管理中的磁盤管理附加abc2.vhd后,在資源管理器中可以看到H盤、I盤、J盤和K盤符。
綜上所述,當GPT磁盤中的分區被刪除,并將GPT磁盤轉換為MBR磁盤后,通過掃描丟失分區功能獲得邏輯盤的開始扇區號和容量,通過容量計算各邏輯盤的總扇區數,通過各邏輯性盤的開始扇區號和總扇區數,計算出各邏輯盤的結束扇區號,通過修改GPT分區表中的開始扇區號和結扇區號,就可以恢復GPT分區表。
通過計算GPT頭中的GPT分區表CRC32校驗和與GPT頭校驗和就可以恢復GPT頭;通過計算GPT頭備份中的GPT分區表CRC32校驗和與GPT頭備份校驗和就可以恢復GPT頭備份。這樣也就可以恢復GPT磁盤中各邏輯盤的全部數據;如果GPT磁盤總容量小于2.2 TB,且分區總數小于4個時,也可以在硬盤0號扇區通過重建MBR的形式來恢復各邏輯盤中的全部數。