FAT32的初步理解以及简单的文件删除和恢复

1 FAT32文件系统

FAT文件系统主要有FAT12、FAT16和FAT32几种形式,其中FAT32是FAT发展的最后形式。这里FAT32的意思是簇的编址采用32bit宽度的数,所以FAT32文件系统最多能寻址 2 ** 32 = 4294967296 个簇,其他FAT变种类似。

FAT32文件系统由DBR及保留扇区,FAT1,FAT2和数据区组成:

DBR及保留扇区:DBR的含义是DOS引导记录,也称为操作系统引导记录,在DBR之后往往还会有一些保留扇区。

FAT1:FAT的含义是文件分配表,FAT32一般有两份FAT,FAT1是第一份,也是主FAT。

FAT2:FAT2是FAT32的第二份文件分配表,也是FAT1的备份。

DATA:DATA也就是数据区,是FAT32文件系统的主要区域,其中包含目录区域。

用WinHew打开一个FAT32格式的磁盘,其DBR如下,对内容进行简要的表明。

跳转指令将呈现执行流程跳转到引导程序处;

OEM ID由厂商指定,这里是MSDOS5.0;

BPB记录文件系统相关的重要信息,由BPB和拓展BPB组成,具体参数解释如下:

字节偏移 字段长度(字节) 对应取值 名称和定义
0x0B 2 0x0200 扇区字节数
0x0D 1 0x20 每簇扇区数
0x0E 2 0x080E 保留扇区数
0x10 1 0x02 FAT数
0x11 2 0x0000 根目录项数
0x13 2 0x0000 小扇区数
0x15 1 0xF8 媒体描述符
0x16 2 0x0000 每FAT扇区数(FAT32为0)
0x18 2 0x003F 每道扇区数
0x1A 2 0x00FF 磁头数
0x1C 4 0x00000060 隐藏扇区数
0x20 4 0x03BFFF0A 总扇区数
0x24 4 0x00003BF9 每FAT扇区数
0x28 2 0x0000 扩展标志
0x2A 2 0x0000 文件系统版本
0x2C 4 0x00000002 根目录簇号
0x30 2 0x0001 文件系统信息扇区号
0x34 2 0x0006 备份引导扇区
0x36 12 12字节均为0x00 保留

拓展BPB参数如下:

字节偏移 字段长度(字节) 对应取值 名称和定义
0x40 1 0x00 物理驱动器号
0x41 1 0 x00 每保留
0x42 1 0x29 扩展引导标签
0x43 4 0x5168C523 分区序号
0x47 11 “NO NAME” 卷标
0x52 8 “FAT32” 系统ID

FAT32文件系统在DBR的保留扇区中还安排了一个文件系统信息扇区,用以记录数据区中空闲簇的数量及下一个空闲簇的簇号,该扇区一般在分区的1号扇区,也就是紧跟着DBR后的一个扇区,其内容如下图(其中字节值为零的,都没有被使用):

在DBR之后,就是FAT,文件分配表。FAT一般有两个,一个正常使用称为FAT1,另一个是备份称为FAT2,FAT1和FAT2的内容完全一样。

FAT是一组与数据簇号对应的列表,表项的编号从0开始,但是编号0表示FAT介质类型,编号1表示FAT文件系统错误标志,所以实际存储从2号开始。大文件占用多个簇的话,则FAT项纪录下一个FAT项编号,依次类推直到最后以“0F FF FF FF“表示文件末尾。文件至少占用一个簇,所以新建文件的时候,即使只写入1字节的数据,它也会占用一个簇的空间。

而且,从之前DBR偏移0xB的两字节和00x0D的一字节可以看出,一簇为32扇区,每扇区512字节,一簇大小为16KB。

下面对FAT1的部分内容进行一下标记(图上只标注了0-7项,后面的FAT表项依此类推):

从上图中,可以看到第4-7项存储了一个文件。第4项的存储内容说明下一个簇号在第5项,后面一样,直到第7项表明该文件存储结束。每一项对应一个簇,该文件就占用了4簇。

FAT2和FAT1内容完全一样,不单独拿出分析。

