3.1.1DOS分区DOS分区是我们遇到的最多的分区类型。多年以来,DOS分区体系一直是IntelIA32硬件平台(i386/x86等)的分区体系。虽然很多参考文档对DOS分区进行介绍,但一直没有一个统一的标准,也没有统一的命名规则。Microsoft将使用DOS分区体系的磁盘称为主引导记录(MasterBootRecorder,MBR)磁盘,这是相对于使用全局ID分区表(GUIDPartitionTable,GPT)磁盘而言的。很多人一提到DOS分区,就认为只是指Windows下使用的分区体系,这是对DOS分区的一个理解误区。DOS分区并不是以操作系统的不同而划定的分区体系,而是指使用主引导记录(MBR)的分区体系。MicrosoftDOS、Linux以及基于IA32平台的FreeBSD和OpenBSD等操作系统都使用DOS分区体系。DOS分区是最常见也是最复杂的分区体系。我们都知道,要想使用硬盘存储数据,首先要将其进行分区,划分成一定的逻辑区域,然后通过对分区进行格式化建立相应的文件系统后,才能够在分区内进行数据的存储。系统通过记录在分区表(或磁盘标签)中的分区信息对各个分区进行识别与管理,如果这些信息损坏,就会表现为分区不可见,数据丢失。因使用环境不同,分区的管理方式会有所不同,也因此而出现了各种不同的分区体系,如DOS分区体系、Apple分区体系、BSD分区体系等。我们都知道,对于一个磁盘来说,要想存储数据,就必须将其进行划分并格式化成某种文件系统后才能够使用。经过划分后的区域,我们称其为分区。严格地说,分区是一个物理硬盘上一些连续的扇区的集合。如果扇区不连续,那是不能划分于同一个分区里的。“卷”在某种意义上是对分区的扩充。随着计算机应用的进一步扩大,数据存储已经不能满足于在单一磁盘上的进行,有的时候,需要进行跨盘的数据存储。卷的出现很好地弥补了原分区所受的诸多限制,不仅允许同一磁盘不连续空间的统一管理,而且允许跨盘的数据存储管理。实际上,分区可视为卷的一种特殊情形——简单卷。亦即:由单一物理磁盘的连续空间构成的卷。扇区是数据信息记录的最基本单位。磁盘中的每个扇区,在不同的场合会有不同的地址编号。1.物理地址在整个磁盘上对扇区采用LBA寻址方式,即将磁盘上的所有扇区由0开始编号,直到最大扇区数减1。对于某个扇区,我们称它的这个LBA地址为物理地址(PhysicalAddress)。2.物理卷地址每个物理磁盘又可以看做是一个物理卷,因此,每个扇区又相应地有一个物理卷地址。在将物理磁盘做单一磁盘使用时,物理地址与物理卷地址是相同的。但有时候,我们需要将同一物理磁盘上不连续的扇区合并使用,或者将不同物理磁盘上的部分空间合并成一个虚拟的物理磁盘使用。这时,物理地址与物理卷地址则会不同。因此,我们需要注意区分物理地址与物理卷地址间的区别。3.逻辑卷地址在逻辑卷内部,为了便于管理,我们需要为卷内的每个扇区赋予一个相对于该卷开始扇区的地址号,我们称这个地址号为扇区的逻辑卷地址(LogicalVolumeAddress)。注意,一个扇区的逻辑卷地址是相对于它所属的逻辑卷的起始位置而言的,而不是相对于整个磁盘的0扇区。如果磁盘上的一个扇区属于某个卷,那么它至少有三个地址号:物理地址号、物理卷地址号和逻辑地址号。如果某个扇区不属于任何一个卷,那么它只有物理地址号和物理卷地址号而没有逻辑卷地址号。DOS分区磁盘有一个共同的特点,那就是硬盘的第一个扇区(也就是0号扇区)被称为主引导记录扇区,也称为主引导记录MBR(MasterBootRecorder,MBR)。当计算机启动并完成自检后,首先会寻找磁盘的MBR扇区并读取其中的引导记录,然后将系统控制权交给它。而对磁盘上数据的总体管理,是经由MBR得以实现的。由此可见,如果MBR损坏,则后续的所有工作都无法继续进行。硬盘的主引导记录(MBR)是不属于任何一个操作系统的,它先于所有的操作系统而被调入内存,并发挥作用。启动计算机时,系统首先对硬件设备进行测试,测试成功后进入POST自举程序INT19H,然后读系统磁盘0柱面、0磁头、1扇区的主引导记录(MBR)内容到内存指定单元0:7C00地址开始的区域,并执行MBR程序段:检查硬盘分区表是否完好。在分区表中寻找可引导的“活动”分区。将活动分区的第一逻辑扇区内容装入内存。(在DOS分区中,此扇区内容称为DOS引导记录(DBR))。至此,计算机才将控制权交给主分区(活动分区)内的操作系统,并用主分区信息表来管理硬盘。主引导扇区主要由三部分组成:主引导记录MBR(MasterBootRecord或者MainBootRecord)、硬盘分区表DPT(DiskPartitionTable)和结束标志字三大部分组成。在总共512字节的MBR扇区中,MBR的引导程序占了其中的前446个字节(偏移0H~偏移1BDH),随后的64个字节(偏移1BEH~偏移1FDH)为DPT(DiskPartitionTable,硬盘分区表),最后的两个字节“55AA”(偏移1FEH~偏移1FFH)是分区有效结束标志。用WinHex查看某个硬盘的MBR,如图3-1所示。读者可以对照偏移量自行分析一下。图3-1MBR结构操作系统为了便于用户对磁盘的管理,引入了磁盘分区的概念,即将一块磁盘逻辑划分为几个区域。在MBR的共64个字节的分区表中,以16个字节为一个分区表项来描述一个分区的结构。1.分区表项的构成偏移00010203040506070809101112131415意义可引导标志分区起始参数分区类型分区结束参数分区起始LBA地址分区大小(扇区总数)解释80为可引导;00为不可引导。磁头低6位是分区开始的扇区,高2位是分区开始的柱面的前两位。分区开始的起始柱面号的低8位磁头低6位是分区开始的扇区,高2位是分区开始的柱面的前两位。分区开始的起始柱面号的低8位little-endianlittle-endian(1)0x00~0x00:1个字节,可引导标志。(2)0x01~0x03:3个字节,分区的起始CHS地址。(3)0x04~0x04:1个字节,分区类型标志。(4)0x05~0x07:分区结束CHS地址。与分区起始CHS地址结构相同。(5)0x08~0x0B:4个字节,分区起始LBA地址,使用little-endian顺序。(6)0x0C~0x0F:4个字节,分区大小扇区数,使用little-endian顺序。2.分区类型参数与常见分区类型分区类型标志表明其所描述的分区的类型,如FAT、NTFS、LINUX或者FreeBSD等,不同的操作系统可能会使用不同的分区类型。利用分区类型值,可以达到隐藏某些分区的目的。例如,将NTFS的类型值由0x07改为0x17,重新进入Windows后,Windows将不再为其分配盘符,也就无法在“我的电脑”中看到这个分区。下表列出了一些常见的磁盘分区类型:以图3-1所示分区表为例,我们用WINHEX的模板管理器中的MBR模板来查看其磁盘分区信息,结果如图3-3所示。对WINHEX不熟悉的读者请先学习“WINHEX使用手册”。图3-3MBR模板3.3.1扩展分区概念我们平时说到的分区概念,不外乎三种分区方式:主分区、扩展分区和逻辑分区。主分区是一个比较单纯的分区。从操作层面看,它是在磁盘分区过程中,直接指定的。从内部结构看,磁盘的主分区在MBR的DPT里,都会有一个独立的分区表项指定。在主分区中,不允许再建立其它逻辑磁盘。扩展分区的概念则比较复杂,也是造成分区和逻辑磁盘混淆的主要原因。由于硬盘仅仅为分区表保留了64个字节的存储空间,而每个分区表项的参数占据16个字节,故主引导扇区中总计可以存储4个分区的数据。操作系统只允许存储4个分区的数据,如果说逻辑磁盘就是分区,则系统最多只允许4个逻辑磁盘。对于具体的应用,4个逻辑磁盘往往不能满足实际需求。为了建立更多的逻辑磁盘供操作系统使用,系统引入了扩展分区的概念。图3-4EBR结构所谓扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表。这样在主引导扇区中除了主分区外,仅需要存储一个被称为扩展分区的分区数据,通过这个数据可以找到下一个分区(实际上也就是下一个逻辑磁盘)的起始位置,以此起始位置类推可以找到所有的分区。无论系统中建立多少个逻辑磁盘,在主引导扇区中通过一个扩展分区的参数就可以逐个找到每一个逻辑磁盘。扩展分区中的每个逻辑驱动器都存在一个类似于MBR的扩展引导记录(ExtendedBootRecord,EBR),也有人称之为虚拟MBR或扩展MBR,意思是一样的。EBR的数据结构与MBR很相像,由于EBR不再承担像MBR那样的磁盘加载功能,所以偏移1BE之前的446个字节的引导代码已经被00所代替,但后边的DPT和扇区认证标签55AA还是存在的。其结构如图3-4所示。图3-5扩展分区结构在EBR的DPT中,第一个逻辑驱动器的扩展分区表中的第一项指向它自身的引导扇区。第二项指向下一个逻辑驱动器的EBR。如果不存在进一步的逻辑驱动器,第二项就不会使用,而且被记录成一系列零。如果有附加的逻辑驱动器,那么第二个逻辑驱动器的扩展分区表的第一项会指向它本身的引导扇区。第二个逻辑驱动器的扩展分区表的第二项指向下一个逻辑驱动器的EBR。扩展分区表的第三项和第四项永远都不会被使用。如此循环下去,直到没有新的逻辑驱动器出现。其结构如图3-5所示。下面通过一个实际的例子来分析一下EBR的结构。首先看图3-6中磁盘2的分区情况,可以看出这块硬盘分了四个分区:一个主分区、三个逻辑分区。用WinHex查看该盘的MBR扇区,如图3-7所示。从第一个分区表项可以看到,主分区为FAT32格式,分区开始于63号扇区,大小是417627个扇区,也就是204MB。第二个分区表项描述的是一个扩展分区,该扩展分区开始于417690号扇区,大小为1638630个扇区。该扩展分区并不是一个可用的驱动器,而是对一段空间的描述,在其内部进一步划分为3个逻辑分区。为了便于描述,我们称该扩展分区为“主扩展分区”。下一步我们跳转到主扩展分区的开始扇区417690,用winhex查看该扇区,结果如图3-9所示。根据EBR扇区的特征我们判断该扇区就是EBR扇区,也就是说,主扩展分区的开始扇区其实就是EBR,而且是该硬盘的第一个EBR,我们称它为EBR1,用winhex的模板查看分区表的数值,如图3-10所示。第一个分区表项是用来管理第一个逻辑驱动器的,第二个分区表项分区类型为05H,说明它是一个扩展分区,为什么在扩展分区中还有扩展分区呢?因为扩展分区是一种链式结构来管理的,EBR扇区中第一个分区表项总是描述当前的逻辑驱动器,第二个分区表项则连接到下一个EBR扇区,以引出下一个逻辑驱动器。我们称这样的扩展分区为“子扩展分区”,并把这个子扩展分区命名为“子扩展分区1”。从图3-10我们看到,子扩展分区1开始位置在401625扇区,这是个相对位置,是以EBR1所在扇区为起始点来定位的。而前面我们已经得到EBR1所在扇区位置为417690,因此子扩展分区1的实际开始扇区为417690+401625=819315。EBR2扇区的第一个分区表项是用来管理第二个逻辑驱动器的,第二个分区表项分区类型为05H,说明它也是一个扩展分区,它的作用也是连接到下一个EBR扇区,以引出下一个逻辑驱动器。我们把这个扩展分区定义为“子扩展分区2”。子扩展分区2的相对起始位置是1012095,我们需要计算出其绝对位置,也就是用1012095加上EBR1所在的扇区号417690,结果为1429785。通过winhex跳转到1429785扇区,其结构如图3-13所示。很明显这也是一个EBR扇区,有两个分区表项及结束标志“55AA”,我们称它为EBR3,用winhex的模板具体看一看,如图3-14所示。3.4.1引导代码被破坏图3-15