EXFAT文件系统DBR的完美恢复

一、EXFAT系统简介

EXFAT的英文全称是Extended File Allocation Table File System,即扩展文件分配表,也有人说它是FAT32文件系统的升级版本。
EXFAT诞生于闪存介质,如USB闪存驱动器,数字卡等。因为现在闪存介质的容量越来越大,要转存的文件也往往越来越大,并且闪存介质的芯片最好是连续读写。如果继续使用FAT文件系统,由于它能够管理的空间有限、存储的文件大小有限等原因显得力不从心;如果使用NTFS文件系统,由于它是日志型文件系统,需要记录详细的读/写操作,这使得芯片的磨损率增加。因此FAT系统以及主流的NTFS系统并不适用于这种介质,基于这些考虑,微软引入了EXFAT文件系统。
EXFAT文件系统它是Microsoft在Windows Embedded 5.0以上(包括Windows CE5.0、Windows CE6.0、Windows Mobile 5、Windows Mobile 6、Windows Mobile 6.1)开始使用。目前Windows 7、Windows 8、Windows 10等常用的操作系统已完美地支持了它。 如果还是在使用Windows XP,则需要打一个名为KB955704的补丁。同时自MAC OS 10.6.5之后的各版本,也完美地支持了EXFAT文件系统。许多Linux的发行版如Ubuntu最新一些版本(内核3.8以上)也支持了EXFAT的文件系统。安卓4.2以后的版本,同样开始支持EXFAT文件系统。这样,EXFAT在各种操作系统的获得支持,必将使得它的应用更广泛。格式化成EXFAT文件系统的各种移动介质,将很好地在各种系统中获得通用。

二、EXFAT文件系统整体结构

1)EXFAT文件系统与FAT文件系统的区别

EXFAT和FAT32文件系统不同之处在于以下几点:
①FAT32的FAT表最多只能用28位,EXFAT的FAT表32位可以全部使用。
②FAT32的文件系统大小只能用4个字节表示,描述的最大值为0xFF FF FF FF个扇区(也就是2T。0xFFFFFFFF扇区 → 4294967295扇区 → 2147483647KB → 2097151MB → 2047GB → 2TB)。而EXFAT文件系统的大小是用8个字节表示的,理论上可以支持最大为8ZB的分区(264×512=273Byte=8ZB,系统建议支持最大的分区为512TB,已远远超过目前我们所见到的最大存储介质。
③FAT32文件系统中单个文件最大是4G,已不能满足目前的一些大文件的需求(4个字节表示的最大值为0xFFFFFFFF字节,也就是4294967295个字节,即4G)。而EXFAT文件系统中文件大小使用8个字节描述,理论上可以支持的最大文件为大小为264B,系统建议的最大文件为512TB。

2)EXFAT文件系统的整体结构

EXFAT文件系统整体结构如图1所示。
图1 EXFAT文件系统的总体结构

图1 EXFAT文件系统的总体结构

这些结构是在分区被格式化时创建出来的,它们的含义如下:
①DBR及保留扇区。DBR在分区的0号扇区,之后一直到11号扇区是保留扇区。其中12-23号扇区为0-11号扇区的备份,其中12号扇区是DBR的备份。
②FAT。FAT的全称是File Allocation Table,其含义是文件分配表。与FAT32不同的是,EXFAT文件系统中只有一个FAT表。
③簇位图文件。
④大小写转换表,是EXFAT3文件系统中的第二个元文件,类似于NTFS文件系统中的元文件$UpCase。该文件大小固定为5836字节,占用12个扇区。
⑤真正的用户数据区。是EXFAT文件系统的主要区域,用来存放用户的文件及目录。它的第一块区域一般是根目录。

三、 EXFAT文件系统DBR数据结构

DBR开始于EXFAT文件系统的第0号扇区。它由6部分组成,分别为跳转指令、OEM代号、保留区、BPB参数、引导程序和结束标志。
图2是完整的EXFAT文件系统的DBR。
EXFAT的DBR扇区示例

图 2 EXFAT的DBR扇区示例

