MBR磁盘转换为GPT磁盘的研究与实现
2022-08-02陈培德吴建平刘宏杰白雪松景文超
陈培德,吴建平,刘宏杰,白雪松,景文超
(云南大学 信息学院,云南 昆明 650223)
0 引 言
MBR的全称是Master Boot Record(主引导记录)[1],MBR早在1983年IBM PC DOS 2.0中就已经提出。之所以叫“主引导记录(MBR)[2]”,是因为它是存在于驱动器开始部分的一个特殊的启动扇区[3]。这个扇区包含了已安装的操作系统的启动加载器和驱动器的逻辑分区信息。它最大支持2.2 TB的硬盘[4],和32位操作系统无法支持4 GB以上内存一样,超过此限制的硬盘容量MBR也是无法正确识别的。此外它只能分出4个主分区[5],再多的分区只能创建扩展逻辑分区,别无它法。
GPT是Globally Unique Identifier Partition Table的缩写,其含义是“全局唯一标识磁盘分区表”[5]。GPT的出现是为了替代旧式的MBR(Master Boot Record)[6],主要解决了MBR分区表不支持容量大于2.2 TB的分区[7]问题。
如果要将MBR磁盘转换为GPT磁盘,通常做法是:在计算机管理中的磁盘管理中,先将MBR磁盘中的所有分区删除后,才能将MBR磁盘转换为GPT磁盘或者在DOS下通过CONVERT命令来完成,再重新建立GPT分区,这样做的结果是原来MBR分区中存储的数据难以得到恢复。
针对这一这情况,对MBR磁盘转换为GPT磁盘进行了大量的实验,结果发现将MBR磁盘转换为GPT磁盘后,通过重新计算GPT头中的CRC32校验和,通过重建GPT分区的形式就可以恢复GPT分区表,最后通过DBR备份恢复DBR。
1 实验环境与制作实验素材
(1)实验环境。
(i)操作系统:Windows 10;
(ii硬盘:虚拟硬盘;
(iii)数据分析及恢复工具:WinHex 15.08。
(2)制作实验素材。
(i)制作MBR磁盘。
制作MBR磁盘的操作步骤如下:
步骤1:在Windows 10操作系统下,使用Windows 10的虚拟磁盘管理功能在D盘的根目录上建立一个名为abcd1.vhd的文件,文件大小为1 GB。
步骤2:将abcd1.vhd文件附加为虚拟磁盘1,初始为MBR磁盘;在磁盘1上依次建立4个分区,并分别对4个分区进行(快速)格式化操作,文件系统选择NTFS,磁盘1中4个MBR分区依次对应4个逻辑盘情况如下:
H盘,文件系统:NTFS,容量:100 MB;
I盘,文件系统:NTFS,容量:200 MB;
J盘,文件系统:NTFS,容量:300 MB;
K盘,文件系统:NTFS,容量:422 MB。
步骤3:分别复制一定数量的文件夹和文件到这4个逻辑盘中。
至此,MBR磁盘素材文件制作完成。0号扇区4个MBR分区表的存储形式如图1所示。
图1 0号扇区存储的4个MBR分区表
步骤4:在计算机管理的磁盘管理中将4个MBR分区删除,4个MBR分区删除后,0号扇区偏移地址0X1BE~0X1FE处存储的4个MBR分区表的值已经变为64个“00”。
(ii)制作GPT头、GPT头备份与GPT分区表模板。
制作GPT头、GPT头备份与GPT分区表模板操作步骤如下:
步骤1:在Windows 10操作系统下,使用Windows 10的虚拟磁盘管理功能在D盘的根目录上建立一个名为abcd2.vhd的文件,文件大小为500 MB。
步骤2:将abcd2.vhd文件附加为虚拟磁盘2,初始为GPT磁盘;在磁盘2上依次建立4个分区,并分别对4个分区进行(快速)格式化操作,文件系统选择NTFS,磁盘1中4个分区依次对应4个逻辑盘情况如下:
L盘,文件系统:NTFS,容量:100 MB;
M盘,文件系统:NTFS,容量:100 MB;
N盘,文件系统:NTFS,容量:100 MB;
O盘,文件系统:NTFS,容量:100 MB。
步骤3:将该磁盘的0号扇区以文件的形式存储,文件名为0_sector.vhd;即保护的MBR模板已制作完成。
步骤4:将该磁盘的1号扇区以文件的形式存储,文件名为GPT_Head.vhd;即GPT头模板已制作完成。
步骤5:将该磁盘的2号和3号扇区以文件的形式存储,文件名为GPT_Partition.vhd;即GPT分区表模板已制作完成。
步骤6:将该磁盘的倒数1号扇区以文件的形式存储,文件名为GPT_Head_back.vhd;即GPT头备份模板已制作完成。
至此,GPT头、GPT头备份与GPT分区表素材文件制作完成。
2 MBR磁盘整体布局
由于4个MBR分区表均存储在磁盘1的0号扇区,分区表中的相对扇区也就是分区的开始扇区号,从磁盘1的0号扇区可以知道,4个分区的开始扇区和总扇区数,从而可以计算出4个分区的结束扇区号,如下所示:
分区开始扇区号结束扇区号总扇区数容量分区1128204927204800100 MB分区2204928614527409600200 MB分区36145281228927614400300 MB分区412289282093183864256422 MB
根据4个分区的基本情况,可以画出4个分区对应4个逻辑盘在整个硬盘的分布结构,如图2所示。
图2 4个逻辑盘在整个硬盘中的分布
3 GPT磁盘整体结构
从整体来看,GPT磁盘主要由6大部分组成,即保护MBR、GPT头、GPT分区表、GPT分区区域(即文件系统所在区域)、GPT分区表备份和GPT头备份[8]。大致结构如图3所示(注:假设GPT磁盘的扇区号范围为0 ~n-1,其中n为GPT磁盘的总扇区数)。
图3 GPT磁盘整体结构
(1)保护MBR。
保护MBR位于GPT磁盘的0号扇区,也是由主引导记录、磁盘签名、MBR分区表和结束标志4个部分组成[7]。MBR分区表必须位于0号扇区偏移0X01BE~0X01CD处,分区标志为0XEE。主要是用于与MBR磁盘的区别,即该磁盘为GPT磁盘。
(2)GPT头。
GPT头位于GPT磁盘的1号扇区[9],该扇区是在转换成GPT磁盘后自动生成的,GPT头定义了GPT分区各参数的基本信息,GPT头中定义的各参数如下:
字节偏移长度(字节)内 容0X008 签名,固定为“EFI PART”0X084版本号0X0C4GPT头总字节数0X104GPT头CRC32校验和0X144保留,必须是000X18 8GPT头所在扇区号0X208 GPT头备份所在扇区号0X288GPT分区区域开始扇区号0X308GPT分区区域结束扇区号0X3816硬盘GUID0X488 GPT分区表开始扇区号0X504最多容纳GPT分区表的数量0X544每个GPT分区表项字节数0X584分区表CRC32校验和0X5C420保留,一般为00
说明:
(i)GPT头总字节数:GPT头位于GPT磁盘的1号扇区,指GPT头在1号扇区所占字节总数,一般为92字节,即;
(ii)GPT头CRC32校验和:也就是将该处的值填为“00 00 00 00”后,GPT头扇区偏移0X00~0X5B这92个字节的CRC32校验和;
(iii)分区表CRC32校验和:一般情况下,GPT分区表所占扇区号范围为2~33,即2~33号扇区的CRC32校验和。
注:计算GPT分区表所占扇区数方法如下:
GPT分区表所占字节数=最多容纳GPT分区表的数量×每个GPT分区表项字节数
GPT分区表所占扇区数=
GPT分区表所占字节数÷512
(3)GPT分区表。
在GPT分区中,一般情况下,最多容纳GPT分区表的数量为128,而每个GPT分区表占128个字节。
GPT分区表所占字节数=最多容纳GPT分区表的数量×每个GPT分区表项字节数
=128×128
=16 384
GPT分区表所占扇区数=
GPT分区表所占字节数÷512
=16 384÷512
=32
GPT分区表的开始扇区号为2,共占用32个扇区[10],所以GPT分区表位于GPT磁盘的2 ~ 33号扇区,每个分区表占为128字节,最多可以容纳128个分区表,由于第1个分区表为系统保留,所以用户在GPT磁盘上最多可以建立127个分区,每个分区表管理一个分区[11]。GPT分区表各参数如下所示:
字节偏移长度(字节)内 容0X0016分区类型GUID0X1016分区GUID0X208该分区开始扇区号0X288该分区结束扇区号0X308属性标签0X3872分区名(Unicode码)
(4)分区区域。
GPT分区区域是整个GPT磁盘中最大的区域,位于GPT磁盘的中间位置[12],GPT分区区域的开始扇区和结束扇区由GPT头定义,由于GPT分区表的结束扇区号为33,一般情况下,GPT分区区域开始扇区号为34,而结束扇区号为GPT磁盘总扇区数减去35。该区域由多个具体的分区组成,如:微软保留分区、EFI系统分区、LDM元数据分区、LDM数据分区、OEM分区和主分区等。各分区的开始扇区和结束扇区在各分区表中均有定义。
(5)分区表备份。
GPT分区区域结束后的下一个扇区为GPT分区表备份的开始扇区[13],一般情况下,GPT分区表备份位于GPT磁盘的倒数33号扇区~倒数2号扇区,也是占用32个扇区,是GPT分区表位于GPT磁盘2~33号扇区的备份。
(6)GPT头备份。
GPT头备份位于GPT磁盘的倒数1号扇区,该扇区也是在转换成GPT磁盘后自动生成的,GPT头备份也是定义了GPT分区各参数的基本信息[14],但该扇区不是GPT头的简单备份,GPT头备份对GPT分区各参数基本信息的定义与GPT头对GPT分区各参数基本信息的定义稍有不同,GPT头备份对分区各参数基本信息的定义如下:
字节偏移长度(字节)内 容0X008签名,固定为“EFI PART”0X084版本号0X0C4GPT头备份总字节数0X104GPT头备份CRC32校验和0X144保留,必须是000X188GPT头备份所在扇区号0X208GPT头所在扇区号0X288GPT分区区域开始扇区号0X308GPT分区区域结束扇区号0X3816硬盘GUID0X488GPT分区表备份开始扇区号0X504最多容纳分区表的数量0X544每个分区表项字节数0X584分区表备份CRC32校验和0X5C420保留,一般为00
说明:
(i)GPT头备份总字节数:指GPT头备份所占字节总数,一般为92字节,即扇区偏移为0X00~0X5B;
(ii)GPT头备份CRC32校验和:也就是将该处的值填为“00 00 00 00”后,GPT头备份扇区偏移0X00~0X5B这92个字节的CRC32校验和;
(iii)分区表备份CRC32校验和:GPT分区表备份所占扇区号范围为n-34~n-3,即n-34~n-3号扇区的CRC32校验和。与GPT分区表CRC32校验和相同。
4 MBR磁盘转换为GPT磁盘的基本思路
从GPT磁盘的整体结构可知,要将MBR磁盘转换为GPT磁盘,基本思路如下:
(1)将0号扇区转变为保护MBR;
(2)将1号扇区转变为GPT头;
(3)将GPT分区表存储在2~33号扇区;
(4)将GPT分区表备份存储在n-34~n-3号扇区;
(5)将GPT头备份存储在n-2号扇区。
5 MBR磁盘转换为GPT磁盘的基本方法
将MBR磁盘转换为GPT磁盘的基本方法如下:
(1)将0号扇区偏移0X01BE~0X01CD的MBR分区表用“00 00 02 00 EE FF FF FF 01 00 00 00 FF FF FF FF”来填充,将0号扇区偏移0X01CE~0X01FD存储的3个MBR分区表的位置用48个“00”来填充,将0号扇区偏移0X01FE~0X01FF的用“55 AA”(存储形式)来填充;即可将0号扇区转变为保护的MBR[15];
(2)计算GPT分区表中各分区的开始扇区号和结束扇区号,将GPT分区表模板复制到GPT分区所在扇区号,并修改各GPT分区表的开始扇区号和结束扇区号;
(3)计算GPT头中的GPT头备份所在扇区号、GPT分区区域结束扇区号、GPT分区表CRC32校验和和GPT头CRC32校验和这4个参数;将GPT头模板复制到GPT头所在扇区号,并修改这4个参数;
(4)将GPT分区表复制到GPT分区表备份所在扇区号;
(5)计算GPT头备份中GPT头备份所在扇区号、GPT头备份CRC32校验和、GPT分区区域结束扇区号、GPT分区表备份开始扇区号和GPT分区表备份CRC32校验和这5个参数。将GPT头备份模板复制到GPT头备份所在扇区号,并修改这5个参数。
6 MBR磁盘转换为GPT磁盘的操作步骤
MBR磁盘转换为GPT磁盘的操作步骤如下:
步骤1:在Windows 10操作系统下,使用Windows 10的虚拟磁盘管理功能附加D盘根目录的abcd1.vhd文件;成为磁盘1。
步骤2:启动WinHex,工具-->打开磁盘,在Edit Disk窗口的Physical Media下选择“ HD1:Msft Virtual Disk(1.0 GB)”。
步骤3:工具-->磁盘工具-->扫描丢失分区后,如图4所示。
图4 4个分区的基本情况
从图4可以得到,4个分区的开始扇区号,由于4个MBR分区的划分是尾首相连,可以计算出前3个GPT分区的结束扇区号分别是204927、614527和1228927,最后1个分区(即第4个分区)的结束扇区号,可以通过容量计算总扇区数,再通过开始扇区号和总扇区数获得:
总扇区数=容量×1 024×1 024÷512=
422×1 024×1 024 ÷512=
864 256
结束扇区号=开始扇区号+总扇区数-1=
1 228 928+864 256-1=
2 093 183
也可以依据NTFS_DBR备份的特征值,通过查找的方式获得第4个GPT分区的结束扇区号为2093183。
4个GPT分区的开始扇区号和结束扇区号如下所示:
分区开始扇区号结束扇区号分区1128204927分区2204928614527分区36145281228927分区412289282093183
根据磁盘1的总扇区数,可以计算出GPT分区表存储在2~33号扇区,而GPT分区表备份存储在2097119 ~ 2097150号扇区。
步骤4:打开GPT_Partition.vhd文件,并选中第2个至第5个GPT分区表,单击“复制”按钮,将光标移动到磁盘1的2号扇区的开始位置处,单击“粘贴”按钮。
步骤5:将光标移动到2号扇区,视图—>模板管理器,在模板管理器窗口中依次输入4个分区表的开始扇区号和结束扇区号。如图5所示:单击保存按钮。至此,GPT分区表已成功恢复。
图5 依次输入4个分区的开始扇区号和结束扇区号
步骤6:将2号扇区复制到2097119号扇区,至此,GPT分区表备份已经成功恢复。
步骤7:将0号扇区偏移0X01BE~0X01CD的MBR分区表用“00 00 02 00 EE FF FF FF 01 00 00 00 FF FF FF FF”来填充,单击“保存”按钮。至此,保护的MBR已恢复。
步骤8:打开GPT_Head.vhd文件,全选,单击“复制”按钮,将光标移动到磁盘1的1号扇区开始位置,单击“粘贴”按钮,单击“保存”按钮。
通过计算得到GPT头中参数如下:
GPT头备份所在扇区号为2097151;在GPT头中的存储形式为“FF FF 1F 00”;
GPT分区区域结束扇区号在2097118;在GPT头中的存储形式为“DE FF 1F 00”;
GPT分区表CRC32校验和为348F57C2;在GPT头中的存储形式为“C2 57 8F 34”。
步骤9:修改GPT头中的GPT头备份所在扇区号、GPT分区区域结束扇区和GPT分区表CRC32校验和这三个参数;然后存盘。
步骤10:将GPT头中的GPT头CRC32校验和存储形式填充为“00 00 00 00”,然后选中扇区偏移地址0X00~0X05B处重新计算GPT头的CRC32校验和。结果为“4EEFA08A”,存储形式为“8A A0 EF 4E”。将GPT头中的GPT头CRC32校验和的存储形式修改为“8A A0 EF 4E”;然后存盘;至此,GPT头已转换完成。
步骤11:打开GPT_Head_backup.vhd文件,全选,单击“复制”按钮,将光标移动到磁盘1的2097151号扇区开始位置,单击“粘贴”按钮,单击“保存”按钮。
通过计算得到GPT头备份中参数如下:
GPT头备份所在扇区号为2097151;在GPT头备份中的存储形式为“FF FF 1F 00”;
GPT分区区域结束扇区号在2097118;在GPT头备份中的存储形式为“DE FF 1F 00”;
GPT分区表备份CRC32校验和为348F57C2;在GPT头备份中的存储形式为“C2 57 8F 34”;注:GPT分区表备份与GPT分区表相同,所以,CRC32校验和也相同;
GPT分区表备份开始扇区号为2097119,在GPT头备份中的存储形式为“DF FF 1F 00”。
步骤12:修改GPT头备份中的GPT头备份所在扇区号、GPT分区区域结束扇区、GPT分区表备分CRC32校验和与GPT头备份所在扇区号这三个参数;然后存盘。
步骤13:将GPT头备份中的GPT头备份CRC32校验和存储形式填充为“00 00 00 00”,然后选中扇区偏移地址0X00~0X05B处重新计算GPT头备份的CRC32校验和。结果为“D615D156”,存储形式为“56 D1 15 D6”。将GPT头中的GPT头CRC32校验和的存储形式修改为“56 D1 15 C6”;然后存盘;至此,GPT头备份已转换完成。
7 结束语
将0号转换为保护的MBR;将GPT分区模板复制到GPT分区表所在扇区号,并修改各分区的开始扇区号和结束扇区号,完成GPT分区表的恢复;将GPT分区表复制到GPT分区表备份所在扇区;重新计算GPT头中的GPT头CRC32校验和、GPT头备份所在扇区号、GPT分区区域结束扇区号、GPT分区表CRC32校验和这4个参数;重新计算GPT头备份中的GPT头备份CRC32校验和、GPT头备份所在扇区号、GPT分区区域结束扇区号、GPT分区表备份开始扇区号和GPT分区表备份CRC32校验和这5个参数。通过这种方法成功实现MBR磁盘转换为GPT磁盘。