0x01数据的温床----硬盘
我们都知道计算机中的数据都存储在硬盘上,那么硬盘的物理组成和逻辑结构是怎样的呢?
- 先来看一下硬盘的物理组成
硬盘的外部结构:
接口(电源接口+数据接口)
硬盘控制电路
固定面板
硬盘的内部结构:
盘片、磁头、盘片主轴、控制电机、磁头控制器、数据转换器 -
寻址方式
磁头和柱面
磁头(0-1023)
柱面(0-255)
扇区(0-63)
因此CHS参数可以寻址的磁盘最大容量为
256102463*512/1048576 = 8064 MB(1M=1048576 Bytes)
-
逻辑结构
硬盘逻辑结构
其中位于整个硬盘的0柱面0磁头1扇区(硬盘的第一个扇区)存放着MBR即硬盘主引导记录,其包含
-
MBR(446字节)
-
DPT(4个共64字节)
描述各分区基本信息
DPT中各字段含义 -
引导扇区标记(结束标记,占4字节)
-
0x02什么是文件系统
程序运行时需要读取数据,用户也需要将数据存放在固定的地方,但是作为用户并不能直接操作磁盘,这就引出了文件系统——一种磁盘的抽象形式,便于用户使用,也就是说文件系统将其接触到的物理特性转化为用户看得见的路径名和文件名,从而用户不用和磁盘打交道就能操作文件。
下面用虚拟机中的一个FAT32格式的磁盘来具体学习一下这种文件系统,先看一下引导扇区基本情况
重要信息:
- 每个扇区512字节
- 每簇16个扇区即8192B=8KB【相当于地址偏移2000】
- 保留扇区38个
- FAT表大小为10901个扇区,即10901*512B【相当于偏移552a00】
0x03 FAT32文件系统
FAT32文件系统组成名词解释
- FAT:文件分配表
- 簇:文件分配的最小单位(一般为512B的2^n倍)
- 簇链:目的是存储一个大文件,在文件占用簇的对应簇号的FAT项,填写下一个簇的簇号,如果为最后一簇,则输入结束标识"FFFFFF0F"
每部分功能
-
引导扇区:描述分区属性(分区大小,簇大小,FAT表个数,分区引导程序)
-
FAT表(文件分配表)
该表由一个个表项组成(大小32字节),每个表项代表一个簇的占用情况,其数值含义如下图
表项数值对应含义 FAT表起始内容
其中:
第0,1项表示FAT表表头,因此真正使用的簇编号从第2项开始第2项表示存储文件系统根目录信息的簇(所以根目录首簇一般都紧跟在FAT2表之后,比如在本机情况下,数据区目录项偏移=FAT2表偏移+FAT2表大小,即557600+hex(10901*512)=AAA000),另外注意到第二项值为0x0FFFFF,表示目录项只占用了一个簇
本机情况下目录项起始地址为aaa000,且只占用了一个簇
随后从编号3的簇开始如果需要存储大的文件,就会形成簇链表,其形成方式就是将下一个簇号写在该处,最后一簇结束标志为0x0FFFFFF
如本例中从第三簇开始到第五簇为一个簇链
上面形成的簇链是从第三簇开始到第五簇结束,第三簇起始地址为【根目录偏移+一簇偏移=aaa000+2000=aaac00]
第三簇起始地址
-
数据区【从第二簇起算】
- 存储目录项,包括文件目录情况和文件名等等
image.png- 存储具体文件数据
tip:根据簇号寻找对应文件位置
根据前面的信息知道一簇大小为8KB,换算成16进制相当于地址偏移2000,根目录相当于第二簇。因此若已知簇号为7,其对应数据区的偏移地址为2000*(7-2)
在目录项之后的簇中就会存放具体的文件数据
- 存储具体文件数据
存储文件时流程
-
按照文件大小定位足够空闲簇
比如在当前磁盘根目录下存放一个名为test.txt的文件,其大小为1KB,但是也会占用一个簇 -
创建目录项
test.txt的目录项信息,对照上面表一信息可知文件首簇号为00000003
-
在FAT表中构建簇链表
FAT表中簇号为3的簇存放test.txt的内容 -
在对应分配的簇中写入数据
相对根目录的偏移为2000*(3-2)=2000,使用winhex中跳转功能从根目录跳转2000到数据区看到具体的数据。
数据
0x04 删除文件后的恢复原理
- 删除操作做了什么?
- 将首簇高位修改
- FAT表中的簇链表清空
- 文件数据并无变化(PS:但此时这些区域可以被覆盖)
- 如何恢复
还原文件名首字节
长文件名:直接逆向定位完整文件名。
确定高位并还原
参考相邻目录项的首簇高位
从0往上试探,看首簇指向内容是否为预期文件头部
修复FAT表簇链
通过文件大小计算所占簇数
按照连续存储假设,进行簇链修补,其中末簇FAT项用0FFFFFFF结尾。
网友评论