Windows磁盘结构分析-MBR主分区---扩展分区详解

0x0 准备工作

我们使用Winhex来查看硬盘结构:
选择Open Disk
在这里插入图片描述
然后选择物理驱动器
可以看到左边一列,Winhex显示详细的信息
这是硬盘参数,依次为:
model 型号
Serial No 序列号
Firmware 固件版本号
Bus 磁盘接口类型
硬盘参数

第一个是状态信息,在不修改的情况下默认为original 原始的,否则是被修改过的
在这里插入图片描述

state -> modified
n/a -> keyboard input
被修改过后的状态信息

总容量capacity
扇区的字节数 这里是512byte
surplus sector是放弃尾部 因为磁盘的粒度问题,导致最后一个分区之后的剩余的扇区
在这里插入图片描述

右上部有一个非常重要的功能:
下拉三角形,可以看到扩展的界面可以看到详细的分区情况
分区表,分区表模板(能直接给出分析后的结果)
访问
底下边栏可以直接go to 你想去的sector 或者直接go to 相应的 offset
在这里插入图片描述在这里插入图片描述

0x1 正式开始

MBR分区结构:应用于x86架构的一种分区结构

MBR称为主引导记录,实际上是一段引导代码
MBR位于C/H/S为0/0/1上,位于LBA地址为0的扇区上
它的结构划分为4部分
1.440字节的引导程序
2.4字节的磁盘签名(Windows Disk Signature) + 2字节00 00
3.64字节的分区表,每个表项为16字节,只允许四个磁盘分区,当然Windows有相应的处理措施,逻辑磁盘跟磁盘分区不一定是一一对应的。
4.两字节的结束标志55 AA

引导程序主要功能为在BIOS启动执行完必要的初始化操作后,会将MBR读入内存,然后MBR会先将自己拷贝到安全的地方,防止被覆盖,然后执行,两次判断最后两个字节是否为55 AA,第一次判断是为了观察MBR结构是否被破坏,如果是那么就输出错误信息,不然就查找是否存在活动分区,不是则输出missing operating system,因为活动分区只有一个,操作系统的位置是在那里的,如果不存在活动分区,也说明无操作系统,MBR也会尝试从软盘启动从做系统。若存在活动分区,那么将读入活动分区的扇区地址,并将该引导扇区读入内存并判断合法性,若没问题,则将控制权交给这个引导扇区进行操作系统的引导。

4字节的磁盘签名是至关重要的!!!它是Windows判断磁盘是否初始化的重要依据,这是在Windows初始化磁盘时写入的一个标签。操作系统为了保险,会在注册表中留下一个副本,如果丢失了磁盘签名并且挂载到别的别的另一台计算机上,那么会在磁盘属性里显示磁盘未初始化。

分区表代表着磁盘分区,如果丢失在磁盘管理中会显示“未指派”。

最后的两字节代表着MBR的结束标志,如果丢失,则会显示 未初始化 和 未指派,可以用Winhex在最后进行修改即可。但别进行格式化操作,不然虽然可以解决结束标志被修改的问题,但是分区表会完全丢失,所以谨慎操作。

0x2 主磁盘分区分析

磁盘分区的时候会有一个明确的起始位置(稍后会讲),这个起始位置之间的连续扇区是分配给分区的。

MBR分区形式分三种,主分区(主DOS分区),又称主磁盘分区,因为MBR的分区表只有64位,而每一个元素为16位,所以最多只允许4个主磁盘分区出现。另外两种是扩展分区和非DOS分区,后一种是给另外一个操作系统用的一块空间,我们这里不讨论。

先说主磁盘分区的结构。
如图笔者的计算机上有四个主分区 和一个逻辑驱动器

主分区
在mbr中,他们的十六进制如下
在这里插入图片描述

一个表项16字节,接下来我们详细分析下:

第一个字节的含义表示是否是活动分区,值只能为0或0x80,其他值表明出错。若是值为0x80,则表明是活动分区,活动分区的意思也就是操作系统所在的分区,有且仅有一个。

第二个字节的含义是开始的C/H/S的H地址,它占八位,所以最多表示128个磁头

第三个字节的含义是开始的C/H/S的S地址,它占6位,其中高2位留给柱面,最多每个磁道上有63(64 - 1)个扇区,因为扇区从1开始计数

第四个字节的含义是开始的C/H/S的C地址,它一共占十位,其中向第三个字节借了两位,可表示1024个柱面,所以这三个字节可表示1024 * 256 * 63 = 16,515,072个扇区,也就是16515072 * 512 = 8,455,716,864个字节,为7G(按照1M = 1024)的空间,显然远远不能表示现代的几千个G的硬盘的所有地址,所以一般都用LBA(Logical Block Address)来表示扇区地址。

