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

xizero00 xizero00     2022-11-15     375

关键词:

前言

忙了一个学期的事情,现在终于闲下来了,搞数据恢复,前前后后,也搞了一年多了,说起来不长也不久,为了参加全国信息安全竞赛,不知道花了多少时间,可是结果就是连复赛都没进,这也许是体制内的东西,这些,我们无法改变,既然花了那么多时间,就一定要让这些知识发挥他们的作用,本来打算在自己不忙的时候整理整理期间做的一些东西和资料放到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文件系统的相关知识,敬请期待。

 

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

...言忙了一个学期的事情,现在终于闲下来了,搞数据恢复,前前后后,也搞了一年多了,说起来不长也不久,为了参加全国信息安全竞赛,不知道花了多少时间,可是结果就是连复赛都没进,这... 查看详情

手把手教你做项目多线程篇——基础知识详解(代码片段)

多线程导读项目中多线程的目的实战操作小知识创建一个简单的线程守护线程主进程等待子进程结束共享全局变量的特性锁互斥锁信号量送点资源导读随着暑假的推进,手把手教你做项目前边的准备也差不多了后续的项目也... 查看详情

手把手教你做项目web框架flask篇——基础用法详解(代码片段)

目录导读为什么用flask安装flask启动flaskflask里name的用处转换器和变量规则重定向设置错误页面json数据读取cookie和session对cookie的获取和删除session操作request的使用蓝图开发必备视图资源分享导读今天接着为暑假的项目做准备,... 查看详情

手把手教你做项目mysql篇——从下载到命令总结(代码片段)

目录导读下载MySQL篇基础命令篇操作前的提示登录篇对数据库命令操作篇对表的操作删除表(这个单独说一下)对数据操作篇结尾送书导读有段时间没有好好整理文章了,这不是又该暑假啦嘛肥学准备在暑假来波大的&... 查看详情

手把手教你学numpy,搞定数据处理——收官篇

本文始发于个人公众号:TechFlow,原创不易,求个关注今天是Numpy专题第6篇文章,我们一起来看看Numpy库当中剩余的部分。数组的持久化在我们做机器学习模型的研究或者是学习的时候,在完成了训练之后,有时候会希望能够将... 查看详情

《手把手教你》系列基础篇(七十二)-java+selenium自动化测试-框架设计基础-testng简单介绍(详解教程)(代码片段)

1.简介前面文章细心的小伙伴会发现宏哥在运行测试用例的时候有的是在main方法下,而有的不需要用main方法去执行用例,那么为什么有的就不需要在main方法下就能够成功运行测试用例了。这就需要单元测试框架的支持,这篇宏... 查看详情

实战篇:手把手教你linux安装mysql(细致入微)(代码片段)

作者简介作者:LuciferLiu,中国DBA联盟(ACDU)成员。目前从事OracleDBA工作,曾从事Oracle数据库开发工作,主要服务于生产制造,汽车金融等行业。现拥有OracleOCP,OceanBaseOBCA认证,擅长Oracle数据库运维开发&#... 查看详情

手把手教你实现java权限管理系统前端篇(十六):系统备份还原

系统备份还原在很多时候,我们需要系统数据进行备份还原。我们这里就使用MySql的备份还原命令实现系统备份还原的功能。后台接口准备系统备份还原是对数据库的备份还原,所以必须有后台接口的支持,我们准备好了接口,... 查看详情

一基础折线图详解《手把手教你echarts数据可视化详解》(代码片段)

注:本系列教程需要对应JavaScript、html、css基础,否则将会导致阅读时困难,本教程将会从ECharts的官方示例出发,详解每一个示例实现,从中学习ECharts。ECharts官方示例:https://echarts.apache.org/examples/zh/index.html一、折线图我们打开... 查看详情

二基础平滑面积折线图与折线堆叠面积堆叠《手把手教你echarts数据可视化详解》(代码片段)

...ECharts官方示例:https://echarts.apache.org/examples/zh/index.html《手把手教你ECharts数据可视化详解》目录一、基础折线图详解一、平滑的折线图在上一节的折线图中,我 查看详情

实战篇手把手教你接lsi9211-8i卡

小编马上手把手教你一次接8个硬盘,为批处理修复硬盘做好准备。先让大家看一下整体接法一览图。650)this.width=650;"src="https://s3.51cto.com/wyfs02/M00/9A/0B/wKioL1lQrijzDYFbAA0W6WMZnxs349.jpg-wh_500x0-wm_3-wmp_4-s_3391867225.jpg"title="连接示意图.jpg"alt 查看详情

c#多线程(16):手把手教你撸一个工作流(代码片段)

...注入实现工作流解析前言前面学习了很多多线程和任务的基础知识,这里要来实践一下啦。通过本篇教程,你可以写出一个简单的工作流引擎。本篇教程内容完成是基于任务的,只需要看过笔者的三篇关于异步的文章,掌握C#基... 查看详情

《手把手教你》系列基础篇(七十三)-java+selenium自动化测试-框架设计基础-testng实现启动不同浏览器(详解教程)(代码片段)

1.简介上一篇文章中,从TestNg的特点我们知道支持变量,那么我们这一篇就通过变量参数来启动不同的浏览器进行自动化测试。那么如何实现同时启动不同的浏览器对脚本进行测试,且听我娓娓道来。2.项目实战2.1创... 查看详情

实战篇:手把手教你如何快速安全的升级oracle数据库,包学包会!❤️2021最新升级秘籍⭐️建议收藏❤️(代码片段)

作者简介作者:LuciferLiu,中国DBA联盟(ACDU)成员。目前从事OracleDBA工作,曾从事Oracle数据库开发工作,主要服务于生产制造,汽车金融等行业。现拥有OracleOCP,OceanBaseOBCA认证,擅长Oracle数据库运维开发&#... 查看详情

两万字零基础爬虫requests初阶教程,手把手教你爬数据(建议收藏)(代码片段)

文章目录一、环境与工具二、学爬虫必备知识三、requests体验四、get请求3.1基础讲解一3.3基础讲解二3.2基础讲解三3.4获取cookie3.5获取请求头3.6添加请求头3.5知乎爬取+反扒技术3.6抓取二进制数据3.6.1示例一3.6.2示例二3.7美女私房... 查看详情

一基础折线图详解《手把手教你echarts数据可视化详解》(代码片段)

注:本系列教程需要对应JavaScript、html、css基础,否则将会导致阅读时困难,本教程将会从ECharts的官方示例出发,详解每一个示例实现,从中学习ECharts。ECharts官方示例:https://echarts.apache.org/examples/zh/index.h... 查看详情

一基础折线图详解《手把手教你echarts数据可视化详解》(代码片段)

注:本系列教程需要对应JavaScript、html、css基础,否则将会导致阅读时困难,本教程将会从ECharts的官方示例出发,详解每一个示例实现,从中学习ECharts。ECharts官方示例:https://echarts.apache.org/examples/zh/index.h... 查看详情

☀️苏州程序大白一文从基础手把手教你python数据可视化大佬☀️《❤️记得收藏❤️》(代码片段)

☀️苏州程序大白一文从基础手把手教你Python数据可视化大佬☀️《❤️记得收藏❤️》目录🏳️‍🌈开讲啦!!!!🏳️‍🌈苏州程序大白🏳️‍🌈🌟博主介绍前言数据关系可视... 查看详情