对于FAT16文件系统,因为没有DBR备份扇区,所以当DBR损坏时,就需要根据分区中的数据存储情况重建其DBR,手工恢复如此,软件也如此,只不过软件是虚拟出一个文件系统而已。
对于FAT32文件系统,如果只是DBR意外损坏,位于文件系统6号扇区的备份完好的情况下,可以使用备份DBR恢复主DBR。如果备份DBR也已经损坏,同样只能通过重建DBR来恢复其中的数据。
CIH病毒破坏后的结果应该算是重建DBR的最好案例,也是使用FAT2恢复FAT1的最好案例。CIH病毒对文件系统的破坏方式是使用随机码由文件系统的起始处开始覆盖,通常覆盖掉FAT1的部分内容后即导致计算机死机并崩溃。如图10.32所示,加亮的部分被CIH病毒进行了覆盖写入。
下面我们仍以随书光盘中的虚拟磁盘文件format.hdd为例,使用其中的第二个分区,即F32分区来说明在这种情况下如何使用FAT2恢复FAT1,并根据分区中的数据存储情况计算BPB参数从而重建DBR。
首先将虚拟磁盘文件加载为虚拟盘后,向F32分区中拷入一些文件和目录(也可以直接在其中建立一些目录和文件),以营造数据存储环境。为了便于讲述,我们在其中建立三个目录并分别命名为“目录1”、“目录2”、“目录3”(见图10.33),每个目录下都有一个文件或目录。
然后,我们将保留区域及FAT1中的内容全部清空,制造DBR和FAT1被破坏的实际情景(该镜象文件位于随书光盘A的“第10章”目录下,文件名为DBR_delete.hdd。读者可以将其拷贝到本地磁盘根目录下跟随我们一起完成DBR的重建过程。恢复成功后的镜象文件请保存好,在后面的删除分析章节中我们将会使用这个文件)。完毕后,将虚拟磁盘卸载后重新加载,发现该分区的卷标已经不再显示,试图打开分区时提示未格式化。
这时候,在Winhex中的逻辑磁盘内选择该分区也无法将其打开,Winhex会提示没有找到可识别的文件系统。这是因为使用Winhex直接打开一个文件系统分区时,也是通过调用DBR中的参数对文件系统中的内容进行解释,DBR损坏后当然也就无法打开了。所以,我们应该选择打开物理磁盘,然后在打开的物理磁盘界面中单击 按钮选择该分区将其打开。如图10.34所示。
在物理磁盘界面中之所以能够打开DBR已经损坏的分区,是因为这时候Winhex并不是使用该分区的文件系统参数对分区内的数据进行解释,而只是利用分区表对该分区的起始位置及大小描述将其空间呈现给我们而已。
分区打开后,我们看到分区DBR已经不存在,向下翻看几十个扇区也没有找到可用的内容。在实际工作中,遇到这种情况时,我们有可能已经了解到该分区原来的文件系统格式为FAT32,也有可能是不知道的。因此,我们第一步应该进行尝试性搜索,来确定原文件系统的类型。下面我们就开始对该分区进行分析与恢复。
<b>步骤1 </b>通过搜索十六进制字节“F8FFFF”寻找FAT表。搜索位于某个扇区偏移0字节处的“F8FFFF”是为了尝试寻找FAT表,如果能找到FAT表,说明原来的文件系统是FAT系列文件系统,然后根据FAT表的特征值进而判断是哪一种FAT类型。这也是我们不建议直接搜索“F8FFFF0F”的原因,因为目前没有确定该分区就是一个FAT32分区,如果是一个FAT16分区的话,它的FAT表起始处就会是“F8FFFFFF”,所以搜索它们的共性更容易搜索到目标。搜索十六进制“F8FFFF”时,设置如图10.35所示。
很快,在779号扇区找到一个“F8FFFF”,如图10.36所示。
可以看到,这个扇区的内容是一个FAT32的FAT表,说明原来的文件系统为FAT32。因此,我们下面要做的就是重建它的DBR。
重建FAT32的DBR需要以下几个参数:保留区大小扇区数、FAT表个数(通常为2)、每FAT表大小扇区数、根目录簇号(通常为2号簇)、每簇扇区数、分区前隐含扇区数及分区大小扇区数(这两个数值可以在该分区的分区表项中找到)。下面我们就来分析并计算这些参数。
通常FAT1的起始处位于40号扇区以前,而我们搜索到的这个FAT表位置在779号扇区,所以我们应该考虑到它是FAT2,我们按F3键继续向下搜索,没有再次找到该值,说明这确实是FAT2的起始扇区。我们可以画一个简单的示意图。如图10.37所示。
<b>步骤2 </b>寻找根目录。寻找根目录是为了确定FAT2的大小,从而可以使用FAT2恢复FAT1。
寻找根目录的方法有多种:
u 一种是搜索回收站。在文件系统刚刚创建时,该文件系统下是没有回收站“Recycled”目录的。在第一次将数据删除至回收站时,系统即会在根目录下建立该目录。因此,可以通过搜索字符“Recycled”来寻找根目录。但理论上来讲,如果在第一次分配给根目录的2号簇装满目录项前没有进行过删除操作,那么Recycled目录就会建立在分配给根目录的后续簇空间中,而这个簇可以是未分配的任何一个簇。在这种情况下,我们通过搜索“Recycled”找到的根目录就不是根目录的起始簇。
u 还有一种方法是估算法。由于FAT2起始于779号扇区,通常FAT32文件系统的FAT1起始于30~40号扇区的位置,由此可以估算出一个FAT表的大小扇区数,然后向后跳过该扇区数,手工查找根目录。根目录前为FAT2的结尾处,而这个结尾处一定会有大量的“00”存在,可以据此判断是否正确地找到了根目录的位置。
u 第三种方法是搜索卷标。如果为文件系统设置了卷标,则根目录下的第一个目录项一定是卷标目录项。
u 第四种方法是搜索较早建立于根目录下的目录或文件名。
其他方法我们不再一一列举,读者可以在实际恢复中根据不同情况区别对待,灵活掌握。
为了向读者介绍如何在Winhex中搜索字符,在此我们使用第四种方法。假定我们知道根目录下有一个目录的名字为“目录1”,在Winhex工具栏中单击搜索文本字符按钮 或选择菜单栏中的Search | Find Text,即可弹出文本搜索设置框。如图10.38所示。
在设置框中进行如下设置:
u 在搜索文本框中输入“目录1”。
u 字符集选择“ASCII/Code page”,这是因为FAT32使用ASCII码存储文本字符。如果在NTFS下,则需要选择“Unicode”。
u 因为我们当前所处的位置是FAT2的起始扇区,要搜索的根目录位于其后,因此在搜索方向中选择“Down”,即向下搜索。
u 每个目录项的大小为32个字节,所以我们只需要位于可以被32整除的偏移处的结果,因此偏移调制设置为“?MOD 32 = 0”。
设置完毕后单击OK即开始搜索,最终在1520号扇区找到“目录1”。同时还可以看到了其他两个目录的目录项。也如图10.39所示。
我们将根目录添加进文件系统结构示意图中,如图10.40所示。
现在,我们可以计算出FAT2的大小为1520 – 779 = 741个扇区。因此,FAT1的起始位置为779 – 741 = 38号扇区,如图10.41所示。
至此,我们已经得到的参数有:保留区为38个扇区;每FAT大小为741个扇区。我们只要再计算出每簇大小扇区数就可以进行文件系统的修复工作了。
<b>步骤3 </b>计算每簇大小扇区数。在此我们只介绍计算FAT文件系统每簇大小扇区数最常用的方法,这种方法需要依赖于分区原来的根目录下有子目录,如果分区中原来没有子目录,只在根目录下存储所有的文件,则无法使用此方法。不过这种情况毕竟很少出现,没有哪个用户会这样存储数据。
我们知道,为子目录分配的簇空间中,第一个目录项一定是一个“<b>.</b>”目录项,这个目录项用以描述该子目录本身,其中有一个参数描述了它现在所处的扇区的簇号。我们利用两个子目录间的起始扇区号差和它们的簇号差,就可以计算出每个簇的大小扇区数。甚至只需要利用一个子目录和根目录间的扇区号差及簇号差就可以计算得到。
要搜索一个子目录,可以在Winhex中搜索位于扇区起始处的十六进制值“2E20202020202020202020”,这是“.”后面跟随10个空格的十六进制表现形式。其搜索设置框如图10.42所示。
第一个搜索到的子目录起始于1521号扇区,由第一个目录项可以获知该扇区所在的簇号:偏移0x14~0x15为簇号的高二位,偏移0x1A~0x1B处为簇号的低二位,不要忘记,这两个位置的数字本身都是以little-endian顺序存储的,也就是低位在前,高位在后。因此该扇区的簇号为0x00000003,即3号簇。如图10.43所示。
其实,我们现在已经可以利用该子目录的信息和根目录的信息计算出每簇的大小扇区数:根目录的簇号为2,起始扇区为1520;当前子目录的簇号为3,起始扇区为1521,所以:( 1521 – 1520 ) / ( 3 – 2 ) = 1,即每簇大小为1个扇区。
由于在实际当中,有可能某个子目录的信息是过去某个文件系统遗留下来的,所以为了确保结果正确,首先应该验证计算结果是否为2的整数次幂,如果不是2的整数次幂,结果一定是错误的。另外,就是要多搜索几个子目录,根据不同子目录间的关系计算簇大小,以验证当前的结果是否正确。为了节省篇幅,我们在此不再对这个过程进行讲述。
<b>步骤4 </b>从该分区的分区表项中获得其分区前隐含扇区数及分区大小扇区数。如图10.44所示,在物理磁盘界面中,单击按钮 ,然后选择丢失分区下的Partition table(template)即可跳转到该分区的分区表所在扇区,并自动用模版将其打开,可以从中获知该分区前的隐含扇区数及分区大小扇区数。
从其分区表项中可知,该分区的分区前隐含扇区数和分区大小扇区数分别为63和96327。
<b>步骤5 </b>重构文件系统。目前为止,我们已经得到了所有需要的参数:保留扇区数38,FAT表个数2,每FAT表大小扇区数741,每簇扇区数1,由分区表得到分区前隐含扇区数和分区大小分别为63、96327,可以重构文件系统了。
1) 利用我们前面讲到的备份DBR的方法,复制FAT2,然后转到38号扇区将其写入,重建FAT1。
2) 复制一个FAT32的DBR扇区,写入0号扇区。如果没有现成的FAT32的DBR,可以虚拟一个磁盘,划分一个分区后将其格式化成FAT32文件系统,然后复制它的DBR扇区。恰好我的计算机C分区是FAT32,所以直接将它复制过来。然后修复其中的参数。如图10.45所示。
可以看到,我们需要修改的参数只有图中所示的四个位置。修改完毕后,将其写入0号扇区。
提示:偏移0x43处的卷序列号也做了修改,因为这个DBR是由笔者计算机的C分区拷贝而来,为了避免冲突造成的不稳定,所以对其进行了修改。读者在实际恢复过程中也应该注意到这一点。
3) 将0号扇区复制一份,备份至6号扇区。
<b>步骤6 </b>重新识别硬盘。在我们的讲解中使用的是虚拟磁盘,所以将虚拟磁盘卸载并重新加载后原分区再现。如果在实际恢复中使用硬盘,可以在设备管理器中将其卸载后再检测新硬件,硬盘被重新加载后即可完成恢复。
在恢复过程中我们可以注意到,对于Fsinfo信息扇区可不必理会,并不影响数据的正常恢复。
《摘自数据重现-文件系统原理精解与数据恢复最佳实践》
本文转自老骥伏枥51CTO博客,原文链接:http://blog.51cto.com/sjhfml/137126 ,如需转载请自行联系原作者