最后是数据区,是真正存储文件内容的区域。数据区紧跟在FAT2之后,被划分成一个个的簇。所有的簇从2开始进行编号,也就是说,2号簇的起始位置就是数据区的起始位置。在WinHex中,根目录起始扇区号即为数据区起始扇区号。

在数据区中,目录所在的扇区,都以32字节划分为一个单位,每个单位称为一个目录项。根目录由若干个目录项组成,一个目录项占用32个字节,可以是长文件名目录项、文件目录项、子目录项等。这些目录项用来存储文件名、文件属性、最后修改时间、最后保存时间等信息。

对短文件目录项(文件名<=8字节且后缀名<=3字节),其字节有如下定义:

字节偏移 字段长度(字节) 定义
0x0 8 文件名
0x8 3 拓展名
0xB 1 属性字节:00000000:读写;00000001:只读;00000010:隐藏;00000100:系统;00001000:卷标;00010000:子目录;00100000:归档
0xC 1 系统保留
0xD 1 创建文件的10毫秒位
0xE 2 文件创建时间
0x10 2 文件创建日期
0x12 2 文件最后访问时间
0x14 2 文件起始簇号的高16位
0x16 2 文件最近修改时间
0x18 2 文件最近修改日期
0x1A 2 文件起始簇号的低16位
0x1C 4 文件长度

对长文件目录项(文件名>8字节或后缀名>3字节),其字节有如下定义:

字节偏移 字段长度(字节) 定义
0x0 1 属性字节位意义:7:保留未用;6:表示长文件最后的目录项;5:保留未用;4:顺序号数值;3:顺序号数值;2:子顺序号数值;1:顺序号数值;0:顺序号数值
0x1 10 长文件名Unicode码1
0xB 1 长文件名目录标志
0xC 1 系统保留
0xD 1 校验值
0xE 12 长文件名Unicode码2
0x1A 2 文件起始簇号
0x1C 4 长文件名Unicode码3

当需要找文件真正存储内容的时候,就可以根据上面目录项的起始簇号去寻找文件内容。而每个文件所占用的簇信息,又在FAT表项中进行了标识,再按照FAT的信息进行查找,即可找到相应文件的所有内容。

比较方便的是,WinHex还提供了簇号和扇区的转换,可以根据簇号来跳转到相应的扇区。

2 文件删除及恢复

现在Windows10操作系统的磁盘已经不使用FAT格式,这里选择U盘来做FAT的实验。

在WinHex工具栏,选择“工具”—“打开磁盘”。

在磁盘选择窗口,选择接入电脑的U盘并打开。

打开U盘之后,WinHex显示如下,可以看到U盘中的文件。

2.1 自动恢复

先在U盘中创建一个文件—“计算机取证05171759.txt”,用于删除。

新建文件内容是我的名字。

确认文件内容之后,就可以把文件删除。删除之后,要在WinHex中更新磁盘。
在WinHex工具栏,选择“专业工具”—“进行磁盘快照”。

在弹出的对话框中,勾选“更新快照”。

更新磁盘之后,可以在Winhex找到删除的文件。

右键单击,选择“恢复/复制”,导出到新文件。

将恢复文件的位置选择为U盘。

在U盘中查看文件内容,看到名字和内容都和原来一样。

2.2 手动恢复

这里仍然可以在U盘中找到对应的文件。

但文件内容是乱码的,在编码页面选择GBK编码,就可以看到正确的文件内容。

之后选中文件区域,右键选择“复制选块”—“至新文件”。

将文件命名“恢复文件.txt”,另存到U盘中。再到U盘中验证文件内容,看到是跟原来文件内容是一样的。

这里是一个比较小的文件,存储内容在一簇的空间内即可存储,手工恢复比较简单。如果是想要对比较大的文件,进行恢复,经常会发现它的簇并不是完全连续的,而是呈现出片段状。手工恢复的话,就要找到这些簇,并把这些簇拼接到一起输出为文件,比较麻烦。但使用Winhex的话可以借助它的功能实现自动恢复,省去手动的麻烦。

然后,如果看这篇文章对FAT32还有不理解,或者有地方写的不明白,可以参照下面两篇文章,多篇文章参考起来,来回阅读的效果会好一点。

参考:

[1] FAT32文件系统格式详解

[2] FAT32文件系统结构