用户的一个优盘,容量1GB,其中有大量的文件和文件夹。所有这些文件都与用户的一篇论文有关系,用户两个多月以来一直在写一篇论文。因为同时在家里及单位的多台计算机上写这篇论文,为了方便,用户把有关该论文的所有资料及论文本身都存放在这个优盘中,并且没有在其他计算机上备份,写论文时就把优盘插在计算机上,直接在优盘上编辑(说句题外话,优盘并不适合长时间插在计算机上工作,更不适合在计算机上直接编辑文档)。就这样论文写了两个多月的时间,基本已经定稿。
一天早晨用户来到单位,把优盘插在计算机上,像往常一样,双击优盘的盘符,但看到的并不是自己熟悉的文件,而是一堆乱码文件,具体内容如图4-363所示。
详细询问用户都做了什么不当的操作,用户说也没做什么,就是头天晚上写论文到很晚,最后终于定稿,写完后想把优盘卸载,但是却卸不掉,于是就直接拔了下来。
问题应该就出在这里了,没有按照正常方式卸载优盘,可能破坏了优盘内的文件系统结构。
因为优盘容量很小,只有1GB,所以为了避免在恢复过程中造成二次破坏,首先用WinHex把优盘做成一个完整的文件镜像。用WinHex做镜像的方法在3.1.1节中有详细讲解,这里不再重复。
做完镜像后直接用WinHex对镜像文件进行编辑,查看优盘的MBR、DBR扇区都没有问题。从DBR中可以看出分区用的是FAT32文件系统,对于FAT32的分区,打开后都是乱码文件的情况,问题很可能出在根目录区。为了慎重一些,还是先看看FAT表是否正常,查看了FAT1和FAT2,都完全正常,于是定位到根目录,其内容如图4-364所示。
很明显根目录所在扇区的数据根本就不是目录项,看起来像是某个文件的数据内容,文件系统把这些数据当目录项读取,打开分区当然就只能看到乱码了。
要恢复这个优盘的数据有很多方法,可以通过数据恢复软件扫描恢复,也可以手工分析并修复损坏的文件系统结构,从而恢复出数据。
用户说只要能恢复出来一个文件夹就可以了,文件夹名称为“9月20日最后定稿”。
优盘比较小,用软件扫描应该很快,就先用软件扫描试试吧。用R-studio扫描完后的结果非常糟糕,因为根目录破坏,R-studio为扫描出的文件建立了大量的目录,从这些混乱不堪的数据中寻找用户需要的文件太费事,不如手工分析用户需要的文件所在子目录,然后直接手工建一个目录项,指向用户的子目录,数据就能直接看到。
经过询问用户,用户确定所需文件夹“9月20日最后定稿”就放在根目录下,并且用户清楚地记得,在该文件夹下放着“封面”、“目录与摘要”、“正文”等Word文档。
下面的工作就是去找文件夹“9月20日最后定稿”所指向的子目录了。只要能找到这个子目录所在的簇,然后到根目录区中创建一个目录项指向该簇,就可以让文件夹“9月20日最后定稿”下的文件自动出现。
如何找这个子目录所在的簇呢?方法有很多,下面介绍两种:
因为用户告知在文件夹“9月20日最后定稿”下有“封面”、“目录与摘要”、“正文”等Word文档,所以可以搜索这些文件的目录项,就可以很轻松地找到它们的子目录区。
因为子目录所在簇的前两个目录项一定是“.”目录和“..”目录的目录项,通过搜索这两个目录项中的一个,就可以找到子目录区。
字符“.”对应的十六进制数值为“2E”,所以要搜索“.”的目录项,可以直接搜文本“.”,也可以搜其十六进制数值“2E”。因为文件目录项中的文件名部分是8.3格式,没用完的字符会用空格填充,所以为了提高搜索的准确性,可以在“.”之后加几个空格,空格对应的十六进制值为“20”。
这里以搜索“.”的十六进制数值为例,在WinHex中的搜索设置如图4-365搜索。
因为优盘中的文件夹非常多,所以子目录区也会非常多,如何判断哪个才是我们要找的呢?首先要排除掉“..”目录项中“文件起始簇号”不为0的子目录区。因为“..”目录表示上级目录,我们要找的子目录的上级目录就是文件夹“9月20日最后定稿”,是根目录下的文件夹,所以其子目录区中的“..”目录的目录项“文件起始簇号”这个参数一定要是0,如图4-366所示。
图4-366中第二条目录项就是“..”目录的目录项,画圈的四个字节为0,其上级目录就是根目录。
“..”目录项中“文件起始簇号”为0的子目录区,就都是根目录下的子目录区了,但这样的子目录区也很多,能不能让搜索更加精确一些呢?
用户说文件夹“9月20日最后定稿”是9月20日当天刚创建的,论文写完后就把最终稿移入了该文件夹。这样我们就可以把时间作为搜索条件,精确度就进一步提高了。
该如何利用这个时间呢,首先看看“..”目录项的结构,如图4-367所示。
文件目录项的偏移18H~19H处的两个字节就是文件最后修改日期。对文件夹来说,其修改时间很少改变,基本总是与创建时间保持一致,而“..”目录的时间则跟其上级目录的时间保持一致,所以我们要找的子目录区的“..”目录项的“文件修改日期”也应该是9月20日,年份为2009。用前面讲过的日期换算方法,将2009年9月20日换算为十六进制数值,等于3B34H。
另外,我们要搜索的“..”目录项的起始簇号必须为0,再加上文件夹的目录项“文件大小”这个参数也为0,所以我们现在可以搜索十六进制数值“343B000000000000”,来找我们要的目录项。搜索的具体设置如图4-368所示。
设置好后就开始搜索,结构很快就搜到了目标,如图4-369所示。
为了进一步验证,我们用模板看看“..”目录项后面的一条目录项,如图4-370所示。
这条目录项的文件名是“封面.DOC”,修改日期正是“2009-09-20”,与用户说的都相符,可以确定这就是我们要找的子目录区了。
找到子目录区只完成了一半,下面要到根目录区创建一个目录项指向该簇。该簇的簇号可以从“.”目录的目录项中查看到,因为“.”目录表示当前目录,其指向的簇号就是当前簇号。从“.”目录项中看到该簇号为十进制的1263簇,如图4-371所示。
下面返回到根目录区,把该簇的数据全部清零,然后创建一个文件夹的目录项指向1263簇。为了简单些,文件夹的名字就叫“123”吧。
具体创建的方法:先复制一个完整的文件夹的目录项放到根目录区,然后在此基础上修改。
最简单的方法就是直接把找到的子目录区中的“.”目录项复制到根目录区,再把文件名修改一下就可以了,修改时可以打开模板,这样比较方便,如图4-372所示。
只需要把文件名改为“123”就可以了,其他的都不要改。创建完的目录项如图4-373所示。
修改完后存盘,然后用虚拟硬盘工具“Inspro Disk”加载该优盘的镜像(虚拟硬盘的用法请参见3.2.1节),就可以打开分区看到数据了,如图4-374所示。
做到这一步,用户要的数据就全部恢复成功了。