APP下载

exFAT文件系统分析及DBR手动修复

2018-09-06

山西电子技术 2018年4期
关键词:扇区大写字节

王 赟

(山西职业技术学院,山西 太原 030006)

0 引言

随着信息化的不断发展,闪存中单个大文件的存储需求越来越高,FAT32文件系统的闪存很多时候已不能满足需求,NTFS文件系统则不适用于闪存介质(执行每一个读写操作都需要对介质进行多次访问,对闪存芯片损伤较大)。exFAT(Extended File Allocation Table File System)文件系统的出现有效解决了这一难题,同时exFAT文件系统下数据恢复需求也随之增加,只有深入了解exFAT文件系统结构,才能有效恢复丢失数据,减少用户损失。

1 exFAT文件系统简介

1.1 exFAT文件系统结构

exFAT文件系统是由DBR、FAT表、位图文件(BITMAP)、大写文件(UPCASE)、数据区(DATA)组成[1]。结构示意图如图1所示。

DBRFAT表位图文件大写文件数据区(包括目录存放区以及用户数据)

图1 EXFAT结构示意图

1.2 DBR参数信息标注图(如图2所示)

下面对这些参数做详细的分析。

1) 跳转指令:固定值。

2) 铭文标志:EXFAT。微软将此处设置为EXFAT。

3) MBR保留:MBR到当前位置的扇区数。

4) 分区大小:分区所占用扇区数。

5) FAT表起始扇区:FAT表开始的扇区号。

6) FAT表大小:FAT表所占用扇区数。

7) 首簇起始扇区号:首簇即第二簇(位图文件)开始的扇区号。

8) 分区内总簇数:分区内一共有多少个簇(也是从二号簇开始计算)。

9) 根目录首簇号:根目录位于第几簇。

10) 卷序列号:无意义。

11) 每扇区字节数:2的9次,512。

12) 每簇扇区数:2的6次,64。

图2 DBR信息标注

在exFAT文件系统下0-8扇区都是作用分区,即结尾都写55 AA结束标志,一旦55AA被破坏,分区则提示未格式化。

1.3 FAT表分析

exFAT文件系统和FAT32有极大的相似性,数据都从第二簇开始记录,也都有FAT表[2]。在FAT32中,有两个FAT表,用来记录簇的占用情况。而在exFAT中,只有一个FAT表,并且只有产生碎片文件时,才会在FAT表中记录[3]。FAT表的位置在DBR中偏移50H-53H位置中指定[4]。在图2中,FAT表的开始位于2048。FAT表的搜索标志为F8 FF FF 0F。FAT表的第一项记录了FAT表的开始标志。第二项紧接着就写了它的结束,用4个FF表示,所以第0簇和第1簇都被占用。数据就从第二簇开始记录了(这个等同于FAT32的FAT表)。第2簇记录位图文件可以看出占用了四个簇。第6簇记录大写文件字符,占用一个簇。第7簇开始就是用户存放数据的区域了。

1.4 簇位图文件

1.5 大写字符文件

1.6 目录项分析

1.6.1 卷标目录项

卷标就是分区的名称,用户可以自行命名。exFAT对其管理的方式就是将其放在根目录下,用Unicode编码进行存储。

1.6.2 位图文件目录项

位图文件目录项和卷标目录项一样,都占用了32个字节,并且也有自己的搜索特征值81H。位图文件总是位于第二簇,即首簇。在其目录项中主要记录了它的开始位置和大小。

1.6.3 大写文件目录项

大写文件的目录项也是占用了32个字节,在目录项中也同样主要记录开始位置和大小。

1.6.4 用户文件的目录项

exFAT文件系统中的每个用户文件都有三个目录项。也就是我们的85H、C0H、C1H三个属性。

2 手动修复exFAT文件系统下被破坏的DBR

U盘(或者分区)双击打开时突然提示格式化,排除物理故障后就是DBR的问题了。修复DBR需要重构DBR的一些关键信息。首先去找DBR的备份,exFAT 文件系统中DBR的备份位于12扇区[3]。如果备份也遭到了破坏,那就需要手动修复被破坏的DBR信息了。首先从别的exFAT分区复制一个完整的DBR,然后对其关键值进行修改(图3中标注的值就是我们要修改的值),下面我们就其关键值的计算方法做具体说明。

