2024年1月2日发(作者:)

FAT文件系统DBR损坏后的恢复

对于FAT16文件系统,因为没有DBR备份扇区,所以当DBR损坏时,就需要根据分区中的数据存储情况重建其DBR,手工恢复如此,软件也如此,只不过软件是虚拟出一个文件系统而已。

对于FAT32文件系统,如果只是DBR意外损坏,位于文件系统6号扇区的备份完好的情况下,可以使用备份DBR恢复主DBR。如果备份DBR也已经损坏,同样只能通过重建DBR来恢复其中的数据。(NTFS文件系统的DBR备份在分区的最后一个扇区)

CIH病毒破坏后的结果应该算是重建DBR的最好案例,也是使用FAT2恢复FAT1的最好案例。CIH病毒对文件系统的破坏方式是使用随机码由文件系统的起始处开始覆盖,通常覆盖掉FAT1的部分内容后即导致计算机死机并崩溃。如图10.32所示,加亮的部分被CIH病毒进行了覆盖写入。

下面来说明在这种情况下如何使用FAT2恢复FAT1,并根据分区中的数据存储情况计算BPB参数从而重建DBR。

首先起动虚拟机,向F32分区中拷入一些文件和目录(也可以直接在其中建立一些目录和文件),以营造数据存储环境。我们在其中建立三个目录并分别命名为“目录1”、“目录2”、“目录3”(见图10.33),每个目录下都有一个文件或目录。

然后,我们将保留区域及FAT1中的内容全部清空,制造DBR和FAT1被破坏的实际情景。完毕后,重启虚拟机,发现该分区的卷标已经不再显示,试图打开分区时提示未格式化。

这时候,在Winhex中的逻辑磁盘内选择该分区也无法将其打开,Winhex会提示没有找到可识别的文件系统。这是因为使用Winhex直接打开一个文件系统分区时,也是通过调用DBR中的参数对文件系统中的内容进行解释,DBR损坏后当然也就无法打开了。所以,我们应该选择打开物理磁盘,然后在打开的物理磁盘界面中单击按钮选择该分区将其打开。如图10.34所示。在物理磁盘界面中之所以能够打开DBR已经损坏的分区,是因为这时候Winhex并不是使用该分区的文件系统参数对分区内的数据进行解释,而只是利用分区表对该分区的起始位置及大小描述将其空间呈现给我们而已。

分区打开后,我们看到分区DBR已经不存在,向下翻看几十个扇区也没有找到可用的内容。在实际工作中,遇到这种情况时,我们有可能已经了解到该分区原来的文件系统格式为FAT32,也有可能是不知道的。因此,我们第一步应该进行尝试性搜索,来确定原文件系统的类型。下面我们就开始对该分区进行分析与恢复。

步骤1 通过搜索十六进制字节“F8FFFF”寻找FAT表。搜索位于某个扇区偏移0字节处的“F8FFFF”是为了尝试寻找FAT表,如果能找到FAT表,说明原来的文件系统是FAT系列文件系统,然后根据FAT表的特征值进而判断是哪一种FAT类型。这也是我们不建议直接搜索“F8FFFF0F”的原因,因为目前没有确定该分区就是一个FAT32分区,如果是一个FAT16分区的话,它的FAT表起始处就会是“F8FFFFFF”,所以搜索它们的共性更容易搜索到目标。搜索十六进制“F8FFFF”时,设置如图10.35所示。

很快,在779号扇区找到一个“F8FFFF”,如图10.36所示。

请同学们记录下你找到的FAT表的扇区号。

可以看到,这个扇区的内容是一个FAT32的FAT表,说明原来的文件系统为FAT32。因此,我们下面要做的就是重建它的DBR。

重建FAT32的DBR需要以下几个参数:保留区大小扇区数、FAT表个数(通常为2)、每FAT表大小扇区数、根目录簇号(通常为2号簇)、每簇扇区数、分区前隐含扇区数及

分区大小扇区数(这两个数值可以在该分区的分区表项中找到)。下面我们就来分析并计算这些参数。

通常FAT1的起始处位于40号扇区以前,而我们搜索到的这个FAT表位置在779号扇区,所以我们应该考虑到它是FAT2,我们按F3键继续向下搜索,没有再次找到该值,说明这确实是FAT2的起始扇区。请同学们根据实验的实际情况画一个如下的简单示意图。如图10.37所示。

步骤2 寻找根目录。寻找根目录是为了确定FAT2的大小,从而可以使用FAT2恢复FAT1。

寻找根目录的方法有多种:

一种方法是估算法。通常FAT32文件系统的FAT1起始于30~40号扇区的位置,可以根据FAT2的起始扇区号估算出一个FAT表的大小扇区数,然后向后跳过该扇区数,手工查找根目录。根目录前为FAT2的结尾处,而这个结尾处一定会有大量的“00”存在,可以据此判断是否正确地找到了根目录的位置。

第二种方法是搜索卷标。如果为文件系统设置了卷标,则根目录下的第一个目录项一定是卷标目录项。

第三种方法是搜索较早建立于根目录下的目录或文件名。

