重建GPT分区与NTFS_DBR的研究
2020-04-15陈培德吴建平王丽清朱辰龙
陈培德,吴建平,王丽清,朱辰龙,邓 剑
(1.云南省电子计算中心,云南 昆明 650223;2.云南大学 信息学院,云南 昆明 650223)
0 引 言
GPT是GUID partition table的缩写,其含义是“全局唯一标识磁盘分区表”[1]。它是Windows Server 2003中的一种新型磁盘架构,是一种基于Itanium计算机中的可扩展固件接口使用的磁盘分区架构[1]。GPT的出现替代了旧式的MBR(master boot record)[2-3],解决了MBR分区表不支持容量大于2 TB分区的问题[4]。
而NTFS文件系统则是Windows操作系统重要的组成部分,但是由于计算机病毒的破坏、掉电、用户误Ghost、GPT分区至MBR分区误转等各种原因,导致GPT分区表被破坏的情况时有发生。当GPT分区表被破坏后,用户通过查找的方式获得GPT分区中各卷的容量,并通过重建GPT分区的来恢复。
然而在GPT分区的硬盘中,当GPT分区表、NTFS_DBR和NTFS_DBR备份同时被破坏后,恢复数据的难度系数也就更大。鉴于目前国内尚未有人展开同时恢复GPT分区、NTFS_DBR和NTFS_DBR备份的相关研究工作,文中针对这种情况进行了开创性的探索与研究。
1 GPT磁盘结构
一个GPT磁盘主要由保护的MBR、GPT头、GPT分区表、GPT分区区域等6个部分组成,大致结构如图1所示,6个部分说明如下:
在图1中,n为GPT磁盘的总扇区数,GPT磁盘的扇区号范围为0 ~(n-1)。
第1部分为保护MBR,存储在整个GPT磁盘的0号扇区,该扇区由磁盘签名[5]、1个MBR分区表和结束标志3个部分组成。其中,MBR分区表固定如下:
00 00 02 00 EE FF FF FF 01 00 00 00 FF FF FF FF
从MBR分区表可知:分区标志为0XEE,而相对扇区为1(存储形式为01 00 00 00),总扇区数为4 294 967 295(存储形式为FF FF FF FF),也就是该分区总数的最大值[6]。也就是说,该磁盘已经没有剩余空间再进行MBR分区,即该磁盘已经成为GPT磁盘。
第2部分为GPT头,存储在整个GPT磁盘的1号扇区[7],在1号扇区中,只使用了92个字节;主要描述了GPT头签名、版本号、GPT头所占字节数(注:一般为92)、GPT头CRC校验和、GPT头所在扇区号(注:一般为1)、GPT头备份所在扇区号、GPT分区区域开始扇区号(注:一般为34)、GPT分区区域结束扇区号、GPT磁盘的GUID、GPT分区表开始扇区号、每个GPT分区表所占字节数(注:一般为128)、GPT分区表的个数(注:固定为128)、GPT分区表的CRC校验和等信息。
第3部分为GPT分区表,存储在GPT磁盘的2~33号扇区,共占用32个扇区[8];从GPT头可知,每个GPT分区表占128字节[9],所以,在这32个扇区中最多可以存放128个GPT分区表[9],而每个GPT分区表管理一个分区;在每个分区表中记录着该分区的开始扇区号、结束扇区号、分区类型的GUID、分区名、分区属性和分区GUID。第1个分区表为系统保留,因此,用户在GPT磁盘上最多还可以再建立127个分区。
第4部分为GPT分区区域,是GPT磁盘中最大的一块区域[8],也是GPT磁盘最重要的组成部分;位于GPT磁盘的中间位置,其开始扇区号和结束扇区号在GPT头已定义。一般情况下,该区域的开始扇区号为34,而结束扇区号为GPT磁盘总扇区数减去35。该区域由该GPT磁盘中各个具体的分区组成,各分区的开始扇区号和结束扇区号在各分区表中均有定义。
第5部分为GPT分区表备份,存储在GPT磁盘的倒数33号扇区~倒数2号扇区,也是占用32个扇区[8]。是第3部分,即GPT磁盘的2 ~ 33号扇区的备份。
第6部分为GPT头备份,存储在GPT磁盘的倒数2号扇区[10],但该扇区不是GPT头的简单复制。在这个扇区中,也是使用了92个字节;主要描述了GPT头签名、版本号、GPT头所占字节数(注:一般为92)、GPT头CRC校验和、GPT头备份所在扇区号、GPT头所在扇区号(注:一般为1)、GPT分区区域开始扇区号(注:一般为34)、GPT分区区域结束扇区号、GPT磁盘的GUID、GPT分区表开始扇区号、每个GPT分区表所占字节数(注:一般为128)、GPT分区表的个数(注:固定为128)、GPT分区表的CRC校验和等信息。
2 NTFS文件系统
当用户将硬盘中的一个分区采用NTFS文件系统对其格式化后,在该分区上就建立了一个NTFS文件系统的结构,NTFS文件系统的结构大致如图2所示。
元文件SBOOT…某元文件…数据或文件某元文件数据或文件…DBR备份
图2 某NTFS文件系统的总体布局
从图2可知,NTFS文件系统主要由元文件、文件夹、数据和其他用户文件等组成[11-12]。其中:一些信息对于NTFS文件系统来说是非常重要的,存储这些重要信息所对应的文件就是元文件[13]。元文件是NTFS系统最重要的组成部分,它主要负责管理整个NTFS文件系统。在NTFS文件系统中,元文件主要有$MFT、$MFTMirr、$LogFile、$Volume、$Attrdef、$Root、$Bitmap、$Boot等。
其中:元文件$Boot在NTFS卷中的位置是固定不变的,位于NTFS卷的0号簇[11],该元文件所占簇数与每个簇的扇区数有关,NTFS_DBR则是元文件$Boot的重要组成部分,位于NTFS卷的0号扇区。由于NTFS_DBR比较重要,所以,在NTFS卷的最后一个扇区存储着NFTS_DBR备份。如果NTFS_DBR被破坏,可以通过NTFS_DBR备份来恢复;但是如果NTFS_DBR和NTFS_DBR备份同时被破坏,只有通过计算NTFS_DBR中BPB参数的形式来恢复。
3 实验环境与制作实验素材
(1)实验环境。
操作系统:Windows 7。
硬盘:虚拟硬盘。
数据恢复软件:WinHex 15.08。
(2)制作实验素材的步骤。
步骤1:在Windows 7桌面上,右击“计算机”图标,从弹出的快捷菜单中选择“管理”,出现“计算机管理”窗口,在导航窗格中选择“存储→磁盘管理”,选择菜单栏上的“操作→创建VHD”后,在“创建和附加虚拟硬盘”窗口中指定虚拟硬盘位置为G盘的根目录,虚拟硬盘文件名为a2.vhd,虚拟硬盘大小为2 GB。
步骤2:选择菜单栏上的“操作→附加VHD”后,附加a2.vhd文件为虚拟磁盘1,将光标移动到磁盘1处,将磁盘1初始化成GPT磁盘。
步骤3:在磁盘1上建立1个分区,分区大小为450 MB,文件系统选择NTFS,将其进行格式化。
步骤4:重复步骤3共计3次,在磁盘1上依次再建立3个分区,分区大小分别为390 MB、630 MB和510 MB文件。
完成以上操作后,在磁盘1中4个分区对应4个逻辑盘情况如下:
序号盘符文件系统容量(单位:MB)1H盘 NTFS4502I盘 NTFS3903J盘 NTFS6304K盘 NTFS510
分别复制一定数量的文件夹和文件到4个逻辑盘中;并记录下4个逻辑盘的NTFS_DBR和NTFS_DBR备份所在扇区号。
分离虚拟磁盘1,使用Winhex软件打开a2.vhd文件;将4个逻辑盘的NTFS_DBR和NTFS_DBR备份所在扇区号填充为00。
将a2.vhd文件附加为虚拟磁盘1,并删除4个逻辑盘,然后再转换成MBR磁盘。
至此,实验素材已制作完成。
4 重建GPT分区
4.1 重建GPT分区的基本思路与方法
重建GPT分区的基本思路:分别计算H盘、I盘、J盘和K盘的容量;重建GPT分区的方法如下:
(1)通过NTFS元文件$MFT或者元文件$MFTMirr的0号记录80H非常驻属性计算出NTFS文件系统每个簇的扇区数。
(2)通过NTFS元文件$MFT的8号记录80H属性计算NTFS总簇数。
(3)通过NTFS卷总簇数和每个簇的扇区数,计算NTFS卷的容量。
4.2 重建GPT分区的操作步骤
重建GPT分区操作步骤如下:
步骤1:启动WinHex软件。
步骤2:打开a2.vhd文件,并映象为磁盘。
步骤3:查找元文件$MFT或者$MFTMirr的0号记录,在65 680号扇区找到,如图3所示。
步骤4:计算每个簇的扇区数。
从图3可知,NTFS文件系统分配给元文件$MFT的空间为524 288字节,占512个簇;在元文件$MFT或者$MFTMirr的0号记录80H属性中的存储形式分别为“00 00 08 00 00 00 00 00”和“00 02”。
根据元文件NTFS文件系统分配给元文件$MFT的空间和所占簇数,可以计算出第1个卷(即H盘)每个簇的扇区数。
图3 第1个NTFS元文件$MFT或者$MFTMirr的0号记录80H属性
NTFS文件系统分配给元文件$MFT的空间=每个簇的扇区数×所占簇数×512字节/簇
524 288字节=每个簇的扇区数×512簇×
512字节/簇
每个簇的扇区数=2
步骤5:查找元文件$MFT的8号记录,在372 880号扇区找到,如图4所示。
从图4可知,NTFS文件系统的最后一个簇号为460 799,其存储形式为“FF 07 07”。
步骤6:计算NTFS卷的容量。
NTFS文件系统的簇号范围为0~460 799,即总簇数为460 800。
图4 第1个NTFS元文件$MFT的8号记录80H属性
步骤7:重复步骤3至步骤5,可以计算出第2个(即I盘)至第4个(即K盘)卷中NTFS系统的每个簇扇区数和容量。在GPT磁盘中,4个卷的基本情况如下:
序号每个簇的扇区数卷的容量(单位:MB) 12450212839033263042510
NTFS卷的容量=总簇数×每个簇的扇区数×
512字节/扇区÷1 024÷1 024 MB=
460 800×2×512÷1 024÷1 024 MB=
450 MB步骤8:退出WinHex。
步骤9:进入“计算机”管理窗口,选择菜单栏上的“操作→附加VHD”后,附加G盘根目录的a2.vhd文件为虚拟磁盘1,并转换成GPT磁盘。
步骤10:在磁盘1上依次建立4个GPT分区,磁盘1中4个分区依次对应4个卷的容量分别为450 MB、390 MB、630 MB和510 MB。
注:千万不要对4个卷进行(快)格式化操作。
至此,4个卷的GPT分区已经重建完成。
步骤11:分离a2.vhd,使用WinHex打开a2.vhd,并映象为磁盘,从主窗口可以得到分区2、分区3、分区4和分区5的开始扇区分别为65 664、987 264、1 785 984和3 076 224(注:分区1为微软保留分区)。
5 重建NTFS_DBR
5.1 重建NTFS_DBR的基本思路与方法
重建NTFS_DBR的基本思路:计算NTFS_DBR中的每个簇的扇区数、隐藏扇区数、总扇区数等七个BPB参数。基本方法如下:
(1)每个簇的扇区数:通过NTFS元文件$MFT或者元文件$MFTMirr的0号记录80H非常驻属性计算出NTFS文件系统每个簇的扇区数。
(2)隐藏扇区数:通过NTFS_DBR所在扇区号获得,即建立GPT分区后,每个卷在整个硬盘中的开始扇区号。
注:系统对该参数的正确性不进行校验,也可以不计算该参数,重建NTFS_DBR中没有计算该参数。
(3)总扇区数:总容量转换为扇区数后减1。
(4)元文件$MFT的开始簇号:从元文件$MFT或$MFTMirr的0号记录80H属性数据运行列表中的开始簇号获得。
(5)元文件$MFTMirr的开始簇号:从元文件$MFT或$MFTMirr的1号记录80H属性数据运行列表中的开始簇号获得。
(6)元文件$MFT每条记录大小描述和索引节点大小描述[1]:以每个簇的扇区数为依据通过查询表1获得,见表1。
表1 每个簇的扇区数与$MFT记录大小、索引节点大小对应表
将同一版本的NTFS_DBR复制到每个NTFS_DBR所在扇区号,并修改每个簇的扇区数、隐藏扇区数等这七参数[14]。
5.2 重建NTFS_DBR的操作步骤
重建NTFS_DBR操作步骤如下:
步骤1:启动WinHex软件。
步骤2:打开a2.vhd文件,并映象为磁盘。
步骤3:查找元文件$MFT或者$MFTMirr的0号记录,在65680号扇区找到,如图3所示。
步骤4:计算每个簇的扇区数。
NTFS文件系统分配给元文件$MFT的空间=每个簇的扇区数×所占簇数×512字节/簇
524 288字节=每个簇的扇区数×512簇×
512字节/簇
每个簇的扇区数=2
步骤5:计算总扇区数。
总扇区数=总容量×1 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的开始簇号:将光标移动到65 682号扇区,即元文件$MFT或$MFTMirr的1号记录开始扇区号,可以得到元文件$MFTMirr的开始簇号为8(注:存储形式为08)。
步骤8:以每个簇的扇区数为依据,通过查询表1获得元文件$MFT每条记录大小描述和索引节点大小描述。
第1个NTFS文件系统每个簇的扇区数为2,从表1可以查找到,元文件$MFT每条记录大小描述为1,每个索引节点大小描述为4。
步骤9:综合步骤4至步骤8,重建第1个NTFS_DBR需要计算的BPB参数,如下所示。
字节偏移字节数含义值0X0D1每个簇的扇区数20X288扇区总数921 5990X308$MFT的开始簇号153 6000X388$MFTMirr的开始簇号80X401每个$MFT记录大小描述1个簇0X441每个索引节点大小描述4个簇
转换成在NTFS_DBR中的存储形式,如下所示:
字节偏移含义在NTFS_DBR中的存储形式0X0D每个簇的扇区数020X28扇区总数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每个索引节点大小描述04
步骤10:重复步骤4至步骤9,重建第2个NTFS_DBR需要计算的BPB参数,如下所示:
字节偏移字节数含义值0X0D1每个簇的扇区数1280X288扇区总数798 7190X308$MFT的开始簇号2 0800X388$MFTMirr的开始簇号10X401每个$MFT记录大小描述1 024字节0X441每个索引节点大小描述4 096字节
转换成在NTFS_DBR中的存储形式,如下所示:
字节偏移含义在NTFS_DBR中的存储形式0X0D每个簇的扇区数800X28扇区总数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每个索引节点大小描述F4
步骤11:重复步骤4至步骤9,重建第3个NTFS_DBR需要计算的BPB参数,如下所示:
字节偏移字节数含义值0X0D1每个簇的扇区数320X288扇区总数1 290 2390X308$MFT的开始簇号13 4400X388$MFTMirr的开始簇号10X401每个$MFT记录大小描述1 024字节0X441每个索引节点大小描述4 096字节
转换成在NTFS_DBR中的存储形式,如下所示:
字节偏移含义在NTFS_DBR中的存储形式0X0D每个簇的扇区数200X28扇区总数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每个索引节点大小描述F4
步骤12:重复步骤4至步骤9,重建第4个NTFS_DBR需要计算的BPB参数,如下所示:
字节偏移字节数含义值0X0D1每个簇的扇区数20X288扇区总数1 044 4790X308$MFT的开始簇号1740800X388$MFTMirr的开始簇号80X401每个$MFT记录大小描述1簇0X441每个索引节点大小描述4簇
转换成在NTFS_DBR中的存储形式,如下所示:
字节偏移含义在NTFS_DBR中的存储形式0X0D每个簇的扇区数020X28扇区总数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每个索引节点大小描述04
步骤13:将同一版本NTFS_DBR复制到65 664号扇区,并修改第1个NTFS_DBR中的BPB参数并存盘,如图5所示,至此,第1个卷的NTFS_DBR已经恢复完成。
图5 恢复第1个卷的NTFS_DBR
步骤14:将同一版本NTFS_DBR复制到987 264号扇区,修改第2个NTFS_DBR中的BPB参数;将同一版本NTFS_DBR复制到1 785 984号扇区,并修改第3个NTFS_DBR中的BPB参数;将同一版本NTFS_DBR复制到3 076 224号扇区,并修改第4个NTFS_DBR中的BPB参数[14]。
至此,第2~4个卷的NTFS_DBR已经恢复完成。
步骤15:通过NTFS_DBR恢复NTFS_DBR备份。由于NTFS_DBR备份位于每个NTFS卷的最后一个扇区[15],4个NTFS_DBR备份依次分别位于987 263、1 785 983、3 076 223和4 120 703号扇区,分别将65 664号扇区复制到987 263号扇区,将987 264号扇区复制到1 785 983号扇区,将1 785 984号扇区复制到3 076 223号扇区,将3 076 224号扇区复制到4 120 703号扇区。
注:由于NTFS文件系统对NTFS_DBR备份是否存在并不进行校验,步骤15也可以省略。
6 结束语
由于计算机病毒的破坏、用户使用Ghost软件对GPT磁盘误操作、误将GPT磁盘转换为MBR磁盘、突然掉电等因素等,导致GPT分区、NTFS_DBR和NTFS_DBR备份同时被破坏的现象时有发生。通过实验的方式,依据NTFS文件系统元文件$MFT的0号记录、1号记录和6号记录的80H属性相关参数,提出重建GPT分区、NTFS_DBR和NTFS_DBR备份的基本思路、方法与步骤。作者在该实验中过程中,只使用了15分钟的时间,就恢复了GPT磁盘中的4个逻辑盘中的全部文件夹和文件。实践证明:该方法具有方便、快捷、简单实用的特点。