陳培德,吳建平,劉宏杰,白雪松,景文超
(云南大學(xué) 信息學(xué)院,云南 昆明 650223)
MBR的全稱是Master Boot Record(主引導(dǎo)記錄)[1],MBR早在1983年IBM PC DOS 2.0中就已經(jīng)提出。之所以叫“主引導(dǎo)記錄(MBR)[2]”,是因為它是存在于驅(qū)動器開始部分的一個特殊的啟動扇區(qū)[3]。這個扇區(qū)包含了已安裝的操作系統(tǒng)的啟動加載器和驅(qū)動器的邏輯分區(qū)信息。它最大支持2.2 TB的硬盤[4],和32位操作系統(tǒng)無法支持4 GB以上內(nèi)存一樣,超過此限制的硬盤容量MBR也是無法正確識別的。此外它只能分出4個主分區(qū)[5],再多的分區(qū)只能創(chuàng)建擴展邏輯分區(qū),別無它法。
GPT是Globally Unique Identifier Partition Table的縮寫,其含義是“全局唯一標識磁盤分區(qū)表”[5]。GPT的出現(xiàn)是為了替代舊式的MBR(Master Boot Record)[6],主要解決了MBR分區(qū)表不支持容量大于2.2 TB的分區(qū)[7]問題。
如果要將MBR磁盤轉(zhuǎn)換為GPT磁盤,通常做法是:在計算機管理中的磁盤管理中,先將MBR磁盤中的所有分區(qū)刪除后,才能將MBR磁盤轉(zhuǎn)換為GPT磁盤或者在DOS下通過CONVERT命令來完成,再重新建立GPT分區(qū),這樣做的結(jié)果是原來MBR分區(qū)中存儲的數(shù)據(jù)難以得到恢復(fù)。
針對這一這情況,對MBR磁盤轉(zhuǎn)換為GPT磁盤進行了大量的實驗,結(jié)果發(fā)現(xiàn)將MBR磁盤轉(zhuǎn)換為GPT磁盤后,通過重新計算GPT頭中的CRC32校驗和,通過重建GPT分區(qū)的形式就可以恢復(fù)GPT分區(qū)表,最后通過DBR備份恢復(fù)DBR。
(1)實驗環(huán)境。
(i)操作系統(tǒng):Windows 10;
(ii硬盤:虛擬硬盤;
(iii)數(shù)據(jù)分析及恢復(fù)工具:WinHex 15.08。
(2)制作實驗素材。
(i)制作MBR磁盤。
制作MBR磁盤的操作步驟如下:
步驟1:在Windows 10操作系統(tǒng)下,使用Windows 10的虛擬磁盤管理功能在D盤的根目錄上建立一個名為abcd1.vhd的文件,文件大小為1 GB。
步驟2:將abcd1.vhd文件附加為虛擬磁盤1,初始為MBR磁盤;在磁盤1上依次建立4個分區(qū),并分別對4個分區(qū)進行(快速)格式化操作,文件系統(tǒng)選擇NTFS,磁盤1中4個MBR分區(qū)依次對應(yīng)4個邏輯盤情況如下:
H盤,文件系統(tǒng):NTFS,容量:100 MB;
I盤,文件系統(tǒng):NTFS,容量:200 MB;
J盤,文件系統(tǒng):NTFS,容量:300 MB;
K盤,文件系統(tǒng):NTFS,容量:422 MB。
步驟3:分別復(fù)制一定數(shù)量的文件夾和文件到這4個邏輯盤中。
至此,MBR磁盤素材文件制作完成。0號扇區(qū)4個MBR分區(qū)表的存儲形式如圖1所示。
圖1 0號扇區(qū)存儲的4個MBR分區(qū)表
步驟4:在計算機管理的磁盤管理中將4個MBR分區(qū)刪除,4個MBR分區(qū)刪除后,0號扇區(qū)偏移地址0X1BE~0X1FE處存儲的4個MBR分區(qū)表的值已經(jīng)變?yōu)?4個“00”。
(ii)制作GPT頭、GPT頭備份與GPT分區(qū)表模板。
制作GPT頭、GPT頭備份與GPT分區(qū)表模板操作步驟如下:
步驟1:在Windows 10操作系統(tǒng)下,使用Windows 10的虛擬磁盤管理功能在D盤的根目錄上建立一個名為abcd2.vhd的文件,文件大小為500 MB。
步驟2:將abcd2.vhd文件附加為虛擬磁盤2,初始為GPT磁盤;在磁盤2上依次建立4個分區(qū),并分別對4個分區(qū)進行(快速)格式化操作,文件系統(tǒng)選擇NTFS,磁盤1中4個分區(qū)依次對應(yīng)4個邏輯盤情況如下:
L盤,文件系統(tǒng):NTFS,容量:100 MB;
M盤,文件系統(tǒng):NTFS,容量:100 MB;
N盤,文件系統(tǒng):NTFS,容量:100 MB;
O盤,文件系統(tǒng):NTFS,容量:100 MB。
步驟3:將該磁盤的0號扇區(qū)以文件的形式存儲,文件名為0_sector.vhd;即保護的MBR模板已制作完成。
步驟4:將該磁盤的1號扇區(qū)以文件的形式存儲,文件名為GPT_Head.vhd;即GPT頭模板已制作完成。
步驟5:將該磁盤的2號和3號扇區(qū)以文件的形式存儲,文件名為GPT_Partition.vhd;即GPT分區(qū)表模板已制作完成。
步驟6:將該磁盤的倒數(shù)1號扇區(qū)以文件的形式存儲,文件名為GPT_Head_back.vhd;即GPT頭備份模板已制作完成。
至此,GPT頭、GPT頭備份與GPT分區(qū)表素材文件制作完成。
由于4個MBR分區(qū)表均存儲在磁盤1的0號扇區(qū),分區(qū)表中的相對扇區(qū)也就是分區(qū)的開始扇區(qū)號,從磁盤1的0號扇區(qū)可以知道,4個分區(qū)的開始扇區(qū)和總扇區(qū)數(shù),從而可以計算出4個分區(qū)的結(jié)束扇區(qū)號,如下所示:
分區(qū)開始扇區(qū)號結(jié)束扇區(qū)號總扇區(qū)數(shù)容量分區(qū)1128204927204800100 MB分區(qū)2204928614527409600200 MB分區(qū)36145281228927614400300 MB分區(qū)412289282093183864256422 MB
根據(jù)4個分區(qū)的基本情況,可以畫出4個分區(qū)對應(yīng)4個邏輯盤在整個硬盤的分布結(jié)構(gòu),如圖2所示。
圖2 4個邏輯盤在整個硬盤中的分布
從整體來看,GPT磁盤主要由6大部分組成,即保護MBR、GPT頭、GPT分區(qū)表、GPT分區(qū)區(qū)域(即文件系統(tǒng)所在區(qū)域)、GPT分區(qū)表備份和GPT頭備份[8]。大致結(jié)構(gòu)如圖3所示(注:假設(shè)GPT磁盤的扇區(qū)號范圍為0 ~n-1,其中n為GPT磁盤的總扇區(qū)數(shù))。
圖3 GPT磁盤整體結(jié)構(gòu)
(1)保護MBR。
保護MBR位于GPT磁盤的0號扇區(qū),也是由主引導(dǎo)記錄、磁盤簽名、MBR分區(qū)表和結(jié)束標志4個部分組成[7]。MBR分區(qū)表必須位于0號扇區(qū)偏移0X01BE~0X01CD處,分區(qū)標志為0XEE。主要是用于與MBR磁盤的區(qū)別,即該磁盤為GPT磁盤。
(2)GPT頭。
GPT頭位于GPT磁盤的1號扇區(qū)[9],該扇區(qū)是在轉(zhuǎn)換成GPT磁盤后自動生成的,GPT頭定義了GPT分區(qū)各參數(shù)的基本信息,GPT頭中定義的各參數(shù)如下:
字節(jié)偏移長度(字節(jié))內(nèi) 容0X008 簽名,固定為“EFI PART”0X084版本號0X0C4GPT頭總字節(jié)數(shù)0X104GPT頭CRC32校驗和0X144保留,必須是000X18 8GPT頭所在扇區(qū)號0X208 GPT頭備份所在扇區(qū)號0X288GPT分區(qū)區(qū)域開始扇區(qū)號0X308GPT分區(qū)區(qū)域結(jié)束扇區(qū)號0X3816硬盤GUID0X488 GPT分區(qū)表開始扇區(qū)號0X504最多容納GPT分區(qū)表的數(shù)量0X544每個GPT分區(qū)表項字節(jié)數(shù)0X584分區(qū)表CRC32校驗和0X5C420保留,一般為00
說明:
(i)GPT頭總字節(jié)數(shù):GPT頭位于GPT磁盤的1號扇區(qū),指GPT頭在1號扇區(qū)所占字節(jié)總數(shù),一般為92字節(jié),即;
(ii)GPT頭CRC32校驗和:也就是將該處的值填為“00 00 00 00”后,GPT頭扇區(qū)偏移0X00~0X5B這92個字節(jié)的CRC32校驗和;
(iii)分區(qū)表CRC32校驗和:一般情況下,GPT分區(qū)表所占扇區(qū)號范圍為2~33,即2~33號扇區(qū)的CRC32校驗和。
注:計算GPT分區(qū)表所占扇區(qū)數(shù)方法如下:
GPT分區(qū)表所占字節(jié)數(shù)=最多容納GPT分區(qū)表的數(shù)量×每個GPT分區(qū)表項字節(jié)數(shù)
GPT分區(qū)表所占扇區(qū)數(shù)=
GPT分區(qū)表所占字節(jié)數(shù)÷512
(3)GPT分區(qū)表。
在GPT分區(qū)中,一般情況下,最多容納GPT分區(qū)表的數(shù)量為128,而每個GPT分區(qū)表占128個字節(jié)。
GPT分區(qū)表所占字節(jié)數(shù)=最多容納GPT分區(qū)表的數(shù)量×每個GPT分區(qū)表項字節(jié)數(shù)
=128×128
=16 384
GPT分區(qū)表所占扇區(qū)數(shù)=
GPT分區(qū)表所占字節(jié)數(shù)÷512
=16 384÷512
=32
GPT分區(qū)表的開始扇區(qū)號為2,共占用32個扇區(qū)[10],所以GPT分區(qū)表位于GPT磁盤的2 ~ 33號扇區(qū),每個分區(qū)表占為128字節(jié),最多可以容納128個分區(qū)表,由于第1個分區(qū)表為系統(tǒng)保留,所以用戶在GPT磁盤上最多可以建立127個分區(qū),每個分區(qū)表管理一個分區(qū)[11]。GPT分區(qū)表各參數(shù)如下所示:
字節(jié)偏移長度(字節(jié))內(nèi) 容0X0016分區(qū)類型GUID0X1016分區(qū)GUID0X208該分區(qū)開始扇區(qū)號0X288該分區(qū)結(jié)束扇區(qū)號0X308屬性標簽0X3872分區(qū)名(Unicode碼)
(4)分區(qū)區(qū)域。
GPT分區(qū)區(qū)域是整個GPT磁盤中最大的區(qū)域,位于GPT磁盤的中間位置[12],GPT分區(qū)區(qū)域的開始扇區(qū)和結(jié)束扇區(qū)由GPT頭定義,由于GPT分區(qū)表的結(jié)束扇區(qū)號為33,一般情況下,GPT分區(qū)區(qū)域開始扇區(qū)號為34,而結(jié)束扇區(qū)號為GPT磁盤總扇區(qū)數(shù)減去35。該區(qū)域由多個具體的分區(qū)組成,如:微軟保留分區(qū)、EFI系統(tǒng)分區(qū)、LDM元數(shù)據(jù)分區(qū)、LDM數(shù)據(jù)分區(qū)、OEM分區(qū)和主分區(qū)等。各分區(qū)的開始扇區(qū)和結(jié)束扇區(qū)在各分區(qū)表中均有定義。
(5)分區(qū)表備份。
GPT分區(qū)區(qū)域結(jié)束后的下一個扇區(qū)為GPT分區(qū)表備份的開始扇區(qū)[13],一般情況下,GPT分區(qū)表備份位于GPT磁盤的倒數(shù)33號扇區(qū)~倒數(shù)2號扇區(qū),也是占用32個扇區(qū),是GPT分區(qū)表位于GPT磁盤2~33號扇區(qū)的備份。
(6)GPT頭備份。
GPT頭備份位于GPT磁盤的倒數(shù)1號扇區(qū),該扇區(qū)也是在轉(zhuǎn)換成GPT磁盤后自動生成的,GPT頭備份也是定義了GPT分區(qū)各參數(shù)的基本信息[14],但該扇區(qū)不是GPT頭的簡單備份,GPT頭備份對GPT分區(qū)各參數(shù)基本信息的定義與GPT頭對GPT分區(qū)各參數(shù)基本信息的定義稍有不同,GPT頭備份對分區(qū)各參數(shù)基本信息的定義如下:
字節(jié)偏移長度(字節(jié))內(nèi) 容0X008簽名,固定為“EFI PART”0X084版本號0X0C4GPT頭備份總字節(jié)數(shù)0X104GPT頭備份CRC32校驗和0X144保留,必須是000X188GPT頭備份所在扇區(qū)號0X208GPT頭所在扇區(qū)號0X288GPT分區(qū)區(qū)域開始扇區(qū)號0X308GPT分區(qū)區(qū)域結(jié)束扇區(qū)號0X3816硬盤GUID0X488GPT分區(qū)表備份開始扇區(qū)號0X504最多容納分區(qū)表的數(shù)量0X544每個分區(qū)表項字節(jié)數(shù)0X584分區(qū)表備份CRC32校驗和0X5C420保留,一般為00
說明:
(i)GPT頭備份總字節(jié)數(shù):指GPT頭備份所占字節(jié)總數(shù),一般為92字節(jié),即扇區(qū)偏移為0X00~0X5B;
(ii)GPT頭備份CRC32校驗和:也就是將該處的值填為“00 00 00 00”后,GPT頭備份扇區(qū)偏移0X00~0X5B這92個字節(jié)的CRC32校驗和;
(iii)分區(qū)表備份CRC32校驗和:GPT分區(qū)表備份所占扇區(qū)號范圍為n-34~n-3,即n-34~n-3號扇區(qū)的CRC32校驗和。與GPT分區(qū)表CRC32校驗和相同。
從GPT磁盤的整體結(jié)構(gòu)可知,要將MBR磁盤轉(zhuǎn)換為GPT磁盤,基本思路如下:
(1)將0號扇區(qū)轉(zhuǎn)變?yōu)楸WoMBR;
(2)將1號扇區(qū)轉(zhuǎn)變?yōu)镚PT頭;
(3)將GPT分區(qū)表存儲在2~33號扇區(qū);
(4)將GPT分區(qū)表備份存儲在n-34~n-3號扇區(qū);
(5)將GPT頭備份存儲在n-2號扇區(qū)。
將MBR磁盤轉(zhuǎn)換為GPT磁盤的基本方法如下:
(1)將0號扇區(qū)偏移0X01BE~0X01CD的MBR分區(qū)表用“00 00 02 00 EE FF FF FF 01 00 00 00 FF FF FF FF”來填充,將0號扇區(qū)偏移0X01CE~0X01FD存儲的3個MBR分區(qū)表的位置用48個“00”來填充,將0號扇區(qū)偏移0X01FE~0X01FF的用“55 AA”(存儲形式)來填充;即可將0號扇區(qū)轉(zhuǎn)變?yōu)楸Wo的MBR[15];
(2)計算GPT分區(qū)表中各分區(qū)的開始扇區(qū)號和結(jié)束扇區(qū)號,將GPT分區(qū)表模板復(fù)制到GPT分區(qū)所在扇區(qū)號,并修改各GPT分區(qū)表的開始扇區(qū)號和結(jié)束扇區(qū)號;
(3)計算GPT頭中的GPT頭備份所在扇區(qū)號、GPT分區(qū)區(qū)域結(jié)束扇區(qū)號、GPT分區(qū)表CRC32校驗和和GPT頭CRC32校驗和這4個參數(shù);將GPT頭模板復(fù)制到GPT頭所在扇區(qū)號,并修改這4個參數(shù);
(4)將GPT分區(qū)表復(fù)制到GPT分區(qū)表備份所在扇區(qū)號;
(5)計算GPT頭備份中GPT頭備份所在扇區(qū)號、GPT頭備份CRC32校驗和、GPT分區(qū)區(qū)域結(jié)束扇區(qū)號、GPT分區(qū)表備份開始扇區(qū)號和GPT分區(qū)表備份CRC32校驗和這5個參數(shù)。將GPT頭備份模板復(fù)制到GPT頭備份所在扇區(qū)號,并修改這5個參數(shù)。
MBR磁盤轉(zhuǎn)換為GPT磁盤的操作步驟如下:
步驟1:在Windows 10操作系統(tǒng)下,使用Windows 10的虛擬磁盤管理功能附加D盤根目錄的abcd1.vhd文件;成為磁盤1。
步驟2:啟動WinHex,工具-->打開磁盤,在Edit Disk窗口的Physical Media下選擇“ HD1:Msft Virtual Disk(1.0 GB)”。
步驟3:工具-->磁盤工具-->掃描丟失分區(qū)后,如圖4所示。
圖4 4個分區(qū)的基本情況
從圖4可以得到,4個分區(qū)的開始扇區(qū)號,由于4個MBR分區(qū)的劃分是尾首相連,可以計算出前3個GPT分區(qū)的結(jié)束扇區(qū)號分別是204927、614527和1228927,最后1個分區(qū)(即第4個分區(qū))的結(jié)束扇區(qū)號,可以通過容量計算總扇區(qū)數(shù),再通過開始扇區(qū)號和總扇區(qū)數(shù)獲得:
總扇區(qū)數(shù)=容量×1 024×1 024÷512=
422×1 024×1 024 ÷512=
864 256
結(jié)束扇區(qū)號=開始扇區(qū)號+總扇區(qū)數(shù)-1=
1 228 928+864 256-1=
2 093 183
也可以依據(jù)NTFS_DBR備份的特征值,通過查找的方式獲得第4個GPT分區(qū)的結(jié)束扇區(qū)號為2093183。
4個GPT分區(qū)的開始扇區(qū)號和結(jié)束扇區(qū)號如下所示:
分區(qū)開始扇區(qū)號結(jié)束扇區(qū)號分區(qū)1128204927分區(qū)2204928614527分區(qū)36145281228927分區(qū)412289282093183
根據(jù)磁盤1的總扇區(qū)數(shù),可以計算出GPT分區(qū)表存儲在2~33號扇區(qū),而GPT分區(qū)表備份存儲在2097119 ~ 2097150號扇區(qū)。
步驟4:打開GPT_Partition.vhd文件,并選中第2個至第5個GPT分區(qū)表,單擊“復(fù)制”按鈕,將光標移動到磁盤1的2號扇區(qū)的開始位置處,單擊“粘貼”按鈕。
步驟5:將光標移動到2號扇區(qū),視圖—>模板管理器,在模板管理器窗口中依次輸入4個分區(qū)表的開始扇區(qū)號和結(jié)束扇區(qū)號。如圖5所示:單擊保存按鈕。至此,GPT分區(qū)表已成功恢復(fù)。
圖5 依次輸入4個分區(qū)的開始扇區(qū)號和結(jié)束扇區(qū)號
步驟6:將2號扇區(qū)復(fù)制到2097119號扇區(qū),至此,GPT分區(qū)表備份已經(jīng)成功恢復(fù)。
步驟7:將0號扇區(qū)偏移0X01BE~0X01CD的MBR分區(qū)表用“00 00 02 00 EE FF FF FF 01 00 00 00 FF FF FF FF”來填充,單擊“保存”按鈕。至此,保護的MBR已恢復(fù)。
步驟8:打開GPT_Head.vhd文件,全選,單擊“復(fù)制”按鈕,將光標移動到磁盤1的1號扇區(qū)開始位置,單擊“粘貼”按鈕,單擊“保存”按鈕。
通過計算得到GPT頭中參數(shù)如下:
GPT頭備份所在扇區(qū)號為2097151;在GPT頭中的存儲形式為“FF FF 1F 00”;
GPT分區(qū)區(qū)域結(jié)束扇區(qū)號在2097118;在GPT頭中的存儲形式為“DE FF 1F 00”;
GPT分區(qū)表CRC32校驗和為348F57C2;在GPT頭中的存儲形式為“C2 57 8F 34”。
步驟9:修改GPT頭中的GPT頭備份所在扇區(qū)號、GPT分區(qū)區(qū)域結(jié)束扇區(qū)和GPT分區(qū)表CRC32校驗和這三個參數(shù);然后存盤。
步驟10:將GPT頭中的GPT頭CRC32校驗和存儲形式填充為“00 00 00 00”,然后選中扇區(qū)偏移地址0X00~0X05B處重新計算GPT頭的CRC32校驗和。結(jié)果為“4EEFA08A”,存儲形式為“8A A0 EF 4E”。將GPT頭中的GPT頭CRC32校驗和的存儲形式修改為“8A A0 EF 4E”;然后存盤;至此,GPT頭已轉(zhuǎn)換完成。
步驟11:打開GPT_Head_backup.vhd文件,全選,單擊“復(fù)制”按鈕,將光標移動到磁盤1的2097151號扇區(qū)開始位置,單擊“粘貼”按鈕,單擊“保存”按鈕。
通過計算得到GPT頭備份中參數(shù)如下:
GPT頭備份所在扇區(qū)號為2097151;在GPT頭備份中的存儲形式為“FF FF 1F 00”;
GPT分區(qū)區(qū)域結(jié)束扇區(qū)號在2097118;在GPT頭備份中的存儲形式為“DE FF 1F 00”;
GPT分區(qū)表備份CRC32校驗和為348F57C2;在GPT頭備份中的存儲形式為“C2 57 8F 34”;注:GPT分區(qū)表備份與GPT分區(qū)表相同,所以,CRC32校驗和也相同;
GPT分區(qū)表備份開始扇區(qū)號為2097119,在GPT頭備份中的存儲形式為“DF FF 1F 00”。
步驟12:修改GPT頭備份中的GPT頭備份所在扇區(qū)號、GPT分區(qū)區(qū)域結(jié)束扇區(qū)、GPT分區(qū)表備分CRC32校驗和與GPT頭備份所在扇區(qū)號這三個參數(shù);然后存盤。
步驟13:將GPT頭備份中的GPT頭備份CRC32校驗和存儲形式填充為“00 00 00 00”,然后選中扇區(qū)偏移地址0X00~0X05B處重新計算GPT頭備份的CRC32校驗和。結(jié)果為“D615D156”,存儲形式為“56 D1 15 D6”。將GPT頭中的GPT頭CRC32校驗和的存儲形式修改為“56 D1 15 C6”;然后存盤;至此,GPT頭備份已轉(zhuǎn)換完成。
將0號轉(zhuǎn)換為保護的MBR;將GPT分區(qū)模板復(fù)制到GPT分區(qū)表所在扇區(qū)號,并修改各分區(qū)的開始扇區(qū)號和結(jié)束扇區(qū)號,完成GPT分區(qū)表的恢復(fù);將GPT分區(qū)表復(fù)制到GPT分區(qū)表備份所在扇區(qū);重新計算GPT頭中的GPT頭CRC32校驗和、GPT頭備份所在扇區(qū)號、GPT分區(qū)區(qū)域結(jié)束扇區(qū)號、GPT分區(qū)表CRC32校驗和這4個參數(shù);重新計算GPT頭備份中的GPT頭備份CRC32校驗和、GPT頭備份所在扇區(qū)號、GPT分區(qū)區(qū)域結(jié)束扇區(qū)號、GPT分區(qū)表備份開始扇區(qū)號和GPT分區(qū)表備份CRC32校驗和這5個參數(shù)。通過這種方法成功實現(xiàn)MBR磁盤轉(zhuǎn)換為GPT磁盤。