第五个字节表示这个分区的类型,常见的有FAT32,NTFS等文件系统。

第六个字节表示该分区结束时的C/H/S的S地址

第七个字节表示该分区结束时的C/H/S的S地址,它占6位,跟上面类似

第八个字节表示该分区结束时的C/H/S的C地址,它一共占十位。

下面的两个是DWORD类型的,每一个是四字节
第一个四字节是Sectors preceding partition (即用LBA表示的),表明是第几个扇区开始
第二个四字节表明的是该分区的总分区数,仍然LBA表示
至此一个表项的结构完毕

实际分析一个主分区加深印象
主分区

首先开头为0x80 表明是活动分区
第二个字节表明是01磁头
第三个字节拆开后 0000 0001 低六位表明扇区号为1
第四个字节与前一个字节的两个位拼合后,柱面为0
第五个字节表明类型是07 是NTFS的类型
第六个字节表明结束磁头是254磁头
第七个字节拆开后 1111 1111, 低六位是63,所以扇区号是63
第八个字节与前一个字节的两个位拼合后是0b1111111111 1023柱面号
下面两个DWORD值分别是0x3F(63),0x03DAE6FB(64677627),表明该分区的开始地址是在63,分区总数是64677627。

对照一下分区模板
分区模板

其实这里算一下就知道,我们的这个分区已超过7GB,所以结束的地址显然是错误的。所以Windows中 我们查看内存分区所看的大多数是LBA地址。
另外要注意的是,系统分区时,是不允许跨柱面的,所以分区是以柱面为单位分配的,且是连续的,所以有时候会分配不会严格按照所给定的来分割。

我们稍微观察下多个主分区的分区模板:
主分区1主分区2三
第二个的起始地址是 第一个分区的起始地址63 +第一个分区长度64677627 = 64677690
第三个的起始地址亦是如此,是第二的起始地址加上分区长度,即
75168135

观察他们的起始地址:可以看出他们是连续的。故验证了分区与分区间是连续的。我们可以通过第一个分区的参数,推导出第二个分区的起始地址。

所以我们得出在主分区(主磁盘分区)的开始扇区号,都是绝对扇区号,我们可以直接在go to sector界面直接能搜索到他们。

0x2 扩展磁盘分区分析

前面我们说过,如果把逻辑磁盘跟分区假定为一 一对应的关系,那么磁盘上仅会有四个,但是实际上并不会只有四个逻辑盘,而Windows处理这个就用了扩展分区这个概念,将多的分区以单链表的形式进行联通。
所以扩展分区实际上来说是指向下一个用来定义分区的指针,我们下面来详细看看。

可以看到GHIEF都是逻辑驱动器,显然超过了四个。
逻辑驱动器

这几个大概是20GB转换成扇区为单位大概就是 41943040
用winhex找一下,发现它的Partition type是0x0F 对照手册,发现代表的是扩展分区

在这里插入图片描述

可以看到这就是一个扩展分区,我们且称它为主扩展分区,它其实是一个指针,并不代表实际的驱动器,我们跳到这个扇区地址看一看。

看来扩展分区指向的地址并无引导代码,继续往下看
在这里插入图片描述
看到最后有一个结束标志,这是主扩展分区所索引到的地方,里面有两个表项
我们称它为EBR1

蓝色部分就是表项,它仅有两个表项

看一下分区模板


惊奇的发现扩展分区指向的已经不是绝对扇区号了,看到分区表的第一个表项是63,而不是所在的扇区地址加63,所以它是以一个相对值,它的绝对值是之前的
绝对值基址
加上63,所以这个大约4GB的逻辑盘的绝对地址应该是43728930 + 63 = 43728993扇区。
我们再往下看看第二个表项,它也是一个相对地址,并它的type是05,表明它不是实际的一个逻辑盘,而仍然是一个指针,指向一个扩展分区,我们先计算出它的绝对地址是8369865 + 43728930 = 52098795扇区,跳到那里去

下一个扩展分区

观察分区模板,这就是EBR2的分区表结构,仍然是两个,我们可以相信,它是一个类似于下面的一个结构体

struct EBR {
	struct *LOGICALDRIVE logicDrive;//指向一个逻辑盘
	struct *nextEBR;//指向下一个EBR
};

在这里插入图片描述
注意的是EBR2的分区表第一个表项的是相对于EBR2的扇区地址,是一个相对值,而我们的基址是之前我们跳过来的那个地址,即52098795扇区,所以该逻辑盘的绝对扇区地址是52098795 + 63

而对于分区表第二个表项,我们发现此时63 + 6297417 != 14667345
而EBR1与这个的相对扇区地址是63 + 8369802 + 63 + 6297417 正好为 14667345,说明了它是以EBR1作为参照点的。