六个区域分别描述如下:
(1)00H~02H:跳转指令0xEB 76 90,代表汇编语言的JMP 76。
(2)03H~0AH:OEM代号,即明文EXFAT。
(3)OBH~3FH:保留区,暂时不用,目前均为00H。
(4)40H~77H:BPB参数区。(BIOS Parameter Block,BIOS参数块),其中一些重要的参数描述如下:
①40H~47H:分区的起始扇区号,也称为隐藏扇区数,是指本分区前的物理扇区数。
②48H~4FH:分区的总扇区数。
③50H~53H:FAT表的起始扇区号,即从DBR到FAT的扇区数。
④54H~57H:FAT表占用的扇区数,它与分区大小、簇大小有关。
⑤58H~5BH:数据区的起始扇区号。一般是指簇位图的起始位置。
⑥5CH~5FH:分区内的总簇数。
⑦60H~63H:根目录的起始簇号。
⑧6CH~6CH:每扇区字节数(EXFAT中每扇区字节数用2的N次方的形式表示,一般总是09H,表示512)。
⑨6DH~6DH:每簇扇区数(2的N次方),EXFAT支持512B到32MB的簇大小。
⑩6E~6E:FAT表的个数。
(5)78H~1FDH:共390字节的引导程序。这部分代码很重要,如果它遭到破坏,文件所系统将无法使用。但有的EXFAT文件系统这段代码是一致的,很容易得到。
(6)1FE~1FF:55 AA结束标志。

四、 FAT表和簇位图

FAT ( File Allocation Table )即文件分配表,对于EXFAT文件系统来讲也是很重要的一个组成部分。

1)FAT表的特点

①EXFAT文件系统只有一个FAT表,由格式化程序在分区格式化时创建。
②FAT表跟在DBR之后,其具体位置由DBR的BPB参数中偏移量为50H~53H的字节描述。
③FAT表是由FAT表项构成的,我们把FAT表项简称为FAT项,EXFAT的每个FAT项由4字节(32位)构成。
④每个FAT项都有一个固定的编号,这个编号从0开始,也就是说,第一个FAT项是0号FAT项,第二个FAT项是1号FAT项,以此类推。

2)FAT表的用途

①FAT表的前两个FAT项有专门的用途。0号FAT项常用来存放FAT表的起始标志,一般为“F8 FF FF FF”,1号FAT表项一般直接标注为“FF FF FF FF”。可以简单地认为“F8 FF FF FF FF FF FF FF”就是FAT表的起始位置。
在”WINHEX”中可以通过从头搜索“F8 FF FF FF FF FF FF FF”(偏移 512 = 0)来找FAT的起始位置。
②分区的数据区中从2号簇开始,每一个簇都会映射到FAT表中的唯一的FAT项(第0、1号FAT项已有专门用途)。因此数据区中的第一个簇也就编号为2号簇。然后3号簇与3号FAT项映射,4号簇与4号FAT项映射,以此类推。一个分区中,有多少个簇就需要有多少个FAT项。因此,簇数越多,FAT表就越大;反之,FAT表就越小。
第2号簇开始一般分配给元文件簇位图文件。
③分区格式化后,分区的两个元文件及用户文件都以簇为单位存放在数据区中。
④每个文件至少占用一个簇。当一个文件占用多个簇时,这些簇的簇号可能是连续的,也可能是不连续的。如果文件存放的簇不连续,这些簇的簇号就以簇链的形式缴己在FAT表中;而如果文件存放在连续的簇中,FAT项则不登记己这些连续的簇链,均为“00 00 00 00”。
所以在FAT中看到数值为“00 00 00 00”的FAT项,并不能说明该FAT项对应的簇是可用簇。(这与FAT32不同)。表4-1表示了EXFAT中每个FAT项值的含义。
表4-1 EXFAT中每个FAT项值的含义

取值 含义
0x00000000 没有使用
0x10000000 无效
0x02000000-F6FFFFFF 簇号描述值
0xF7FFFFFF 坏簇
0xF8FFFFFF FAT表的起始标志
0xF9FFFFFF-FEFFFFFF 未定义
0xFFFFFFFF 文件结束簇标志

3)FAT表的实例

如图3所示的是一个存放了一批文件的EXFAT的FAT表的实例。我们看到,除了前5个FAT项有数据外,后面的FAT项均为空。
①0、1号FAT项:为“F8FFFFFF FFFFFFFF”,表示FAT起始位置。
②2号FAT项:分配给元文件“簇位图”使用,“FFFFFFFF”是文件结束标志,表示“簇位图”这个文件占用了一个簇。
③3号FAT项:分配给元文件“大小写转换表”使用,“FFFFFFFF”是文件结束标志,表示“大小写转换表”这个文件占用了一个簇。
④4号FAT项:分配给根目录使用,“FFFFFFFF”是文件结束标志,表示目前根目录占用了一个簇。
⑤其余FAT项为“00000000”,并不表示这些簇没有文件占用,而只是因为它们是连续的。
图3 一个EXFAT的FAT表实例

