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文件系统结构