硬盘是用来存储数据的,为了使用和管理方便,这些数据以文件的形式存储在硬盘上。任何操作系统都有自己的文件管理系统,不同的文件系统又有各自不同的逻辑组织方式。例如:常见的文件系统有FAT,NTFS,EXT,UFS,HFS+等等。下面就来学习一下基于Windows的FAT32文件系统。
FAT32文件系统由DBR及其保留扇区,FAT1,FAT2和DATA四个部分组成,其机构如下图:
这些结构是在分区被格式化时创建出来的,含义解释如下:
DBR及其保留扇区:DBR的含义是DOS引导记录,也称为操作系统引导记录,在DBR之后往往会有一些保留扇区。
FAT1:FAT的含义是文件分配表,FAT32一般有两份FAT,FAT1是第一份,也是主FAT。
FAT2:FAT2是FAT32的第二份文件分配表,也是FAT1的备份。
DATA:DATA也就是数据区,是FAT32文件系统的主要区域,其中包含目录区域。
一、分析FAT32文件系统的DBR
FAT32文件系统的DBR有5部分组成,分别为跳转指令,OEM代号,BPB,引导程序和结束标志。如下图是我U盘上一个完整的FAT32文件系统的DBR。
E8 58 90 :(跳转指令) 本身占2字节它将程序执行流程跳转到引导程序处。
“EB 58 90″清楚地指明了OS引导代码的偏移位置。jump 58H加上跳转指令所需的位移量,即开始于0x5A。
4D 53 57 49 4E 34 2E 31 :(OEM代号) 这部分占8字节,其内容由创建该文件系统的OEM厂商具体安排。
跳转指令之后是8字节长的OEM ID,它是一个字符串, OEM ID标识了格式化该分区的操作系统的名称和版本号。为了保留与MS-DOS的兼容性,通常Windows 2000格式化该盘是在FAT16和FAT32磁盘上的该字段中记录了“MSDOS 5.0”,在NTFS磁盘上(关于ntfs,另述),Windows 2000记录的是“NTFS”。通常在被Windows 95格式化的磁盘上OEM ID字段出现“MSWIN4.0”,在被Windows 95 OSR2和Windows 98格式化的磁盘上OEM ID字段出现“MSWIN4.1”。
BPB:FAT32的BPB从DBR的第12个字节开始,占用79字节,记录了有关该文件系统的重要信息,各参数解释如下表:
前面53个字节是BPB,后面26个字节是扩展BPB。
对照上面分析:
02 00:每扇区512字节
40:每簇64个扇区
26 B0:保留9904个扇区
02:FAT数
00 00:根目录项数为0
00 00:小扇区数为0
F8:硬盘
00 00:每FAT扇区数为0
00 3F:每磁道63个扇区
00 80:128磁头
00 00 1F 80:隐藏扇区8064
03 A8 E4 00:总共61400064个扇区
00 00 1D 48:每个FAT有7496个扇区
00:扩展标志
00 00:文件系统版本
00 00 00 02:根目录簇号2
00 01:文件系统信息扇区号
00 08:备份引导扇区
后12个字节为0:保留
00:软盘驱动器
01:未知
29:扩展引导标签
78 7B 52 18:分区引导序号
4B 49 4E 47 53 54 4F 4E 20 20 20:卷标KINGSTON
46 41 54 33 32 20 20 20:系统ID FAT32
FAT32文件系统在DBR的保留扇区中安排了一个文件系统信息扇区,用以记录数据区中空闲簇的数量及下一个空闲簇的簇号,该扇区一般在分区的1号扇区,也就是紧跟着DBR后的一个扇区,其内容如下:
52 52 61 41:扩展引导标签
接下来的480个字节:未用
72 72 41 61:文件系统信息签名
00 02 07 9E:空闲簇数
00 00 01 8F:下一个空闲簇的簇号
接下来的14个字节:未用
55 AA:结束标志
引导程序代码:FAT32的DBR引导程序占用420字节,对于没有安装操作系统的分区来说这段程序是没有用处的。
结束标志:DBR的结束标志与MBR,EBR的结束标志相同,为“55 AA”。
二、分析FAT32文件系统的FAT表
从FAT32的组织形式来看FAT1在保留扇区(包括引导扇区)的后面,然后就是FAT2.
所以我们在加上保留扇区的数量来到FAT1的第一个扇区:
FAT文件系统之所以有12,16,32不同的版本之分,其根本在于FAT表用来记录任意一簇链接的二进制位数。以FAT16为例,每一簇在FAT表中占据2字节(二进制16位)。所以,FAT16最大可以表示的簇号为0xFFFF(十进制的65535),以32K(最多只支持64个扇区)为簇的大小的话,FAT16可以管理的最大磁盘空间为:32KB×65535=2048MB,这就是为什么FAT16不支持超过2GB分区的原因(DOS下)。
FAT表结构及作用
1、FAT32文件一般有两份FAT,他们由格式化程序在对分区进行格式化时创建,FAT1是主,FAT2是备份。
2、FAT1跟在DBR之后,其具体地址由DBR的BPB参数中指定,FAT2跟在FAT1的后面。
3、FAT表由FAT表项构成,我们把FAT表项简称FAT项,每个FAT项占用4字节。
4、每个FAT项都有一个固定的编号,这个编号从0开始。
5、FAT表项的前两个FAT项为文件系统保留使用,0号FAT为介质类型,1号FAT为文件系统错误标志。
6、分区的数据区中每个簇都会映射到FAT表中的唯一一个FAT项,因为0号FAT和1号FAT被系统占用,用户的数据从2号FAT开始记录。
7、如果某个文件占用很多个簇,则第一个FAT项记录下一个FAT项的编号(既簇号),如果这个文件结束了,则用“0F FF FF FF”表示。
8、分区格式化后,用户文件以簇为单位存放在数据区中,一个文件至少占用一个簇。
9、FAT的主要作用是标明分区存储的介质以及簇的使用情况。
定位FAT绝对位置的方法如下:
1、首先从MBR的分区表中得知分区的起始扇区,偏移到此扇区。
2、从DBR的BPB中得知DBR的保留扇区数,FAT表的个数,FAT表的大小。
3、因此FAT1=分区起始扇区+DBR保留扇区,FAT2=分区起始扇区+DBR保留扇区+FAT1。
下图为FAT1的第一个扇区:
上面是从第0项开始的,第0项和第1项暂时就不用看了,从第2项开始,为0F FF FF FF,表示这是一个小文件,只占用一个簇就结束了,然后第3、4项也是的。
第5簇中存放的数据是6,这又是一个文件或文件夹的首簇。其内容为第6簇,就是说接下来的簇位于第6簇——〉FAT表指引我们到达FAT表的第6簇指向,上面写的数据是7,就是说接下来的簇位于第7簇——〉FAT表指引我们到达FAT表的第7簇指向……直到根据FAT链读取到扇区相对偏移0x20~0x24,也就是第8簇,上面写的数据是9,也就是指向第9簇——〉第9簇的内容为”0F FF FF FF”,意即此文件已至尾簇。
下面的同样的分析方法,我就不一一分析了。
三、分析FAT32文件系统的数据区
数据区的位置在FAT2的后面,具体定位方式如下;
1、通过MBR中的分区表信息得知分区的起始位置。
2、通过分区中DBR得知DBR的保留扇区数以及FAT表的大小,FAT表的个数。
3、通过上面的信息就可以找到数据区的起始位置,数据区 = 隐藏扇区数+DBR保留扇区+(每个FAT表扇区数*2)。
数据区的类容主要由三部分组成:根目录,子目录和文件内容。在数据区中是以“簇”为单位进行存储的,2号簇被分配给根目录使用。
根据簇号得到在FAT中的扇区号和偏移:
扇区号 = 簇号*4/每个扇区的字节数 + 隐藏扇区数 + 保留扇区数
扇区偏移 = 簇号*4%每个扇区的字节数
根据簇号得到起始扇区号:
簇号起始扇区 = (簇号-2)* 每个簇的扇区数 + 隐藏扇区数 + 保留扇区数 + FAT数*每个FAT占扇区数
下图为根目录的第一个扇区:
FAT32文件系统中,分区根目录下的文件和目录都放在根目录区中,子目录中的文件和目录都放在子目录区中,并且每32个字节为一个目录项(FDT),每个目录项纪录着一个目录或文件(也可能是多个目录项记录一个文件或目录),如上图所示就是一个目录项。
在FAT32文件系统中,目录项可以分为四类:卷标目录项、“.”和“..”目录项、短文件名目录项、长文件名目录项。
卷标目录项:卷标就是分区的名字,可以在格式化分区时创建,也可以随意修改,长度为11字节。
“.”和“..”目录项:“.”表示当前目录,“..”表示上一层目录。这两个目录项多存在子目录中。
短文件名目录项:所谓短文件名既文件名的“8.3”格式,此格式支持主文件名不能超过8字节,扩展名不能超过3字节。短文件名目录始终存放在一个目录项中。
FDT第1字节又表明了该文件的状态,它有如下四种取值方式:
a. 00H–目录项的空目录。
b. E5H–表示该目录项曾经使用过,但文件已被删除。
c. 2EH–表示子目录下的两个特殊文件 “. “或 “.. “目录项
d. 其它任何字符–表示一个文件名(或目录名)的第一个字符的ASCII码值.
FAT第0xB个字节可以判别是长文件目录项还是短文件目录项。
FAT32短文件目录项32个字节的表示定义如下:
正如上面的第一个FDT就是一个短文件目录项:
文件名为GAMES
关于时间的表达方式:10111(23) 111000(56) 00001(1*2)时间值:23时56分02秒。
关于日期的表达方式:0011101(29+1980) 1010(10) 10011(19)时间值:2009年10月19日。
长文件名目录项:由于短文件名“8.3”的格式远远不能满足现实中的需求,所以就出现了长文件名。
FAT32长文件目录项32个字节的表示定义如下:
根据表中的长文件名组合方法我们可以得到上面根目录的第一个扇区中第7个FDT的长文件名为:urDrive
如果是目录的话可以转到起始簇号在FAT1中的位置,然后转到相应的扇区分析FDT来枚举文件信息。