手把手教你数据恢复编程(一)基础知识篇

时间:2022-11-29 00:03:01

前言

忙了一个学期的事情,现在终于闲下来了,搞数据恢复,前前后后,也搞了一年多了,说起来不长也不久,为了参加全国信息安全竞赛,不知道花了多少时间,可是结果就是连复赛都没进,这也许是*内的东西,这些,我们无法改变,既然花了那么多时间,就一定要让这些知识发挥他们的作用,本来打算在自己不忙的时候整理整理期间做的一些东西和资料放到CSDN上,现在正好有空。其实知识并不是让评委来评价的,大家都知道,所谓的教授,就是拿着国家的钱做自己的事情的一群人,当然,有些教授还是好的,这里我不想说多少。

好了,废话不多,接下来咱们看正题

磁盘分区及分区表结构

首先,我们先了解一下磁盘分区的结构以及分区表是怎么构成的。

在磁盘存储,磁盘分区指是在磁盘上划分几个逻辑部分,称为分区。不同类的目录与文件可以存储进不同的分区。磁盘分区具有多种分区结构,如MBR磁盘分区、动态磁盘分区及GPT磁盘分区等。其中,MBR磁盘分区是最常见的分区结构,它通过分区表实现对磁盘分区的管理。如果分区表被清除或者破坏,则磁盘的分区就会丢失。图1显示了Windows系统(MBR磁盘分区)中的磁盘分区及分区表结构。

手把手教你数据恢复编程(一)基础知识篇

图1 磁盘分区结构

从图1中可以看出,在磁盘分区(Windows系统)中,分区的结构主要由MBR(Master Boot Recorder 即主引导记录)中的MPT(Main Partition Table 即主分区表)和EBR(Entended Boot Recorder 即扩展引导记录)中的EPT(Entended Partition Table  即扩展分区表)决定。下面,我们将对MBR和EBR结构进行详细分析。

(1)主引导记录MBR(Master Boot Record)结构分析

主引导扇区位于整个硬盘的0柱面0磁头1扇区{(柱面,磁头,扇区)|(0,0,1)}。BIOS在执行自己固有的程序以后就会跳转(Jump)到MBR中的第1条指令。将系统的控制权交由MBR来执行。

主引导扇区主要由三部分组成:主引导记录 MBR、硬盘分区表 DPT(Disk Partition Table)和结束标志字3大部分组成。表1显示了MBR主引导记录的结构。

表1 主引导记录结构

位置

长度(字节)

字段名

0x00~0x1B7

440

引导程序

0x1B8~0x1BB

4

磁盘签名

0x1BC~0x1BD

2

保留区域

0x1BE~0x1FD

64

分区表项(分区结构信息)

0x1FE~0x1FF

2

结束标志

下面我们将详细介绍各个字段的含义。

(1)0x00~0x1B7:引导程序指明该分区是否是活动分区,它占MBR的前440字节。

(2)0x1B8~0x1BB:Windows磁盘签名,它占用引导程序后的4字节,是Windows系统对硬盘正常化时写入的一个磁盘标签。

(3)0x1BC~0x1BD:保留区域。

(4)0x1BE~0x1FD:分区表(Disk PartitionTable,DPT)。硬盘分区表占据MBR扇区的64个字节,它可以对四个分区的信息进行描述,其中每个分区表项的信息占据16个字节,具体每个字节的定义如表2所示。

(5)0x1FE~0x1FF:结束标志字“55 AA”,它是MBR扇区的最后两个字节,是检验主引导记录是否有效的标志。

表2 磁盘分区表项结构

偏移

长度(字节)

意义

0x00

1

分区状态:00—>非活动分区;80—>活动分区

其他数值没有意义

0x01

1

分区起始磁头号,用到全部8位

0x02

2

分区起始扇区号,占据0x02的位0—5;

该分区的起始磁柱号,占据0x02的6—7位

和0x03的全部8位

0x04

1

文件系统标志位

0x05

1

分区结束磁头号,用到全部8位

0x06

2

分区结束扇区号,占据0x06的位0—5;

该分区的起始磁柱号占据0x06的位6—7和0x07的全部8位

0x08

4

分区起始绝对扇区

0x0C

4

分区总的扇区数

在表2中,分区表项的第1字节为分区的引导标志,只能是0x00和0x80。0x00表示非活动分区,0x80表示活动分区。其余值对Microsoft而言为非法值。大于1字节的数值被以低字节在前的存储格式顺序保存下来。

关于Little Endian 和Big Endian,其实就是数据在磁盘中的表示方式而已,不必惊慌。

所谓Big Endian是指最低位地址存放高位字节,可称高位优先,内存从最低地址开始按顺序存放(高数位数字先写)。最高位字节放最前面。

所谓Little Endian是指最低位地址存放低位字节,可称低位优先,内存从最低地址开始按顺序存放(低数位数字先写)。最低位字节放最前面。

例如,“本分区之前使用的扇区数”字段的值0x3F000000就是Little Endian格式的,按照习惯的高位在前的方式(即正常我们看数字的方式,注意,这里以0x开头是说明表示方式为16进制)应该表示为0x0000003F,这个数值的十进制值为63。