在此我们使用第三种方法。假定我们知道根目录下有一个目录的名字为“目录1”,在Winhex工具栏中单击搜索文本字符按钮 或选择菜单栏中的Search | Find Text,即可弹出文本搜索设置框。如图10.38所示。

在设置框中进行如下设置:

在搜索文本框中输入“目录1”。

字符集选择“ASCII/Code page”,这是因为FAT32使用ASCII码存储文本字符。如果在NTFS下,则需要选择“Unicode”。

因为我们当前所处的位置是FAT2的起始扇区,要搜索的根目录位于其后,因此在搜索方向中选择“Down”,即向下搜索。

每个目录项的大小为32个字节,所以我们只需要位于可以被32整除的偏移处的结果,因此偏移调制设置为“?MOD 32 = 0”。

设置完毕后单击OK即开始搜索,最终在1520号扇区找到“目录1”。同时还可以看到了其他两个目录的目录项。如图10.39所示。

请同学们记录下自己找到的根目录起始扇区号。

请同学们将根目录添加进文件系统结构示意图中,如图10.40所示。

现在,我们可以计算出FAT2的大小为1520 – 779 = 741个扇区。因此,FAT1的起始位置为779 – 741 = 38号扇区,如图10.41所示。

请同学们计算出自己的FAT表的大小,并分析FAT1的起始扇区号。

至此,我们已经得到的参数有:保留区为38个扇区;每FAT大小为741个扇区。我们只要再计算出每簇大小扇区数就可以进行文件系统的修复工作了。

步骤3 计算每簇大小扇区数。在此介绍计算FAT文件系统每簇大小扇区数最常用的方法,这种方法需要依赖于分区原来的根目录下有子目录,如果分区中原来没有子目录,只在根目录下存储所有的文件,则无法使用此方法。不过这种情况毕竟很少出现,没有哪个用户会这样存储数据。

我们知道,为子目录分配的簇空间中,第一个目录项一定是一个“.”目录项,这个目录项用以描述该子目录本身,其中有一个参数描述了它现在所处的扇区的簇号。我们利用两个子目录间的起始扇区号差和它们的簇号差,就可以计算出每个簇的大小扇区数。甚至只需要利用一个子目录和根目录间的扇区号差及簇号差就可以计算得到。

要搜索一个子目录,可以在Winhex中搜索位于扇区起始处的十六进制值“2E20202020”,这是“.”后面跟随10个空格的十六进制表现形式。其搜索设置框如图10.42所示。

第一个搜索到的子目录起始于1521号扇区,由第一个目录项可以获知该扇区所在的簇号:偏移0x14~0x15为簇号的高二位,偏移0x1A~0x1B处为簇号的低二位,不要忘记,进行高低位互换。因此该扇区的簇号为0x00000003,即3号簇。如图10.43所示。

请同学们记录下自己找到的第一个目录项的起始簇号和扇区号。

我们现在已经可以利用该子目录的信息和根目录的信息计算出每簇的大小扇区数:根目录的簇号为2,起始扇区为1520;当前子目录的簇号为3,起始扇区为1521,所以:( 1521

– 1520 ) / ( 3 – 2 ) = 1,即每簇大小为1个扇区。

请同学们计算出每簇扇区数。

由于在实际当中,有可能某个子目录的信息是过去某个文件系统遗留下来的,所以为了确保结果正确,首先应该验证计算结果是否为2的整数次幂,如果不是2的整数次幂,结果一定是错误的。另外,就是要多搜索几个子目录,根据不同子目录间的关系计算簇大小,以验证当前的结果是否正确。

步骤4 从该分区的分区表项中获得其分区前隐含扇区数及分区大小扇区数。如图10.44所示,在物理磁盘界面中,单击下拉箭头按钮,然后选择丢失分区下的分区模板,即可跳转到该分区的分区表所在扇区,并自动用模版将其打开,可以从中获知该分区前的隐含扇区数及分区大小扇区数。

从其分区表项中可知,该分区的分区前隐含扇区数和分区大小扇区数分别为63和96327。

请同学们记录下实验分区的分区前隐含扇区数和分区大小扇区数。

步骤5 重构文件系统。目前为止,我们已经得到了所有需要的参数:保留扇区数38,FAT表个数2,每FAT表大小扇区数741,每簇扇区数1,由分区表得到分区前隐含扇区数和分区大小分别为63、96327,可以重构文件系统了。

请同学们将实验数据进行如上的总结。

1)复制FAT2,然后转到38号扇区(同学们通过实验计算得到的FAT1的起始扇区)将其写入,重建FAT1。

2)复制一个FAT32的DBR扇区,写入0号扇区。如果没有现成的FAT32的DBR,可以虚拟一个磁盘划分一个分区后,或者插上优盘,将其格式化成FAT32文件系统,然后复制它的DBR扇区。然后修复其中的参数。如图10.45所示。

可以看到,我们需要修改的参数只有图中所示的四个位置。修改完毕后,将其写入0号扇区。

3)将0号扇区复制一份,备份至6号扇区。

步骤6 重新启动虚拟机。或者重新识别硬盘,可以在设备管理器中将其卸载后再检测新硬件,硬盘被重新加载后即可完成恢复。