对于
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
,也有可能是不知道的。因此,我们第一步应该进行尝试性搜索,来确定原文件系统的类型。下面我们就开始对该分区进行分析与恢复。
步骤1 通过搜索十六进制字节“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
所示。
步骤2
寻找根目录。寻找根目录是为了确定
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
个扇区。我们只要再计算出每簇大小扇区数就可以进行文件系统的修复工作了。
步骤3
计算每簇大小扇区数。在此我们只介绍计算
FAT
文件系统每簇大小扇区数最常用的方法,这种方法需要依赖于分区原来的根目录下有子目录,如果分区中原来没有子目录,只在根目录下存储所有的文件,则无法使用此方法。不过这种情况毕竟很少出现,没有哪个用户会这样存储数据。
我们知道,为子目录分配的簇空间中,第一个目录项一定是一个“
.
”目录项,这个目录项用以描述该子目录本身,其中有一个参数描述了它现在所处的扇区的簇号。我们利用两个子目录间的起始扇区号差和它们的簇号差,就可以计算出每个簇的大小扇区数。甚至只需要利用一个子目录和根目录间的扇区号差及簇号差就可以计算得到。
要搜索一个子目录,可以在
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
的整数次幂,结果一定是错误的。另外,就是要多搜索几个子目录,根据不同子目录间的关系计算簇大小,以验证当前的结果是否正确。为了节省篇幅,我们在此不再对这个过程进行讲述。
步骤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
,所以直接将它复制过来。然后修复其中的参数。如图
10.45
所示。
可以看到,我们需要修改的参数只有图中所示的四个位置。修改完毕后,将其写入
0
号扇区。
提示:偏移
0x43
处的卷序列号也做了修改,因为这个
DBR
是由笔者计算机的
C
分区拷贝而来,为了避免冲突造成的不稳定,所以对其进行了修改。读者在实际恢复过程中也应该注意到这一点。
3)
将
0
号扇区复制一份,备份至
6
号扇区。
步骤6
重新识别硬盘。在我们的讲解中使用的是虚拟磁盘,所以将虚拟磁盘卸载并重新加载后原分区再现。如果在实际恢复中使用硬盘,可以在设备管理器中将其卸载后再检测新硬件,硬盘被重新加载后即可完成恢复。
在恢复过程中我们可以注意到,对于
Fsinfo
信息扇区可不必理会,并不影响数据的正常恢复。
《摘自数据重现-文件系统原理精解与数据恢复最佳实践》