MBR(Mater Boot Record)称为主引导记录。MBR对于一个磁盘是最关键的,一般位于磁盘的最开始位置,即C/H/S地址的0柱面0磁头1扇区,LBA地址的0扇区,占一个扇区(512字节)大小。主要由四部分组成:引导程序、磁盘签名、分区表、结束标志,如图3-1所示。
引导程序:占用前面440个字节,偏移地址为 0 ~ 1B7H。引导程序对于计算机的启动非常重要的。BIOS通过自检后读取硬盘0扇区的MBR,然后把控制权交给MBR的引导程序,接下来引导程序判断MBR最后是不是以55AA结束,如果不是则出错。继续查找分区表中的活动分区,再把控制权交给分区中的引导记录。如果主引导记录出问题,则计算机不能正常启动。引导程序由操作系统写入,而且一般都是固定的。
磁盘签名:占4个字节,偏移地址1B8H ~ 1BBH,是Windows系统对硬盘初始化时写入的一个签名。同一台计算机的多个磁盘签名不能相同,否则会认为磁盘没有初始化。如果磁盘签名丢失,系统也会认为该硬盘没有初始化。
分区表(Disk Partition Table):64字节,偏移地址 1BEH ~ 1FDH,这是非常重要的一个结构。分区表存放的四个分区表项,每个表项占16字节,分区表项是对分区的描述。
结束标志:最后的两个字节,固定是55AA,如果没有这个结束标志MBR是无效的。
3.2 磁盘主分区结构
硬盘在使用之前都要在逻辑上划分为一个个分区。每个分区有起始地址,结束地址,大小。MBR磁盘的分区形式有三种:主分区、扩展分区、非DOS分区。由于MBR中的分区表只有64字节,所以只能分4个主分区,如果需要更多的,就要靠扩展分区延伸。扩展分区在MBR的记录是一个主分区记录,所以一般硬盘有三个主分区和一个扩展分区。使用Winhex打开一个硬盘的记录如图3-2所示。
分区表从1BEH偏移开始,每个分区表项16字节,共有四个分区表项。每个字节都有具体的意义,具体意义如表 3-1所示。
表 3-1 分区表项的含义
相对偏移地址 |
字段长度 |
含义 |
0x00 |
1字节 |
引导标志(Boot Indicator),是否为活动分区 |
0x01 |
1字节 |
起始磁头(Start Head) |
0x02 |
6位 |
起始扇区(Start Sector),只用了6位 |
0x03 |
10位 |
起始柱面(Start Cylinder) |
0x04 |
1字节 |
分区类型(Partition Type Indicator),如果FAT32或NTFS |
0x05 |
1字节 |
结束磁头(End Head) |
0x06 |
6位 |
结束扇区(End Sector),只用了6位 |
0x07 |
10位 |
结束柱面(End Cylinder) |
0x08~0x0B |
4字节 |
本分区之前使用的扇区数(Sectors Preceding Partition) |
0x0C~0x0F |
4字节 |
本分区的总扇区数(Sectors in Partition) |
根据表3-1可以解析出来图3-2中的分区表项。第一个分区表项含义:80H活动分区,起始磁头32,起始扇区33,起始柱面0,分区类型NTFS,结束磁头223,结束扇区19,结束柱面12,分区前扇区数2048,本分区扇区总数204800。其实在这种情况下,起始/结束磁头、起始/结束扇区、起始/结束柱面显得毫无意义,系统只要根据本分区之前的扇区数就可以定位到唯一的扇区,即这个分区的绝对起始扇区,根据扇区总数可以得到大小。
3.3 扩展分区结构
扩展分区是在MBR分区表项不够用的情况下产生的。扩展分区不是实际意义上的分区,它是一个指向下一个用来定义分区参数的指针,这种指针结构形成一个单向链表。这样MBR分区表项中除了主磁盘分区外,仅需要存储一个被称为扩展分区的分区信息,通过这个扩展分区的信息就可以找到下一个分区的起始位置,从而可以找到所有的分区。
扩展分区中的每个逻辑驱动器的分区信息都存在一个类似于MBR的扩展引导记录(EBR,Extended Boot Record)中,如图3-3。EBR只有分区表项和结束标志,没有引导记录和磁盘签名,所以前面的数据是什么并不关心。而EBR的分区表项中只使用了两项,另外两项全部为0,这两项中第一项用来描述本逻辑分区,第二项描述下一个EBR,这样就可以形成一条单向链表。EBR的含义和MBR分区表项一样。
一个硬盘的分区结构示例,如图 3-4所示。
3.4 MBR和分区表的修复
3.4.1 MBR修复
如果计算机使用不当,误分区,误Ghost,或者突然间断电,都很容易造成MBR丢失损坏,导致计算机无法启动。防止此类事情发生,在计算机正常的时候备份好MBR,以防不测。如果没有备份,也可以从其他正常的计算机拷贝一份MBR过来,但是不要分区表部分,因为不同计算机分区表千差万别,只要MBR的引导程序、结束标志相同的,分区表单独修复。
修复MBR的思路很简单,就是预先定义好一个引导程序,然后把引导程序和结束标志写进去,写进去的时候不要修改分区表部分,磁盘签名可以使用全0。备份MBR就读取磁盘0扇区的内容,把引导程序和磁盘签名部分写入一个文件保存好。恢复MBR就是把这个保存的文件写入磁盘0扇区。MBR处理部分比较简单,就不贴代码了。
3.4.2 分区表修复
由于分区表是非常复杂的,千差万别,分区表项的个数、位置和大小都是不定的,交叉分区更复杂,编程实现恢复非常困难,要真正恢复还是靠人工分析。
简单的分区表丢失情况就是MBR中的分区表部分损坏,而其他的扩展分区正常。这时只要按照分区表的规律可以找到分区并修复。Windows系统在分区的时候,第一个分区总是在磁盘的一定偏移位置,Windows XP系统分区后,第一个分区在磁盘的绝对偏移地址 63扇区,Windows 7系统则在 2048扇区(本文是基于Windows 7系统研究的,所以以Windows 7系统分析)。直接读取偏移2048扇区的内容并且判断是不是一个有效的分区,判断的依据是:文件系统的DBR是一个固定的格式,有一些标志,如刚开始的跳转指令和DBR的结束标志55AA,如果满足这两项就认为是一个有效的分区,可以加入MBR分区表。然而在这个2048分区DBR中也保留着这个分区的描述,根据这些信息可以确定下一个分区的位置。这样不断递归遍历就可以找到完整的分区表项。
恩,未完,请往下看