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。

猜你喜欢

转载自blog.csdn.net/qq_40890756/article/details/89476292