80 01 01 00 07 FE FF FB 3F 00 00 00 BD 08 FA 00,00 00 C1 FC 0F FE FF FF FC 08 FA 00 2C CD 05 01。这意味着MBR的分区表中只定义了两个分区,我们一个一个来分析,先分析第一个分区表项,80 01 01 00 07 FE FF FB 3F 00 00 00 BD 08 FA 00,我们先解释一下这16个字节的含义。
第一个字节的内容是分区的引导标志,80表示是引导分区,00表示不是引导分区。第二,三,4字节表示分区的起始磁头,扇区,柱面,本例中三个参数分别是01 01 00,这代表第一个分区从0柱面1磁头1扇区开始。第五个字节表示分区类型,07表示NTFS分区,常用的类型有 0F(扩展分区),0B(FAT32),06(FAT16)。第六,七,八字节分别表示分区的结束磁头,扇区,柱面。注意,这里有些玄机,分区的起始扇区和结束扇区看起来用了一个完整字节,其实不是。由于C/H/S中扇区编号从1到63,因此用一个字节表示有些浪费,一个字节由八个二进制数组成,扇区编号只用了低六位,高2位给柱面用了。因此,表示柱面其实用了10个二进制数,其中高2位是从扇区参数中借来的。结合本例看看,六,七,八参数分别是 FE FF FB,分析一下,FE表示分区的结束磁头是254,FF拆为二进制是11111111,低六位是111111,用来表示分区的结束扇区,也就是说结束扇区是63。FF拆开后高2位11给了柱面用,也就是说分区的结束柱面不是FB,而是3FB,3FB等于十进制的1019。这下子我们明白了,第一个分区开始在0/1/1,结束在1019/254/63。 看到这里有些朋友不禁有些疑问,分区表只用了八个字节就已经表示了起始和结束位置,为什么还需要后八个字节呢?其实后八个字节是用LBA方法来表示分区的起始位置和结束位置,这可不是多此一举,主要是因为CHS对大容量硬盘已经力不从心了。从刚才的参数分析我们可以看出来,CHS表示柱面的参数最多也就是10个二进制数,10个二进制数只能表示1024个柱面,1024柱面才多大?1024×7.8M=8G。看看,C/H/S无法定位8G以后的硬盘空间,这也是当初设计分区表时目光短浅,如果能用两个字节表示柱面,那现在就完全没问题了。由于C/H/S对现在的海量硬盘根本无用武之地,因此表示分区大小的重任就只能落在LBA的肩上了。
继续分析分区表项的第九,十,十一,十二字节,这四个字节代表分区之前的扇区数,意思是从分区的起始到硬盘的第一个扇区之前有多少扇区,其实是很隐晦地告诉我们分区从哪里起始。本例中这四个字节的内容是3F 00 00 00,首先我们要高低位互换,四个字节的内容是00 00 00 3F,转为10进制是63,这意味着第一个分区之前的扇区数是63,也意味着第一个分区从63扇区开始。为什么?有人这么问,既然第一个分区之前有63个扇区,那第一个分区应该从64扇区开始才对呀?主要是因为LBA表示扇区是从0开始编号而不是从1开始,分区之前有63个扇区意味着分区之前的扇区是从0到62,那分区起始自然应该从63开始。
分区表的十三,十四,十五,十六字节代表分区的大小,这四个字节表示分区的扇区数。本例这四个参数为BD 08 FA 00,高低位互换一下,分区的扇区数为00 FA 08 BD,换算为10进制为16386237。知道了分区起始在63,大小为16386237,结束位置也就知道了 63+ 16386237-1=16386299。用winhex转到16386299看看,如下图所示,16386299正是1019柱面254磁头63扇区。(图6)
对分区表的第一个项内容总结一下,这16个参数告诉我们,第一个分区从0/1/1开始,到1019/254/63结束,可以引导系统,分区类型为NTFS,分区起始的扇区数是63,分区大小是16386237扇区。以前有同学提过问题,分区为什么不从第二个扇区开始?主要是因为MBR太重要,操作系统不希望对此扇区进行太多访问,因此干脆把MBR所在的整个磁道都划到分区之外了,这就是为什么第一个分区从0柱面1磁头1扇区开始。
分析了分区表的第一项,接下来来分析第二项 00 00 C1 FC 0F FE FF FF FC 08 FA 00 2C CD 05 01。第二项前八个字节中我们只要看第一个字节和第五个字节,知道第二个分区是扩展分区,不能引导,这就够了。其余6个字节用C/H/S表示分区的起始和结束就不用再看了,因为8G以后C/H/S已经失去作用了,第二个扩展分区结束的位置远远超过8G,C/H/S肯定无法表示了,主要看看后八个字节的LBA参数就可以了。扩展分区之前的扇区数是FC 08 FA 00,高低位互换后是00 FA 08 FC,也就是扩展分区之前的扇区数是16386300,扩展分区的起始是16386300扇区。扩展分区的大小是2C CD 05 01,高低位互换后再转为10进制是17157420扇区,因此可算出分区的结束是在16386300+17157420-1=33543719扇区。扩展分区的起点和终点都知道了,通过Winhex查询C/H/S参数,可知分区的起始是1020/0/1,结束在2087/254/63。
分析了MBR的分区表后,我们发现分区表中定义了两个分区,一个是主分区,一个是扩展分区。看到这里,有人要问了,这个硬盘明明有四个分区,怎么在分区表中只定义了两项?到目前为止,只有C分区被定义出来,D,E,F分区在哪里定义呢?答案在扩展分区里,在扩展分区的第一个扇区,有一个分区表,分区表中将定义出主分区D,然后定义出下一个扩展分区。找到下一个扩展分区的起始扇区,又会看到一个分区表,定义出主分区E,然后又定义下一个扩展分区……这种依靠扩展分区的方法被称为链式分区表,其实使用扩展分区也是无奈之举,由于MBR的分区表只有4项,我们如果不使用扩展分区就最多只能使用四个分区。有了扩展分区之后,显然分区的数量就不受限制了,而且现在从分区表的角度来看,分区表中只有主分区和扩展分区,根本没有逻辑分区。我们使用的逻辑分区,不过是在扩展分区的分区表中定义出来的主分区而已。分区拓扑如下图所示。(图7)
我们转到扩展分区的起始,继续向下分析分区表,扩展分区的起始位置在1020/0/1,分区表内容如下图所示(图8)
从扩展分区的分区表中可以看出定义了两项分区,分别来分析一下。第一项定义了D分区,内容是00 01 C1 FC 07 FE FF FF 3F 00 00 00 82 3E 00 00,根据分区类型参数可以知道D分区是一个NTFS主分区,由于D分区的结束位置超过了8G,因此不用看C/H/S参数,直接看LBA就可以了。3F 00 00 00表示D分区之前的扇区是63,注意,这可不代表D分区的起始位置是63。扩展分区表中描述主分区之前的扇区数基本都是63,这个63指的是从D分区的起始到定义D分区的分区表之间的距离是63扇区,扩展分区的分区表在16386300扇区,因此D分区的起始应该是16386300+63=16386363,C/H/S参数是1020/1/1。00 82 3E 00表示分区的大小是3E 82 00扇区,经计算可知分区的结束位置在20482874,C/H/S参数是1274/254/63。
接下来分析第二项,这一项定义的是第二个扩展分区,内容是00 00 C1 FF 05 FE FF FF 3F 82 3E 00 BF E2 5D 00。分区类型05表示定义的是一个扩展分区,00 3E 82 3F表示第二个扩展分区之前的扇区数,注意,之前的扇区数指的是从第二个扩展分区的起点到第一个扩展分区起点的距离,以后向下定义后续扩展分区时,之前的扇区数指的都是被定义的扩展分区的起点到第一个扩展分区起点的距离。现在我们来计算一下第二个扩展分区的起始位置,第二个扩展分区距离第一个扩展分区的起点有3E 82 3F个扇区,第一个扩展等区的起点是16386300,因此第二个扩展分区的起始是16386300+4096575(3E823F)=20482875,C/H/S参数是1275/0/1。第二个扩展分区的大小是5D E2 BF,所以我们推算出第二个扩展分区的终点是26635769,C/H/S是1657/254/63。
扩展分区的分区表分析完之后,D分区被定义出来了,而且又给出了第二个扩展分区的定义,我们现在到第二个扩展分区的起点,继续向下分析分区表。第二个扩展分区的位置在1275/0/1,分区表内容如下图所示。(图9)
分区表中仍然是两项,这次我们明白了,肯定一项用来定义E分区,另一项定义第三个扩展分区。先来看看第一项 00 01 C1 FF 07 FE FF FF 3F 00 00 00 80 E2 5D 00,从分区类型07可以得知E的分区类型是NTFS,E分区之前的扇区数是00 00 00 3F,这指的是E分区的起点和第二个扩展分区表之间的距离是63扇区。第二个扩展分区表在20482875,所以E的起点应该是20482875+63=20482938。再根据E的大小是 00 5D E2 80,可以计算出E的终点是26635769。E从20482938-26635769,用C/H/S表示是1275/1/1-1657/254/63。
再来看分区表的第二项,这一项将定义第三个扩展分区,00 00 C1 FF 05 FE FF FF FE 64 9C 00 2E 68 69 00。05表示定义的是扩展分区,00 9C 64 FE表示的是第三个扩展分区之前的扇区数,之前指的是到第一个扩展分区的起点,也就是说第三个扩展分区的起点和第一个扩展分区起点之间的距离是10249470(00 9C 64 FE)个扇区。由于第一个扩展分区的起始是16386300,因此第三个扩展分区的起始位置应该是16386300+10249470=26635770。第三个扩展分区的大小是00 69 68 2E,因此第三个扩展分区的终点应该是 26635770+6907950(00 69 68 2E)-1=33543719。第三个扩展分区起点和终点是 26635770-33543719,用C/H/S表示是1658/0/1-2087/254/63。
第二个扩展分区的分区表分析完后,E分区被定义出来,第三个扩展分区也被定义出来了。第三个扩展分区的起点在 1658/0/1,内容如下图所示。(图10)
这次我们发现分区表中只有一项,这是因为已经定义到最后一个分区了,因此不需要再向下定义扩展分区了。最后一项分区定义了F分区,内容是 00 01 C1 FF 07 FE FF FF 3F 00 00 00 EF 67 69 00,07表示F分区是一个NTFS主分区,00 00 00 3F表示F分区和第三个扩展分区分区表的距离是63扇区,第三个扩展分区的起点是26635770,所以F分区的起始位置是 26635770+63=26635833。F分区的大小是00 69 67 EF,因此计算出F分区的终点是33543719。F分区的起点和终点是 26635833-33543719,1658/1/1-2087/254/63。
至此,分区表分析完毕,一共分析了四处分区表,定义了七个分区,各处分区表定义的分区具体如下表。如果大家能够细细体会,察觉到操作系统分区的规律,将来进行分区恢复就容易得多了。当我们明白操作系统创建分区和修改分区在分区表中是怎么表现的,将来进行分区恢复只不过是一个简单的逆向操作而已,下次我们可以举个例子来说明一下。分区恢复并不难,大家只要渡过开始时对操作界面的不适应,仔细研究,辅以实例好好推敲一番,定然能够柳暗花明,豁然开朗。恭祝大家早日掌握分区原理!