图3 一个EXFAT的FAT表的实例

注意:EXFAT中较少能看到不连续簇的占用情况。当存放文件时,系统会自动调整文件存放位置,尽可能使文件占用空间连续,提高文件读写的效率。当EXFAT文件系统重新被格式化时,会清空FAT表的第1个扇区,其余的不变。

4)簇位图文件

簇位图文件是EXFAT文件系统中的第一个元文件,类似于NTFS文件系统中的元文件$BitMap ,它用一个位来表示文件系统中的一个簇,0表示未使用,1表示已使用。因此,簇位图用来管理分区中簇的使用情况。一般该文件的起始位置是2号簇,也就是文件系统的第1个簇。其大小由格式化时分区大小与簇大小共同决定。
注意:根据簇位图文件的大小及分区总扇区数,可以很快估算出簇大小,在分区较大时,簇大小≈分区总扇区数/(簇位图大小*8),取与之最接近的2n的一个值。

五、根目录项数据结构

根目录项对于EXFAT文件系统来讲是非常重要的组成部分。在DBR中,偏移位置0x60~0x63指示了根目录的起始簇号,我们可以根据它指示的簇号值跳转到相应的簇。
图4所示是一个EXFAT文件系统的U盘的根目录示例。该U盘被格式化时设定的卷标为“A0123456789”,复制了一个名为“0123456789abcdefghijklmnopqrstuvwxyz.txt”的文件在根目录。
图4 根目录的初始状态

图4 根目录的初始状态

1)目录项的结构及特点

目录项的主要结构

①分区中的每个文件和文件夹(也称为子目录)都被分配一个或多个大小为32字节的目录项,用以描述文件或文件夹的属性、大小、起始簇号和时间、日期、名称等信息。其中,卷标、簇位图、大小写转换表也被视作特殊的目录项。
②EXFAT文件系统目录项的第一个字节用来描述目录项的类型,剩下的31字节用来记录文件的相关信息。

目录项的主要特点

①在EXFAT文件系统中,文件夹也被视为特殊类型的文件,所以每个文件夹一样有目录项。
②在EXFAT文件系统下,分区根目录下的文件及文件夹的目录项存放在根目录区中,分区子目录下的文件及文件夹的目录项存放在数据区相应的簇中。

2)目录项的四种类型

①卷标目录项,以83H或03H开头。有卷标为83H,无卷标为03H;
②簇位图文件的目录项,以81H开头;
③大小写转换表的目录项,以82H开头;
④用户文件(文件夹)的目录项。

3)卷标目录项

卷标目录项就是分区的名字,可以在格式化分区时创建,也可以随时修改。
如果在创建时就命名的话,则以“83H”开头;如果创建时没有命名的话,则以“03H”开头。若在系统创建完成后再重新命名,则会在后面某一个根目录的目录项区域中重新建立一个以“83H”开头的目录项。
图4中第1,2行(32个字节)就是描述的卷标目录项,再次分割出来如图5所示,83H为特征符,0BH为长度,即11个字节,其卷标名为“A0123456789”,用Unicode编码。卷标目录项的含义,如表2所示。
图5 根目录中卷标目录项的状态

图5 根目录中卷标目录项的状态

表2 卷标目录项的含义

字节偏移 字段长度 (字节) 内容及含义 本例中的数据
0x00 1 83H/03 83H,表示正常卷标项
0x01 1 卷标字符数 11
0x02 22 卷标 A0123456789的Unicode编码
0x18 8 保留(也可用) 可以扩展用,但在Windows下一般不用

4)簇位图文件的目录项

EXFAT文件系统格式化时建立了簇位图文件,并为其创建一个目录项,放在根目录区中。
簇位图文件的目录项占用32字节,其中第一个字节是特征值,用“81H”表示。
图4中第3,4行(32个字节)就是描述的簇位图目录项,再次分割出来如图6所示。目录项的各数据具体含义见表4-3。
图6 根目录中簇位图目录项的状态

图6 根目录中簇位图目录项的状态

