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