ExFAT文件系统数据恢复技术 第八章
微软文件系统经历了FAT12、FAT16、FAT32、NTFS几个阶段,其中NTFS文件系统以其非常好的安全性及可恢复性得到广泛认可,也是微软力推的一种文件系统。但是,随着闪存容量的不断增大,使得目前的文件系统无法更好地适应闪存大容量的需求。由于容量不断增大,FAT32无法很好地管理较大的容量,NTFS虽然在容量管理上可以胜任,但由于它的安全性等方面的原因,会要求频繁地对闪存进行读写操作。对闪存而言,频繁的读写不仅会降低性能,更会大大降低其使用寿命。另外,NTFS的延迟写入设计也不适用于便携的移动存储设备。所以,必须推出一种即可以支持更大的存储容量,又具有更快的存取速度的文件系统。
为此,微软对FAT系列文件系统做了进一步发展,推出了ExFAT(Extended File Allocation Table File System---扩展FAT)文件系统。ExFAT即继承了FAT类文件系统的简单结构,同时又增大了对容量的支持。所以,ExFAT是一种为闪存更好地工作而出现的一种折衷方案。
ExFAT在分区表中的分区类型值与NTFS相同,即使用0x07。
提示:目前的Windows XP不支持ExFAT文件系统,如果要在Windows XP下创建、读写ExFAT文件系统,需要安装相应的更新程序,更新程序可以到微软官方网站下载,地址为http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&FamilyID=1cbe3906-ddd1-4ca2-b727-c2dff5e30f61
8.1 ExFAT特性
ExFAT文件系统也称为扩展文件分配表文件系统,由此也可知它是由FAT文件系统扩展而来。
ExFAT继承了原FAT类文件系统的架构,使用FAT表、目录结构等对数据进行管理。但ExFAT对FAT表项进行的扩展,在FAT32文件系统中,每个FAT表项虽然占用4个字节(32bit),但却只使用了其中的28bit,所以它管理的簇地址并不能够达到32bit的理想上限。ExFAT则启用了FAT32原来未使用的4bit,真正使可管理的地址编号达到32bit的上限。这是ExFAT文件系统可管理容量增大的一个原因。
ExFAT对簇的大小进行了扩展。早先的FAT类文件系统,簇的上限为32KB,而ExFAT则将这个上限扩展到32MB。实际上,理论上这个上限值可以达到2的255次方,只不过微软将其限制在了32MB以内。这也使得ExFAT可管理的容量大大增加。
在FAT32中,文件系统分区的大小扇区数用4个字节表示,ExFAT则使用8个字节表示,这也使ExFAT在可管理的分区大小上有了非常大的突破。不过,由于MBR分区表的局限性,虽然文件系统本身可以管理超过2TB的空间,但使用4个字节表示扇区数的分区表项最大只能表述到大约2TB,所以使用MBR分区表表述的分区,即使使用ExFAT文件系统,也无法突破2TB的容量限制。
ExFAT支持更大的单一文件。FAT32中,文件的大小使用4个字节表述,可表示的单一文件上限大约为4GB。ExFAT使用8个字节对文件大小进行表述,可表示的单一文件大小上限大约为16EB。
8.2 ExFAT布局结构
由于ExFAT仍然属于FAT类文件系统,所以它的布局结构总体上仍与FAT12/16/32大同小异,如图8.1所示。
图8.1
ExFAT保持了FAT类文件系统的总休架构,大致分为保留区、FAT表和数据区三大部分。
保留区是FAT表前的区域,大致可分为三个部分,一是主引导区域,二是备份引导区域,再就是其他保留区域。主引导区域通常占用0~11号扇区;备份引导区域占用12~23号扇区;由24号扇区开始至FAT表前一个扇区这部分通常不被使用,我们权且称其为其他保留区域。
FAT表区域由FAT表组成,不同的是,目前01.00版本的ExFAT文件系统通常只有一个FAT表(事务ExFAT---TexFAT文件系统有两个FAT表),FAT表中的每个FAT项占用4个字节,并全部使用这4个字节的32个bit。
数据区则用于存储数据。ExFAT的数据区的起始簇号也是2,该簇通常由簇位图文件占用,该文件的各种信息记录在根目录下的一个0x81类型的目录项中。
跟在簇位图文件后的是大写转换表文件,这个文件的大小是固定的,为5836个字节。
再后面则是根目录,这是所有文件及文件夹的入口。
8.3 保留区
保留区中,重要的内容有两部分,一部分是主引导区域,另一部分是备份引导区域。主引导区域占用0~11号扇区,备份引导区域占用12~23号扇区,这部分完全是0~11号扇区的完整备份。23号扇区至FAT表前一个扇区,是未使用部分。
主引导区域包括的0~11号扇区,共有12个扇区,可分为5个子区域:
* 主引导扇区
* 主扩展引导扇区
* OEM参数区
* 保留扇区
* 校验扇区
引导扇区之后的1~8号扇区,也被称为扩展引导扇区,通常情况下这8个扇区除每个扇区的结尾写入“55AA”外,其它字节全部为零。当有较大的引导程序,超出了引导扇区所能够容纳的字节数时,就会使用这部分扩展引导扇区的空间进行存储。
9号扇区,据称用于OEM参数记录,实验过程中发现格式化时该扇区不被进行改动。
10号扇区没有特定用途,做为保留扇区。实验时发现该扇区在格式化过程中会被清零。
11号扇区是一个存放校验信息的扇区,用于存放前11个扇区的校验值。如果人为更改某些信息,就必须能够重新正确计算出新的校验值才可以。 8.1.1
引导记录扇区 ExFAT文件系统也将0号扇区做为引导记录扇区,除引导信息外,还记录着文件系统的各项参数,如分区大小、FAT表位置及大小、簇起始位置、根目录起始簇号、每扇区大小、每簇扇区数等等。ExFAT引导记录扇区的主要结构见表8.1。表8.1 ExFAT引导记录扇区结构
偏移字节(十六进制)字节数含义
00~023跳转代码,“EB 76 90”,跳转过0x76个字节,至0x78字节处
03~075分区类型“4558464154”,明文“EXFAT”
08~0A3“202020”
0B~3F53“00”
40~478分区起始扇区号(似乎总是相对于磁盘物理0号扇区)
48~4F8分区大小扇区数,最小为1MB,最大为264-1个扇区
50~534FAT表起始扇区号
54~574FAT表大小扇区数
58~5B4数据区起始扇区号(注意,虽然只有一个FAT表,但该值并不一定等于FAT表起始扇区号加上FAT表大小扇区数,也就是说为FAT表分配的空间与簇起始扇区之间可能会有未使用的扇区)
5C~5F4卷内簇数
60~634根目录起始簇
64~674卷ID
68~692文件系统版本
6A~6B2卷标志
6C~6C1每扇区大小字节数,假设此处值为N,则每扇区大小字节数为2的N次方个字节,此处值通常为“09”,最大值为“12”
6D~6D1每簇扇区数,假设该位置值为N,则簇大小为2的N次方个扇区
6E~6E1FAT表个数
6F~6F1介质描述符
70~701已用比例
71~777保留
78~1FD390引导代码
1FE~1FF2签名标志“55AA”
(1) 0x00~0x02:3个字节,跳转代码。(2) 0x03~0x0A:分区类型标志,也称为OEM标签,是一个8字节的ASCII码,用以说明文件系统的类型名称,即“45 58 46 41 54”,明文“EXFAT”,剩余未用的字节使用“20”填充。由于ExFAT与NTFS一样使用0x07做为分区表中的分区类型值,单纯由分区表项中的该值无法判断这个分区是NTFS分区还是ExFAT分区,这时可以通过引导记录扇区中的分区类型标志值对它们进行区分。(3) 0x0B~0x3F:53个字节,全部为“00”。(4) 0x40~0x47:8个字节,分区起始扇区号。注意:实验中发现,该值为当前扇区的物理扇区号,即使该分区位于扩展分区内也不例外,这点与FAT32或NTFS引导记录扇区中“分区前已用扇区数”的描述方法略有不同。(5) 0x48~0x4F:8个字节,分区大小扇区数。(6) 0x50~0x53:4个字节,FAT表起始扇区号,该值为相对于文件系统0号扇区而言。(7) 0x54~0x57:4个字节,FAT表大小扇区数。(8) 0x58~0x5B:4个字节,簇起始位置扇区号,该值用以描述文件系统中的第1个簇(即2号簇)的起始扇区号。通常2号簇分配给簇位图使用,因此,该值也就是簇位图的起始扇区号。虽然该簇跟在FAT表后,但实际上它并不一定等于FAT表起始扇区号加上FAT表的大小。(9) 0x5C~0x5F:4个字节,卷内的总簇数。(10) 0x60~0x63:4个字节,根目录起始簇号。(11) 0x64~0x67:4个字节,卷ID。(12) 0x68~0x69:2个字节,文件系统版本。(13)0x6A~0x6B:2个字节,卷标志。该标志用以描述主FAT号、卷是否干净等信息。(14) 0x6C~0x6C:1个字节,每扇区大小字节数,表示方法为,假设此处值为N,则每扇区大小字节数为2的N次方个字节。此处的值通常为“09”,即每扇区大小字节数为512。微软将该处的值限定为最大为12,也就是每扇区大小字节数最大为212 = 4096。(15) 0x6D~0x6D:1个字节,每簇扇区数,表示方法为,假设此处值为N,则每簇大小扇区数为2的N次方个扇区。此处值最小为1,最大值取决于每扇区大小字节数,因为ExFAT的簇大小上限为32MB,也就是225个字节,所以0x6C处的值与0x6D处的值相加不得超过25。(16) 0x6E~0x6E:1个字节,FAT表个数,事务ExFAT中为2个FAT表,版本01.00只有一个FAT表。(17) 0x6F~0x6F:1个字节,介质描述符。(18) 0x70~0x70:1个字节,似乎是卷中已用簇空间的百分比。(19) 0x71~0x77:7个字节,保留。(20) 0x78~0x1FD:390个字节,引导代码。(21) 0x1FE~0x1FF:2个字节,有效结束标志“55AA”。如果扇区大小超过512个字节,“55AA”仍然位于扇区的最后两个字节,引导代码至“55AA”之间可能会使用“00”进行填充。现在,我们来实验分析一个ExFAT文件系统的引导记录扇区部分参数,如图8.2所示。图8.2
(1) 0x00~0x02: 3个字节,“EB 76 90”,跳转代码。(2) 0x03~0x0A:分区类型标志,“45 58 46 41 54”,明文“EXFAT”。(3) 0x0B~0x3F:53个字节,全部为“00”。(4) 0x40~0x47:8个字节,“3F00000000000000”,分区起始扇区号,63。(5) 0x48~0x4F:8个字节,“0014A80400000000”,分区大小扇区数,78124032。(6) 0x50~0x53:4个字节,“00080000”,FAT表起始扇区号,2048。(7) 0x54~0x57:4个字节,“000A0000”,FAT表大小扇区数,2560。(8) 0x58~0x5B:4个字节,“00180000”,数据区起始位置扇区号,6144。我们可以看前面的FAT表起始扇区号为2048,FAT表大小为2560,则FAT表的结束位置为4608号扇区。而数据区的起始位置是6144号扇区,所以数据区的起始位置并不一定是紧跟在FAT表之后的。(9) 0x5C~0x5F:4个字节,“FCA70400”,卷内的总簇数,305148。(10) 0x60~0x63:4个字节,“04000000”,根目录起始簇号,4。(11) 0x64~0x67:4个字节,卷ID。(12) 0x68~0x69:2个字节,“0001”,文件系统版本,01.00。(13)0x6A~0x6B:2个字节,“0000”,卷标志。(14) 0x6C~0x6C:1个字节,“09”,每扇区大小字节数,即扇区大小为29=512字节。(15) 0x6D~0x6D:1个字节,“08”,每簇扇区数,即28=256个扇区。(16) 0x6E~0x6E:1个字节,“01”,FAT表个数,1。(17) 0x6F~0x6F:1个字节,“80”,介质描述符。(18) 0x70~0x70:1个字节,“00”,卷中已用簇空间的百分比,这是一个刚刚格式化的文件系统,基本尚未使用。(19) 0x1FE~0x1FF:2个字节,有效结束标志“55AA”。8.1.1
校验扇区 主引导区域的11号扇区,记录的是前11个扇区的校验值。严格来讲,主引导区域应该只包括前11个扇区,只是为了叙述方便,我们将11号扇区也归入主引导区域,不过只有前11个扇区参与校验值的计算,计算结果记录在11号扇区中。如图8.3所示。图8.3可以看到,校验扇区记录的内容是一个重复的4字节值,该4字节值不断被重复直到写满整个扇区。资料《Reverse Engineering the Microsoft exFAT File System》中给出的校验值计算函数如下:UINT32 VBRChecksum(const unsigned char octets[], long NumberOfBytes){
UINT32 Checksum = 0; long Index; for (Index = 0; Index < NumberOfBytes; Index++)
{ if (Index == 106 || Index == 107 || Index == 112)
{ continue;
}
Checksum = ((Checksum <<31) | (Checksum>> 1)) + (UINT32) octets;
} return Checksum;}8.2
FAT表 在FAT12/16/32中,FAT表不只用于记录FAT链,同时还用于表示当前FAT对应的簇是否被使用:表项为0表示该表项对应的簇未使用,否则为已分配使用。ExFAT文件系统的FAT表则只用于描述FAT链,而不再用以说明某个簇的分配情况,簇的分配情况另外使用簇位图进行描述。FAT32中,虽然每个FAT表项占用32个bit,但真正使用的却只是其中的28个bit。ExFAT的FAT表项也占用32个bit,并且全部启用了这32bit。ExFAT中,FAT项的取值含义见表8.2。表8.2 FAT项取值含义
取值含义
0x00000000从未被分配使用
0x00000001此值无效
0x00000002~0xFFFFFFF6可用簇号
0xFFFFFFF7坏块
0xFFFFFFF8介质描述符
0xFFFFFFF9~0xFFFFFFFE未定义
0xFFFFFFFF文件簇链结束
0x00000000,刚刚格式化后,未被分配使用的FAT项将会设置为零,表示该FAT项对应的簇是空闲的;对于ExFAT,删除文件时并不对其FAT表链进行清除,所以即使某FAT项对应的簇中的数据已被删除,该FAT项中仍然会有非零数值存在。因此,如果一个FAT项的内容为零,只能说明该FAT项对应的簇从未被分配使用过。u
0x00000001,因为簇号是由2开始编号的,所以在FAT表中不可能出现该值。u
0x00000002~0xFFFFFFF6,这个范围内的值是可以使用的簇号值,0x00000002是最小值,0xFFFFFFF6是最大值。u
0xFFFFFFF7,坏块标记。u
0xFFFFFFF8,介质描述符。u
0xFFFFFFF9~0xFFFFFFFE,该范围内的值未定义。u
0xFFFFFFFF,文件簇链结束,表示拥有该簇链的数据结束。对于ExFAT系列文件系统,拥有的最大簇数等于最大簇号减1,所以一个ExFAT文件系统拥有的最大簇数为0xFFFFFFF6-0x01个。通常,ExFAT的第一簇(也就是2号簇)分配给簇位图文件,再后面则是大写转换表文件,跟在大写转换表后的是根目录。图8.4为一个新格式化的ExFAT文件系统的FAT表。图8.4由图中可以看到,2、3、4号FAT项都写入了结束标记0xFFFFFFFF,说明这三个FAT项对应的簇分别分配给了三个文件或目录。这三个文件或目录即簇位图文件,大写转换表文件和根目录。提示:实验发现,格式化成ExFAT文件系统时,只对FAT表的第一个扇区进行清零并写入需要的内容,其他扇区不进行任何操作。8.3
簇位图 ExFAT文件系统中簇的分配情况由簇位图描述,它是ExFAT文件系统的第一个文件,占用文件系统的第一簇,也就是2号簇。文件中每个字节的8个bit,每个bit对应文件系统中的一个簇。如果bit为0,表示该bit对应的簇为空闲;如果为1,则表示该bit对应的簇已经分配使用。由于簇号由2开始编号,所以位图中的最低位对应2号簇,例如第一个字节中的8个字节,分配为0~7号bit,它对应的是2~9号簇。要计算某个簇在位图中的对应bit,可以将该簇的簇号减去2,然后用得到的差对除以8,得到的商即该簇在位图中的字节号,余数为该簇在该字节中的bit号。例如,要计算12号簇在位图中的对应bit位置,计算方法如下:( 12 – 2 ) / 8 = 1….. 2也就是说,12号簇在位图中的对应bit是1号字节中的2号bit。
字节号0号字节1号字节
bit7654321076543210
对应簇号987654321716151413121110
现在我们来看一下前面刚刚格式化的ExFAT文件系统的簇位图,如图8.5所示。图8.5簇位图中只有第一个字节是非零数值0x07,转换成二进制为00000111,由后三个bit可知它们对应的2、3、4号簇已经分配使用。这与前面由FAT表得出的结论相一致。格式化成ExFAT时,分配给簇位图的空间中未使用的部分将全部被清零。8.4
根目录 ExFAT文件系统中,根目录跟在大写转换表之后。它的起始簇号记录在引导扇区中,数据区起始位置(2号簇)的起始扇区号也记录在引导扇区中。同时,每簇大小扇区数也可以在引导扇区中找到,通过这三个参数就可以计算出根目录的起始扇区号。例如,以前面格式化的ExFAT为例,由偏移0x58~0x5B处的4个字节“00180000”,得到数据区起始位置扇区号为6144;由0x60~0x63处的4个字节“04000000”得到根目录起始簇号4;由~0x67:4个字节,卷ID。由0x6D处的1个字节“08”得到每簇扇区数为28=256个扇区。最后可以计算出根目录的起始扇区号:6144 + 256 * ( 4 – 2 ) = 6656跳转到6656号扇区,内容如图8.6所示。图8.6ExFAT的每个目录项仍然占用32个字节,刚刚格式化的ExFAT,其根目录下会有三个目录项位置被占用,第一个是卷标目录项;第二个是簇位图目录项;第三个是大写转换表目录项。格式化时我们设置了卷标为Ex-TEST,这由第一个目录项可以看到。但即使不设置卷标,ExFAT也总是将第一个目录项预留为卷标目录项,如图8.7所示,这是一个没有卷标的ExFAT文件系统的根目录。图8.7可以看到,在没有卷标时,第一个目录项设置为一个0x03类型的目录项,做为卷标目录项进行预留。 8.7目录项 ExFAT的目录项虽然仍保持32字节大小,但其结构已不再与FAT32中的目录项一样,而是采取了全新的结构。总体来讲,每个目录项可以被分成两大部分:目录项类型值和目录项数据。目录项的通用结构见表8.3。表8.3 ExFAT目录项通用结构
偏移字节(十六进 )字节数含义
00~001目录项类型
01~1F31目录项数据
ExFAT中的用户数据,一个文件(或文件夹)的目录项由几个功能不同的目录项组合而成,最少为3个,最多为19个。例如,我们向刚刚格式化的ExFAT分区根目录下拷入一个sun.img文件,从Winhex中可以看到根目录下多了三个目录项,如图8.8所示。
图8.8
ExFAT中,每个目录项的第一个字节说明该目录项的性质,这个字节的8个bit被分成4部分,每个部分因意义不同而取不同的值,所有的取值决定了该字节的值。这8个bit含义如下:
u Bit7:是否使用中标志。为1表示使用中,为0表示未使用。
u Bit6:种类。为0表示为主项,为1表示是附属项。
u Bit5:重要性。0表示是关键项,为1表示为非关键项。
u Bit4~bit0:标识码。
每个目录项的结构大小为32个字节,第1个字节为目录项类型值,有以下几种:
u 0x03:卷标目录项保留项
u 0x83:卷标目录项
u 0x81:簇位图目录项
u 0x82:大写转换表目录项
u 0x85:文件属性目录项1
u 0xC0:文件属性目录项2
u 0xC1:文件名目录项
u 0x05:被删除文件的原0x85类型目录项
u 0x40:被删除文件的原0xC0类型目录项
u 0x41:被删除文件的原0xC1类型目录项
u 0xA0:卷GUID目录项
8.7.1 卷标目录项
卷标目录项即0x83类型目录项。
卷标目录项占用根目录下的第一个目录项位置,格式化是如果没有设置卷标,该目录项除第一个字节为“03”外,其他31个字节全部为零,这时这个目录项称为“卷标目录项保留项”。
如果格式化时设置了卷标,则第一个目录项是一个以卷标目录项标志“83”开头的目录项,其结构见表8.4。
表8.4 卷标目录项结构
偏移字节(十六进 ) 字节数 含义
00~00 1 目录项类型值0x83
01~01 1 卷标长度字符数
02~17 22 卷标
18~1F 8 保留
(1) 0x00~0x00:1个字节,目录项类型值,对于卷标目录项,该类型值为0x83。
(2) 0x01~0x01:1个字节,卷标长度字符数,卷标最长不能超过11个字符,所以此处的值最大为0x0B。
(3) 0x02~0x17:22个字节,卷标,使用Unicode字符,每个字符占用两个字节,卷标最多不能超过11个字符。不足11个字符时,未使用的部分用0填充。
(4) 0x18~0x1F:8个字节,保留,用0填充。
现在我们来看一个实际的卷标,如图8.9所示。
图8.9
(1) 0x00~0x00:1个字节,“83”,表示这是一个卷标目录项。
(2) 0x01~0x01:1个字节,“07”,表示卷标长度为7个字符。
(3) 0x02~0x17:22个字节的卷标,由于当前卷标为7个字符“Ex-TEST”,使用Unicode字符,每个字符占用两个字节,共占用14个字节,所以后8个字节用“00”填充。
(4) 0x18~0x1F:8个字节,保留,用0填充。
-------------------------------------占位------------------------------------ ExFAT文件系统数据恢复技术 第八章 8.7.2--8.7.7
见http://bbs.intohard.com/thread-89710-1-1.html -------------------------------------占位------------------------------------ -------------------------------------占位------------------------------------ -------------------------------------占位------------------------------------ 支持一下,呵呵~~~~~~~~~~~~~~~~~~ 真的谢谢您了