由此我们可以得出,EBR的逻辑盘地址相对扇区地址是以当前EBR作为参考的,而第二项的地址,是以EBR1为参照的。我们最后再来验证下是不是对的
跳到下一个扇区地址14667345 + 43728930 = 58396275

EBR3的分区表如图所示
EBR3
EBR3分区模板
验证下第二项是63 + 6281352 +14667345 = 20948760 +(10485760 + xxx)(因为我这里有一个5G的空闲空间插到中间了进来了= 31439205 ,它照理来说应该是以EBR1为基址的。

我们用进入diskpart查看一下该磁盘的分区表:
diskpart

我们可以看到分区5和6之间差了好大一块,所以就是那块5G的大空间插进去无疑,但是并不影响我们的链表,只是偏移有了点问题。

发一张非常好的结构图,你们可以参考下:
下面的地址跟我上面不一致的,不要见怪,不过原理是完全一致。
结构图我们至此可以总结出,一个MBR最多可管理四个分区,但根据实际需求需要更多的逻辑磁盘,所以扩展分区便为我们所用,每个EBR管理一个逻辑驱动器,并且可以索引到下一个EBR。

什么是MBR引导引导扇区?什么是分区扩展分区、逻辑分区?什么是活动分区、引导分区、系统分区、启动分区?一下子罗列这么多概念,恐怕很多人都搞不清它们的区别和联系吧。网上虽然不少解释,但很多是模棱两可甚至是错误的,反而越弄越糊涂。猫猫煞费苦心的把这一大串概念研究了很长时间,试图搞明白,为了以后查阅方便,于是把对这些概念的理解总结了一下。而要想分清这些概念,真要费一点脑筋啊! 一、MBR引导扇区 首先简要介绍MBR引导扇区的关系。 引导扇区是硬盘0号柱面,0号磁头的第一个扇区,大小为512字节。(注:硬盘可以用柱面、磁头和扇区定位) MBR,占用引导扇区的前446字节,紧随其后的64字节是分区表DPT,最后还剩两个字节则恒为55AA,表示结束符号。(下图,演示了它们的位置关系) 然后,具体说一说MBR分区表。 MBR,全称为Master Boot Record,即硬盘的引导记录。MBR,共446字节,一般在操作系统安装时写入,但它并不属于操作系统MBR就是一段引导程序,用于检测磁盘分区合法性和加载操作系统,它的重要作用就是识别活动分区,并引导操作系统分区表DPT,共64字节,记录了硬盘有多少分区以及分区的各种属性。由于一个分区的信息要占用16字节,所以分区表只能定义4个分区,这就是为什么我们说硬盘一般最多只能分为4个分区(这里说“一般”是对基本磁盘而言,而对于动态磁盘则无此限制,但大部分都在使用基本磁盘,可以暂不考虑 )。 计算机开机后BIOS加电自检,一切正常后,找到第一个启动设备(一般就是硬盘),然后从这个启动设备的引导扇区读取MBRMBR这段引导程序识别活动分区,引导操作系统。 二、分区扩展分区、逻辑分区 正如前面所讲,分区是由引导扇区中64字节的分区表所定义的,最多只能有4个。但为了满足更多分区的需求,变产生了扩展分区。形式上,如果拥有扩展分区,就必须牺牲一个分区,而且最多有一个扩展分区,也就是说:分区+扩展分区<=4 and 扩展分区<=1。因此扩展分区也可以看成一种特殊的分区。 但扩展分区并不可以直接使用,扩展分区又必须以逻辑分区的形式出现,可以这样认为:扩展分区包含着若干逻辑分区,而且至少包含一个。 扩展分区中的逻辑分区是以链式存在的。即每一个逻辑分区都记录着下一个逻辑分区的位置信息,依次串联。事实上每一个逻辑分区都有一个和引导扇区类似的引导扇区,引导扇区里有类似的分区表。该分区表记录了该分区的信息和一个指针,指向下一个逻辑分区的引导扇区。 因此,逻辑分区是借鉴了分区的方法,相当于在一个分区下面建立了若干级“分区”。从上面的描述,猫猫推测,逻辑分区是建立在操作系统级别,由操作系统识别的。另一个可以预测的现象是:一旦某一个逻辑分区损害,跟在它后面的所有逻辑分区都将丢失,而前面的逻辑分区去可以保留。这也是链式结果的特点。 三、活动分区、系统分区、启动分区、引导分区 这四个术语和前面三个不同,前面三个是讲述分区的“物理”形成。而这四个术语描述了分区的功能,并且更易混淆。 首先,根据Windows XP随机帮助文档看,引导分区就是启动分区,两者是同一概念,所以下面就只讨论活动分区、系统分区和启动分区。 系统分区和启动分区比较。 这是两个极易混淆的概念,因为两者的含义似乎和它们的名字正好颠倒了。Windows帮助文件的术语表里是这样解释他们的:”系统分区,包含加载 Windows(例如,Ntldr、Osloader、Boot.ini、Ntdetect.com)所需的硬件特定文件的分区。系统分区可以(但不是必须)与启动分区相同。启动分区,包含 Windows 操作系统及其支持文件的分区。启动分区可以(但不是必须)与系统分区相同。“ 看起来是很糊涂,但说的简单些就是:系统分区包含Ntldr、Osloader、Boot.ini、Ntdetect.com等文件,而启动分区包含Windows和system32文件。所以,真正包含操作系统内核文件的分区是启动分区,包含操作系统引导文件的确实系统分区,这是要特别注意的一点。 有些人就疑问了,我的Ntldr、Osloader、Boot.ini、Ntdetect.com和Windows、system32文件都在C盘,那是怎么回事?这很容易解释,你的C盘既是系统分区也是启动分区,只安装一个操作系统的计算机大都属于这种情况 ,所以微软在括号里说“但不是必须”。 其实系统分区时针对引导来说的,而启动分区时针对操作系统来说的。像我的电脑C盘先安装了Vista,后来D盘安装了XP,现在C盘是系统分区;至于哪个是启动分区,就要看我用那个系统了,进Vista,C盘就是启动分区,进XP,D盘就是启动分区。(再强调,启动分区包含Windows内核文件,而系统分区才包含操作系统引导文件,不然会越看越糊涂的。) 最后要搞明白的是活动分区,这一点,比较麻烦。 Windows帮助文档里的定义是:”活动分区,基于 x86 计算机的启动分区。活动分区必须是基本磁盘上的分区。如果只使用 Windows,则活动分区可以与系统卷相同。“补充说明有:活动分区必须是分区,一块硬盘上只可以有一个活动分区。其他分区可以被标记为活动分区。 而从引导扇区处看,活动分区仅仅是在分区表中,16个字节的最前面含有80标志的分区信息所定义的分区。 但猫猫对Windows帮助文档的定义不敢苟同(也许是我错了,但是我思来想去,只有这样可以解释通)。首先,我们知道活动分区是通过引导扇区的分区表标记的,所以理论上,每个分区都可以被标记为活动(只是不当的标记会导致系统无法启动)。Windows帮助文档说活动分区,是基于x86的计算机的启动分区,那不就是说是Windows文件所在分区。可是对于双系统来说,这种说法显然不对,因为双系统的启动分区是依据被启动的系统而定的。所以,我假定微软也把系统分区和启动分区的概念搞混淆了。 所以,结果变为,活动分区是基于x86计算机的系统分区。换句话说,活动分区是一种系统分区。在这种情况下,一个分区是不是系统分区似乎并不具有价值,只有被标记为活动的分区才有价值。因为,只有标记为活动分区,这个系统分区Windows启动支持文件才会被加载,然后通过这些引导存储在启动分区Windows内核文件,完全Windows的启动。 所以,Windows可以被安装在逻辑分区内(我发现我的电脑就是这样的),但必须在活动分区的启动支持文件里加上对这个逻辑分区Windows的引导信息。具体到XP,就是boot.ini文件添加上对双系统的引导,而这个boot,ini文件必须在启动分区。而我了一个实验,在XP下面通过启动和故障恢复对话框修改boot.ini文件,发现修改的并非XP所在的分区的boot.ini,而是Vista所在分区的boot.ini。(我在分区C盘安装了Vista,逻辑分区D盘安装了XP)。同时,我通过软件废除Vista的新式引导方式,恢复xp的boot.ini式引导方式(此时,C盘Vista已无法引导),发现分别修改C盘和D盘的boot.ini,只有C盘的boot.ini才有效。再次印证了我的假设。 另外,如果两个系统都安装在分区,则可以通过标记各自的安装分区为活动分区,而启动不同的操作系统。 参考资料: Linux引导过程内幕:http://www.ibm.com/developerworks/cn/linux/l-linuxboot/ 维基百科-引导扇区:http://zh.wikipedia.org/wiki/%E4%B8%BB%E5%BC%95%E5%AF%BC%E6%89%87%E5%8C%BA 硬盘引导记录详解(汇编代码详解):http://www.cnblogs.com/woodfish1988/archive/2007/11/25/971482.html Windows XP随机帮助文档(Windows帮助文档是一个很好的东西,有些人优化系统竟然把它删了,真是太不应该了。 呵呵,本文地址,猫猫的园地:http://blog.mm-share.cn/post/Partition-Comparison.html 写了这么多,希望对大家有所帮助。若有不足之处,望方家指正!另外,还有基本磁盘、动态磁盘,卷和分区的区别等待问题,还要进一步研究。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值