表3 EXFAT簇位图文件目录项的含义
字节偏移 字段长度 (字节) 内容及含义 本例中的数据
0x00 1 特征值为“81H” 81H
0x01 1 保留 00H
0x02 18 保留 00……00H
0x14 4 起始簇号 02000000,2号簇
0x18 8 文件大小 30296

本例中分区的簇数约为30296×8=242368。

5)大小写转换表的目录项

EXFAT文件系统格式化时建立了大小写转换表,并为其创建一个目录项,放在根目录区中。大小写转换表的目录项占用32字节,其中第一个字节是特征值,用“82H”表示。
图4中第5,6行(32个字节)就是描述的大小写转换表的目录项,再次分割出来如图7所示。具体含义见表4。
图7 根目录中大小写转换表目录项的状态

图7 根目录中大小写转换表目录项的状态

表4 EXFAT大小写转换表目录项的含义
字节偏移 字段长度 (字节) 内容及含义 本例中的数据
0x00 1 特征值为“82H” 82H
0x01 3 保留 000000H
0x04 14 保留 没有实际意义
0x14 4 起始簇号 03000000,即3号簇
0x18 8 文件大小 CC16000000000000,固定为5836

六、DBR损坏的恢复实例

上面知识了解后,我们就可以来理解如何手动修复DBR了。
图8、图9所示情况,一般为DBR部分损坏造成的。这时就需要我们来修复DBR。
图8 提示需要格式化

图8 系统提示需要格式化

图9 提示包含不可识别的文件系统

图9 提示包含不可识别的文件系统

在磁盘管理器中可以看到该分区出现了RAW分区的提示,如图10所示。

图10在磁盘管理器中出现RAW分区的提示

图10在磁盘管理器中出现RAW分区的提示

这种情况,说明分区没有被彻底损坏。往往是由于插拔移动存储或受病毒感染所造成的。这时千万不能急着去点击格式化,否则就有可能造成数据的进一步损坏。
如果该分区只有少量文件,则用WINHEX打开后提取文件即可完成,但当大量的文件存在时,最好想办法恢复整个分区,因此手工恢复显得很重要。

1)DBR的恢复

DBR的恢复存在几种情况,根据不同情况,进行相应的操作,可以达到类似的效果。

备份DBR存在时的恢复

用WinHEX进入该分区后,进入到第12扇区,查看是否存在备份DBR。如果备份DBR存在,则将备份DBR恢复到第0号扇区。重新加载磁盘,一般就能恢复。
由于操作简单,这里就不再描述。

无备份DBR存在时的恢复

在此种情况下,需要进行DBR的重构,具体步骤如下:
1.任意复制一个正常EXFAT分区的DBR
任意复制一个正常EXFAT分区的DBR至故障分区的DBR位置,如图11所示。
图11 复制正常EXFAT分区的DBR至故障分区DBR位置

图11 复制正常EXFAT分区的DBR至故障分区DBR位置

DBR中的BPB参数是DBR恢复的关键,接下来计算BPB关键参数。
2.查找FAT表的位置
FAT表的开头一般是“F8FFFFFF”,且总是在一个扇区的开头。使用查找16进制工具,向下搜索“F8FFFFFF”,勾选偏移“512 = 0”,从头向下搜索,如图12所示。
图12 查找FAT表的特征值

图12 查找FAT表的特征值

得到如图13所示的区域,此区域为FAT表所在扇区。

图13  示例分区中FAT表的扇区

图13 示例分区中FAT表的扇区

记录该扇区的位置。在本示例中为2048。
3.查找大写字符文件$UpCase的位置
$UpCase是一个内容、大小固定的文件,开头就是0,1,2,…的Unicode编码,因此,只要继续向下搜索十六进制关键字“0000 0100 0200 0300 0400 0500 0600 0700”(注意:实际操作中不要空格),搜索大写字符文件所在扇区,如图14所示。
图14  大写字符转换表扇区

图14 大写字符转换表扇区

记录该扇区的位置。本例中为10496。
$UpCase是在簇位图之后,根目录之前。
4.查找根目录所在的位置
新建一个空白区域,构造这样一段代码,其中第1行的首位是83H,第3行的首位是81H,第5行的首位是82H,其余均为3F,如图15所示。
图15 构造的搜索对象

图15 构造的搜索对象

在根目录中,系统格式化时会产生卷标、簇位图、大写字符文件等三个基本元素的信息,分别以83H、81H、82H开始,各占用32个字节。 向下搜索图15所选部分,偏移“512=0”,勾选通配符3F,如图16所示。

