NTFS的DBR恢复和FAT16/32的DBR恢复有何异同?
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
对于FAT16文件系统,因为没有DBR备份扇区,所以当DBR损坏时,就需要根据分区中的数据存储情况重建其DBR,手工恢复如此,软件也如此,只不过软件是虚拟出一个文件系统而已。
对于FAT32文件系统,如果只是DBR意外损坏,位于文件系统6号扇区的备份完好的情况下,可以使用备份DBR恢复主DBR。如果备份DBR也已经损坏,同样只能通过重建DBR来恢复其中的数据。
CIH病毒破坏后的结果应该算是重建DBR的最好案例,也是使用FAT2恢复FAT1的最好案例。CIH病毒对文件系统的破坏方式是使用随机码由文件系统的起始处开始覆盖,通常覆盖掉FAT1的部分内容后即导致计算机死机并崩溃。
重建FAT32的DBR需要以下几个参数:保留区大小扇区数、FAT表个数(通常为2)、每FAT表大小扇区数、根目录簇号(通常为2号簇)、每簇扇区数、分区前隐含扇区数及分区大小扇区数(这两个数值可以在该分区的分区表项中找到)。下面我们就来分析并计算这些参数。
通常FAT1的起始处位于40号扇区以前,而我们搜索到的这个FAT表位置在779号扇区,所以我们应该考虑到它是FAT2,我们按F3键继续向下搜索,没有再次找到该值,说明这确实是FAT2的起始扇区
寻找根目录。寻找根目录是为了确定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,即可弹出文本搜索设置框。
在设置框中进行如下设置:
u 在搜索文本框中输入“目录1”。
u 字符集选择“ASCII/Code page”,这是因为FAT32使用ASCII码存储文本字符。如果在NTFS下,则需要选择“Unicode”。
u 因为我们当前所处的位置是FAT2的起始扇区,要搜索的根目录位于其后,因此在搜索方向中选择“Down”,即向下搜索。
u 每个目录项的大小为32个字节,所以我们只需要位于可以被32整除的偏移处的结果,因此偏移调制设置为“?MOD 32 = 0”。
设置完毕后单击OK即开始搜索,最终在1520号扇区找到“目录1”。同时还可以看到了其他两个目录的目录项
至此,我们已经得到的参数有:保留区为38个扇区;每FAT大小为741个扇区。我们只要再计算出每簇大小扇区数就可以进行文件系统的修复工作了。
步骤3 计算每簇大小扇区数。在此我们只介绍计算FAT文件系统每簇大小扇区数最常用的方法,这种方法需要依赖于分区原来的根目录下有子目录,如果分区中原来没有子目录,只在根目录下存储所有的文件,则无法使用此方法。不过这种情况毕竟很少出现,没有哪个用户会这样存储数据。
我们知道,为子目录分配的簇空间中,第一个目录项一定是一个“.”目录项,这个目录项用以描述该子目录本身,其中有一个参数描述了它现在所处的扇区的簇号。我们利用两个子目录间的起始扇区号差和它们的簇号差,就可以计算出每个簇的大小扇区数。甚至只需要利用一个子目录和根目录间的扇区号差及簇号差就可以计算得到。
要搜索一个子目录,可以在Winhex中搜索位于扇区起始处的十六进制值“2E20202020202020202020”,这是“.”后面跟随10个空格的十六进制表现形式
第一个搜索到的子目录起始于1521号扇区,由第一个目录项可以获知该扇区所在的簇号:偏移0x14~0x15为簇号的高二位,偏移0x1A~0x1B处为簇号的低二位,不要忘记,这两个位置的数字本身都是以little-endian顺序存储的,也就是低位在前,高位在后。因此该扇区的簇号为0x00000003,即3号簇。
其实,我们现在已经可以利用该子目录的信息和根目录的信息计算出每簇的大小扇区数:根目录的簇号为2,起始扇区为1520;当前子目录的簇号为3,起始扇区为1521,所以:( 1521 – 1520 ) / ( 3 – 2 ) = 1,即每簇大小为1个扇区。
由于在实际当中,有可能某个子目录的信息是过去某个文件系统遗留下来的,所以为了确保结果正确,首先应该验证计算结果是否为2的整数次幂,如果不是2的整数次幂,结果一定是错误的。另外,就是要多搜索几个子目录,根据不同子目录间的关系计算簇大小,以验证当前的结果是否正确。为了节省篇幅,我们在此不再对这个过程进行讲述。
步骤4 从该分区的分区表项中获得其分区前隐含扇区数及分区大小扇区数。如图10.44所示,在物理磁盘界面中,单击按钮 ,然后选择丢失分区下的Partition table(template)即可跳转到该分区的分区表所在扇区,并自动用模版将其打开,可以从中获知该分区前的隐含扇区数及分区大小扇区数。
从其分区表项中可知,该分区的分区前隐含扇区数和分区大小扇区数分别为63和96327。
步骤5 重构文件系统。目前为止,我们已经得到了所有需要的参数:保留扇区数38,FAT表个数2,每FAT表大小扇区数741,每簇扇区数1,由分区表得到分区前隐含扇区数和分区大小分别为63、96327,可以重构文件系统了。
1) 利用我们前面讲到的备份DBR的方法,复制FAT2,然后转到38号扇区将其写入,重建FAT1。
2) 复制一个FAT32的DBR扇区,写入0号扇区。如果没有现成的FAT32的DBR,可以虚拟一个磁盘,划分一个分区后将其格式化成FAT32文件系统,然后复制它的DBR扇区。恰好我的计算机C分区是FAT32,所以直接将它复制过来。然后修复其中的参数。
修改完毕后,将其写入0号扇区。
提示:偏移0x43处的卷序列号也做了修改,因为这个DBR是由笔者计算机的C分区拷贝而来,为了避免冲突造成的不稳定,所以对其进行了修改。读者在实际恢复过程中也应该注意到这一点。
3) 将0号扇区复制一份,备份至6号扇区。
步骤6 重新识别硬盘。在我们的讲解中使用的是虚拟磁盘,所以将虚拟磁盘卸载并重新加载后原分区再现。如果在实际恢复中使用硬盘,可以在设备管理器中将其卸载后再检测新硬件,硬盘被重新加载后即可完成恢复。
在恢复过程中我们可以注意到,对于Fsinfo信息扇区可不必理会,并不影响数据的正常恢复。