手把手教你数据恢复编程基础知识篇
Posted xizero00
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手把手教你数据恢复编程基础知识篇相关的知识,希望对你有一定的参考价值。
前言
忙了一个学期的事情,现在终于闲下来了,搞数据恢复,前前后后,也搞了一年多了,说起来不长也不久,为了参加全国信息安全竞赛,不知道花了多少时间,可是结果就是连复赛都没进,这也许是体制内的东西,这些,我们无法改变,既然花了那么多时间,就一定要让这些知识发挥他们的作用,本来打算在自己不忙的时候整理整理期间做的一些东西和资料放到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文件系统的相关知识,敬请期待。
以上是关于手把手教你数据恢复编程基础知识篇的主要内容,如果未能解决你的问题,请参考以下文章