图16 查找根目录的特征值

图16 查找根目录的特征值

注意:如果搜索几秒钟以后没有找到相应位置,则手动停止搜索。很有可能是在最初格式化时,没有定义卷标,第1个特征字改为03H再试试。 在本例中,得到如图17的根目录。记录根目录所在的扇区10752。

图17  示例分区根目录的数据

图17 示例分区根目录的数据

读取图中簇位图项(81H)的偏移14H、18H位置的值,分别得知簇位图位于2号簇,大小为122872。 读取图中大写字符文件(82H)的偏移14H、18H位置的值,分别得大写字符文件位于3号簇,大小为5836。很容易推算到根目录起始位置位于4号簇。 簇大小可由根目录所在扇区-大写字符文件所在扇区,即10752 - 10496 = 256 即2^8。

5)证实簇位图的位置(数据区的起始位置) 从大写字符文件起始位置向前256个扇区,我们看到如图18所示的区域。很明显这就是一个簇位图文件的开始位置。记下它的扇区位置值10240。

图18 示例分区的簇位图的数据

图18 示例分区的簇位图的数据

6.计算FAT表的大小
计算公式为:
FAT表的大小 = 簇位图起始位置 - FAT表起始位置
代入实际值计算:
10240 - 2048 = 8192
此处所计算出来的FAT表大小超过了实际值,不影响恢复后读取数据。
比较接近实际FAT表大小的算法是:
先计算出总簇数982976,每个簇用4个字节描述,因此,需要的扇区数是:982976*4/512=7679.5,即7680。
7.获取分区起始位置和分区的总扇区数
在磁盘视图和分区视图中,很容易得到分区的起始位置是2048,分区的总扇区数为251652096。
8.分区的总簇数
分区的总簇数=(总扇区数(251652096)-簇位图起始位置(10240))/簇大小(256)=982976
至此,BPB中所有需要的重要参数都已计算出来。
9.回填DBR相关参数,恢复分区
按照位置分别填入计算出的关键BPB参数。如果有EXFAT文件系统DBR的模板,则更为简单。
填完后,关闭所有软件窗口。
这时,如果用R-Studio软件可打开此分区,可以看到分区内所有的文件或文件夹,就可以通过右键提取文件或文件夹。
10.完美恢复分区
一般有两种方法可以比较完美地恢复EXFAT的分区文件。
方法一:
另外用创建虚拟盘创建一个虚拟一个分区,大小与现在的分区相同(稍有小差别不影响使用),然后按EXFAT格式进行格式化,注意的是:格式化时簇大小要与刚刚计算出来的簇大小完全一致。
然后将0~23扇区全部复制到损坏的分区中,重新加载即可完美地在操作系统中打开该分区。
方法二:
使用脚本功能来计算11扇区中的校验值。
在WINHEX中有一个功能。在任意编辑区域直接按回车键,有可以打开WINHEX的“Start Center”界面,如图19所示。
 图19 WINHEX“Start Center”界面

图19 WINHEX“Start Center”界面

在右下角“Scripts”窗格中,我们右键点击“New…”,即可进入脚本编辑窗口,系统自动命名为“noname.whs”。 接下来,将附件所列脚本程序段输入脚本编辑窗口中或直接将脚本文件复制到WINHEX下。 注意:脚本里的所有的命令、变量、常量均不区分大小写,这里这样写法是为了更清晰。其中带有“//”的是说明语句,只是为了方便读者理解该脚本程序,输入时可以忽略。 输完后保存,即出编辑窗口。脚本窗口中出现了“noname”的一个脚本程序。为了能方便以后使用,可以将它重命名。例如,本例中命名为“EXFAT_BootCheckSum”。 双击脚本名字,即进入了运行脚本的提示,如图20所示。 ![图20 脚本“EXFAT_BootCheckSum”运行的提示](https://img-blog.csdnimg.cn/20200225150733643.png)

图20 脚本“EXFAT_BootCheckSum”运行的提示

当脚本程序运行结束,则只需要保存被打开的EXFAT分区就可以了。这时,EXFAT分区得到完美修复,可以在Windows系统中直接把它打开了。

发布了2 篇原创文章 · 获赞 1 · 访问量 116

猜你喜欢

转载自blog.csdn.net/xlzgwry/article/details/104477331
今日推荐