“本分区之前使用的扇区数”就是该分区的相对起始扇区号,是以LBA值来表示的。这个值也可以称为隐藏扇区数。

系统在分区时,各分区都不允许跨柱面,即均以柱面为单位,这就是通常所说的分区粒度。在分区时输入分区的大小 为7000MB,结果分出来却是6997MB,就是这个原因。

分区表项的第3和第4个字节分别是起始扇区号和起始磁柱号,起始扇区号占6位,起始磁柱号占10位。以“起始扇区号”为例,其低6位用扇区数的二进制表示,高两位用做柱面数10位中的高两位。由此可知,实际上用这种方式表示的分区容量是有限的。

柱面和磁头从0开始编号,扇区从1开始编号,所以最多只能表示1024个柱面*63个扇区*256个磁头*512Byte=8455716864Byte,即通常的8.4GB限制。

实际上磁头数通常只用到255个(由汇编语言的寻址寄存器决定),即使把这3字节按线性寻址,依然力不从心。在后来的操作系统中,通过8.4GB的分区其实已经不通过C/H/S的方式寻址了。而是通过偏移0x0C~偏移0x0F共用4字节32位线性地址来表示分区占用的扇区总数。可知通过4字节可以表示 4294967296个扇区,即2048GB,目前对于大多数计算机而言,这么大的分区已经够用了。在未超过8.4GB的分区上,C/H/S的表示方法和线性扇区的表示方法所表示的分区大小是一致的。也就是说,两种表示方法是协调的。即使不协调,也以线性寻址为准。超过8.4GB的分区结束C/H/S一般填充为FEH/FFH/FFH,(这里的H是指16进制)即C/H/S所能表示的最大值。

(2)扩展分区EBR(Extended Boot Record)结构分析

根据MBR的分区表的结构(即MBR中只有四个分区表项),一个物理磁盘最多可以分为4个逻辑磁盘(分区)。对于具体的应用,4个逻辑磁盘往往不能满足实际需求。为了建立更多的逻辑磁盘供操作系统使用,系统引入了逻辑分区的概念。所谓逻辑分区,严格地讲它并不是一个实际意义的分区,它仅仅是一个指向下一个用来定义分区的参数的指针,这种指针结构形成一个单向链表。这样主引导扇区中除了主磁盘分区外,仅需要存储一个被称为扩展分区的分区信息,通过这个扩展分区的信息就可以找到下一个分区的起始位置,从此起始位置类推可以找到所有的分区。

EBR主要包括分区表和结束标志“55 AA”,没有引导代码。扩展分区中4个分区表项并不是全部被使用,而是使用其中的前2个表项。其中,第1个分区表项描述一个文件系统分区以及该分区的大小。第2个分区表项描述出下一个扩展分区的起始位置及大小。扩展分区的结构如图2所示。表3显示了EBR中扩展分区表(EPT)项的详细信息。

手把手教你数据恢复编程(一)基础知识篇

图 2 扩展分区结构

表3 EBR中的EPT表项各个参数

位置

长度(字节)

字段名

0x1BE

1

引导标志

0x1BF

1

开始磁头

0x1C0

1

起始扇区

0x1C1

10位

起始柱面

0x1C2

1

分区的类型描述

0x1C3

1

结束磁头

0x1C4

6位

结束扇区

0x1C5

10位

结束柱面

0x1C6~0x1C9

4

本分区之前使用的扇区数

0x1CA~0x1CD

4

分区的总扇区数

0x1CE~0x1FD

48

分区表项

       接下里,我们将详细介绍表3中EBR的EPT表项的各个参数。

(1)0x1BE~0x1BE:引导标志,指明该分区是否为活动分区。

(2)0x1BF~0x1BF:开始磁头。

(3)0x1C0~0x1C0:起始扇区,共占用6位,只用了0~5位,后面两位(第六位和第七位)被开始柱面字段所使用。

(4)0x1C1~0x1C1:起始柱面,共占用10位,最大值为1023。

(5)0x1C2~0x1C2:分区表类型描述,定义了分区的类型。

(6)0x1C3~0x1C3:结束磁头。

(7)0x1C4~0x1C4:结束扇区,共占用6位,只用了0~5位,后面两位(第六位和第七位)被开始柱面字段所使用。

(8)0x1C5~0x1C5结束柱面。结束柱面是一个10位的数,最大值位1023。这里需要注意的是由于现在计算机已经基本上不使用C/H/S的寻址方式。

(9)0x1C6~0x1C9:本分区之前使用的扇区数,指从该磁盘开始到该分区开始之间的偏移量,以扇区数来表示。

(10)0x1CA~0x1CD:分区的总扇区数,指该分区所包含的扇区总数。

(11)0x1CE~0x1FD:分区表项。第一个分区表项是用来管理第一个逻辑驱动器,第二个分区表项是一个扩展分区,第三个和第四个一般是空的,没有数据。

 

总结一下:这里我们介绍了分区、分区表、分区表项以及数据在磁盘上的表示方法,下一篇,将介绍NTFS文件系统的相关知识,敬请期待。