图3 损坏的DBR

1) 计算MBR保留:首先确定当前分区是主分区还是逻辑分区,主分区就写当前DBR的真实位置,如果是逻辑分区就是相对于他的EBR的位置。我们这里只有一个分区(主分区),当前在0扇区就写0。

2) 分区大小:分区大小的计算首先要判断你的硬盘里有多少个分区,有没有保留扇区,我们这里只有一个分区,而且没有保留扇区,所以直接跳看他的扇区总数。如图4 。填写62914560。

图4 扇区总数

3) FAT表的开始:向下搜索F8 FF FF FF,偏移位置512=0。如图5(一般就位于2048扇区)。从FAT表中看出,第二簇是首簇,且位图文件占用4个簇,大写文件占用一个簇。

图5 FAT表

4) 簇大小:根据FAT看出大写文件占用一个簇,并且下一个文件是根目录文件,用根目录的开始扇区减去大写文件的开始扇区就是簇的大小。10560-10496=64 那么簇大小就是64。

5)首簇起始扇区号:就是位图文件开始的扇区号,我这里给大家提供两种算法。第一种:搜索特征值,位图文件开始的值大多为FF FF(存放的数据太少就不是FF FF了),可以直接搜索此值。第二种:根据下一个元文件(大写文件)推算。大写文件的搜索值是固定的,00 00 01 00,偏移512=0 。簇大小也算出来了,然后向上推几个簇。计算为10240扇区。

6)总簇数:(扇区总数-目录区以前的扇区)/ 簇大小(62914560-10240)/ 64 = 982880

7)根目录首簇号:从FAT表中看出了根目录位于第7簇。或者也可以找到大写文件再向下推一个簇。

8)FAT表大小:FAT表示记录分区内所有簇占用情况的,每四个字节为一项。总簇数我们也知道,但是FAT表中还有开始的两项(F8 FF FF FF FF FF FF FF)也需要加上。然后每个扇区有128项FAT项,用这个值除以128。(982880+2)/ 128 = 7678.76。但是在exFAT系统中,FAT表的大小都是簇大小的整数倍,所以不能直接将这个值写进去。7678.76四舍五入就是7679,7679 / 64 = 119.9 ,近似为120。然后(120+1)*64 = 7744。

9)将上面计算的值依次填入DBR中相应位置保存如下图6,分区可以正常打开。如下图7。

图6 填写好的DBR

图7 分区正常打开

由于exFAT分区的第12个扇区中有前11个扇区(DBR及保留扇区)校验值的存在,一旦被更改即使上述参数修该正确,仍会因校验出错提示格式化,使得Windows无法访问数据,只能用winhex或其他数据恢复软件提取数据。想要恢复数据后能让Windows直接打开,必须得正确计算并写入校验值才行。通过如下方法可以有效计算校验值:

UNIT32 BootChecksum(const unsigned char data, int bytes).

UINT32 checksum = 0;

for (int i = 0; i < bytes; i++).

if (i == 106 || i == 107 || i == 112)

continue;

checksum = (checksum<< 31) | (checksum>> 1) + data;.

returnchecksum;.

设置一个校验值变量,初始化值为0,然后逐一读取前11个扇区的每个字节,跳过106、107、112这三个字节,循环计算直到第11扇区结束:校验值为左移31位与右移1位进行按位或运算,再加上每次读取到的相应字节值。按照上述检验算法,写出了校验脚本,测试完全正确。

3 总结

exFAT文件系统中DBR被破坏后就会出现“提示格式化”故障,导致用户数据无法访问,手动修复DBR是最有效,最完整修复此类问题的方法。

猜你喜欢

扇区大写字节
做一个大写的“我”
分阶段调整增加扇区通行能力策略
No.8 字节跳动将推出独立出口电商APP
大写的厉害:“00后”少年自制火箭成功上天
No.10 “字节跳动手机”要来了?
“大写”与“大些”
管制扇区复杂网络特性与抗毁性分析
U盘故障排除经验谈
简谈MC7字节码
基于贝叶斯估计的短时空域扇区交通流量预测