本系列科普贴一共分为3章。按照镜像,分区表,文件系统顺序依次递进。上一章是取证常见文件格式科普贴,本章聊分区表。
0x01 分区表是为了划分土地
隔壁老王家有一块祖上传下来的土地,他今年希望一半种玉米,一半种小麦。所以他把土地一分为二,中间用一个栅栏隔开。无论是播种还是施肥都分开管理。这就是分区表的意义:你有一块磁盘,为了将不同用途的文件分开存放便于管理就可以使用分区表将磁盘划分为不同分区。通过各种工具(比如Disk Genius)或者命令(比如mkfs)可以将分区转化为可以直接使用的文件系统。
一年过去了,隔壁老王觉得还是种玉米来钱快。于是他把所有栅栏撤掉,全部撒上了玉米种子。如果你对某块磁盘的规划单一明确,就可以直接对整个磁盘格式化为相应文件系统而不需要分区表的存在,此时文件系统会尽可能吃掉全部的空间。
土地是很难做到被100%利用的,浪费的原因是老王有完美主义强迫症。在使用了分区表的情况下,用于隔开分区的栅栏本身就会占用部分空间。第一个分区的起始位置不是紧贴着分区表的。即使排除以上的浪费,文件系统是严格按照簇的单位使用土地的,不被簇整除的土地会被抛弃。(下一章文件系统再聊簇)
0x02 分区表第一代:MBR
MBR(Master Boot Record)是第一代被使用的分区表,存在于磁盘的第一个扇区。放张图给大家感受一下(在010 Editor中加载Driver.bt模版也可以看下如下的图):
关于MBR能聊的东西很多,我们挑重点来看这张图:
MBR以末尾
55 AA
作为标志符。顺着55 AA
往前推64个字节(每个分区16个字节)存4个分区信息。比如下图选中的部分:第1个字节如果值是0x80表示该分区能作为启动分区。如果在下面4个分区项第一个字节都不是0x80可以初步推断这个磁盘上没有操作系统,很可能是数据分区。就不用浪费时间仿真了。
第5个字节的07代表分区内文件系统类型,但是这个值是不可信的。根据上一章所说,这个东西类似扩展名,只是提示类型。具体类型以分区内实际十六进制为准。
从第9个字节开始4个字节(
3F 00 00 00
)代表该分区的其实位置,以扇区为单位。最后4个字节代表该分区的总大小,也是以扇区为单位。
0x03 MBR的弊端(不支持2T硬盘是致命伤)
- MBR使用64个字节描述4个分区信息,那如果分区数大于4个如何处理呢?扩展分区是为了尽可能使用每一寸硬盘而设计的,整体复杂度很高。
- 每个分区中4个字节描述分区起始位置,其最大值是0xFFFFFFFF,按照大多数扇区大小是512字节计算那么最大的寻址空间大概2T。那大于2T的硬盘就会有很大的浪费。
- MBR中混用CHS寻址和LBA寻址,CHS寻址也是当年机械硬盘时代横行的产物。根据CHS计算真实位置其复杂程度令人发指,又要引入一堆概念。LBA就是看见多少就是多少。
0x04 GPT闪亮登场(34个扇区解决所有问题)
GPT(GUID Partition Table)拥有以下几个特性:
- 占据磁盘前34个扇区,通过prtected MBR与传统MBR区别开。
- 用32个扇区存放分区信息,每个分区信息占用128个字节。所以最多支持128个主分区。
- 采用8个字节描述分区起始地址与长度。最大磁盘能支持到8 ZiB (264 扇区数 × 512字节 )。
- 当年有大量攻击MBR的病毒,在操作系统加载前运行,所以重装系统也无法解决。GPT配合UEFI引导时,操作系统引导程序被存放在ESP分区,UEFI安全启动以及固件中存储的证书与平台固件之间创建一个信任源,可以确保在加载操作系统之前,能够执行已签名并获得认证的“已知安全”代码和启动加载程序。这从根源上杜绝"鬼影病毒"。
- GPT会备份自身分区表,头部被损坏还有副本。
0x05 GPT数据结构
-
GPT分区表第一个扇区是Proteted MBR。如下图所示:注意图中标识的红色部分,GPT区别于MBR的地方就在于第一个分区表项分区系统类型为
EE
。 -
GPT分区第二个扇区是Partition Table Header。因为第一个扇区几乎没用上,这个扇区其实就是一些描述GPT自身信息的一些数据结构。比如备份分区表位置,第一个可用扇区(一般是
0x22
表示GPT自身占34个扇区),一共可用的扇区数。PartitionLBA就是下面分区表所在扇区(一般都是2,但是是代表第3个扇区)。每个分区表占字节大小(0x80
),一共分区个数。详细见下图: -
从第3个扇区开始是真的分区表。最重要的有三个东西:这是什么类型分区,起始位置,结束位置:图中画红框标注出来的分别是起始与结束位置。
总结:
- 分区表的存在是为了划分磁盘空间,分区表不是必然存在的。但是没有分区表的磁盘必然不能作为系统盘,所以也不用浪费时间仿真。
- 所有的标志符,包括上一章提到的各种文件类型标志符和本章提到的MBR标志符
55 AA
不仅仅起到标识类型的作用,还可以作为CPU字节序的判断标准。所以如果在第一个扇区末尾看到AA 55
也不用惊讶,只是比较少见的大端序。CPU字节序影响后续整数类型的值,比如有4个字节的分区起始扇区,4个字节分区大小。大端和小端看到的值差的真大。 - 技术总是趋向于简单而又实用方向发展,所以我没有详细说MBR中的CHS寻址,也没提到主分区和逻辑分区这些东西。陈旧的概念就如同xp让它慢慢死去好了。
- MBR分区表操作系统依赖分区的80标志位,GPT分区表启动项统一存放在ESP分区,Basic Data Partition则用于存放数据。这是提到为什么要关注GPT中分区类型的原因。
- 关于分区表有个有趣的故事,读者自行搜索 硬盘逻辑炸弹。这个话题比这篇文章还精彩。
- 分区表即使被完全损坏也并不是完全没有办法。火眼会自动搜索丢失的分区信息。几乎常见的文件系统都能覆盖到。