FAT数据恢复分析
数据恢复分析由于FAT系列文件系统是应用较为广泛的Windows操作系统所使用的文件系统类型,因此,对其数据丢失的情况及恢复可能性的研究也比较普及。在此,我们来分析一下FAT系列文件系统数据恢复需要考虑的问题。
1.FAT表链丢失问题
早在DOS时代就已经有了从FAT文件系统恢复文件的软件,但它的帮助文件中只是简单地介绍软件的功能,而并没有更多关于文件恢复方面的理论指导。前面讲过,Windows删除文件时,文件的目录项被标记为未使用并将其FAT表内的簇链清空。恢复文件时,我们可以从残留的目录项中得到文件的起始簇号和文件大小,但却无法得知文件的其余簇所在的位置。
我们可以先读取文件的第一簇,对于文件的剩余部分,会面临两种选择:
一是按文件大小直接读取跟在第一簇后面的数据,而不管所读取的位置是否是已分配使用;
第二是只从目前状态为未分配的簇中读取数据。
显然,第二种选择要比第一种选择成功恢复的可能性更大,因为这样可以恢复一些片段化的文件。
我们可以用图3.33说明这两种选择间的不同,图中显示了文件系统的6个簇及三种不同的可能分配情况。一个文件大小为7,094字节,每簇大小为2,048字节,因此这个文件需要4个簇。我们还知道这个文件的起始簇号为56。淡灰色的簇代表这个文件的内容所在的簇。
图3.33文件存储位置
不同的存储情况,不同的恢复思路都会直接影响到恢复的效果。可能的情况有如下几种:
一种情况是假设文件的4个簇是连续的,如图3.33(A)所示。文件占用56~59号4个连续的簇,在这种情况下,两种恢复思路都可以成功地将文件从56~59号簇恢复出来。
第二种情况如图3.33(B)所示,文件片段化,分别存储在56、58、59、61号簇中,57号簇和60号簇目前被其他文件的内容占用。在这种情况下,不同的恢复思路会有不同的恢复结果:
思路一将会恢复56~59号簇中的内容,这样就将不属于该文件的57号簇错误地加进了文件中,却丢失了文件的最后一个簇即61号簇中的内容。
而如果采用思路二的方法,则会正确地从56、58、59和61号簇中恢复内容。
第三种情况如图3.33(C)所示,文件同样存储在56、58、59、61号簇中,不同的是,57号簇和60号簇目前并没有被任何数据占用,也是未分配空间。在这种情况下,两种思路都会错误地从56~59号簇中提取数据。
在文件恢复的过程中还会遇到其他的情况,比如文件内容被覆盖,这种情况下将无法正确地恢复数据。
提示:在程序设计时,采用思路二在恢复的过程中考虑到簇的分配状态,会比思路一具有更高的恢复成功率。
2.目录片段化问题
在进行数据恢复的时候要注意的另一个问题是,一个具有多个簇的目录很容易片段化。因为,只有当目录需要的时候才会为其分配第二个簇,而这时该目录的第一个簇后的簇空间不太可能是空闲的(因为这个簇位置大多会分配给该目录中的某个文件使用),因此完整地恢复目录非常困难。不过,如果具有多个簇的目录是整体拷贝过来的,或者最近刚刚做过磁盘碎片整理,则它的所有簇是连续的。
3.文件名问题
文件被删除时,它的目录项的第一个字节被改为0xE5以说明它已被删除。对于短文件名项,这样会使其文件名的第一个字节被覆盖。而对于长文件名项,则会覆盖掉它的序号。对于数据恢复而言,可能会存在两个问题:
文件名补全问题。通常我们在恢复被删除的文件时需要自己补足其短文件名的第一个字符。如果该文件具有长文件名,这时我们可以从其长文件名中找到它的第一个字符。当删除一个目录时,原来位于这个目录内的目录项有可能被更改,也有可能不进行更改操作。
重名问题。当一个目录项被取消分配时,它的第一个字节也就是名字的第一个字母将会被删除(改为0xE5),如果有两个文件A-1.txt和B-1.txt被删除,则它们的目录项中的名字都将会成为“_-1.txt”,在搜索过程中将会产生同名冲突问题。
4.孤目录与孤文件问题
还有一个问题出现在一个目录项被删除后又被重新分配使用的时候。在这种情况下,现在的目录项已经不再指向原来的文件或目录,原来的文件和目录将没有目录项指向它们,也就无法定位其所在位置。比如说,一个目录项原来指向210号簇,然后目录项被删除并重新对其进行分配,现在指向了400号簇,210号簇内的内容依然存在,但我们无法简单地沿着目录树找到它们,我们也无法知道它们的存在,这时这些文件就被称为孤目录或孤文件。
孤目录
要找到孤目录,我们必须对数据区中的每个扇区进行检查。检查方法并没有一个标准的规定,一种方法是检查每个扇区(注意不是簇)的前32个字节,看它们是否符合目录项的结构。如果符合目录项结构,就应该继续查看这个扇区的其余部分以查找可用信息。对每个扇区进行检查,可以避免遗漏掉那些位于已分配给其它文件使用的簇的松驰空间中的目录项。还有一种类似的方法是搜索每个簇的前32个字节是否为一个“.”目录项,因为每个目录的第一个目录项一定是““.”目录项。不过这种方法只能查找到目录的第一个簇,而无法查找到目录的其它片段。
在程序的实现中,解决这些问题的一种方法是建立另外的目录项地址序列。例如有的软件及某些Unix操作系统会假设所有的扇区都分配给目录使用,每个扇区被分成16个大小为32字节的项,假设每个项都是一个目录项,然后从数据区的第一个扇区的第一个项开始向后依次进行编号,即数据区起始扇区的第一个项为0号目录项,第二个为1号目录项。
不过仍然有一个明显的问题,每个文件和目录都会有一个目录项指向它,但根目录却没有。这是因为根目录的位置(对于FAT12/16还包括大小值)记录在引导扇区中,而并不是由数据区内的目录项进行描述的。有的软件解决这个问题的方法是为根目录分配2号目录项地址号,然后再从3开始向后进行分配。也就是说数据区起始扇区的第一个项为3号目录项。
孤文件
要找到孤文件,目前最好的方法是根据文件的特定文件头及文件尾格式进行查找。这种方式对于连续存放的文件非常有效,但对于片段化的文件则无法很好地恢复。
如果用户经常地对磁盘进行碎片整理,则恢复最后一次碎片整理后删除的文件就非常容易,因为这时文件基本上是存储在连续的簇中的。但如果是删除了文件后对磁盘进行了碎片整理,则很难成功恢复,因为在整理过程中被删除的文件的目录项会被清除,而由于整理过程中文件内容被来回移动,文件原来所在的簇已经被重新分配,原有内容也已经被覆盖掉了。
5.分配策略问题
Win XP的分配程序可以使被删除文件的文件名存留较长的时间,因为它不使用第一可用分配策略。但这并不意味着与使用第一可用分配策略相比可以恢复出更多的数据,因为文件内容原来所占用的簇空间可能已经被重新分配出去,这样文件内容也就被覆盖掉了。所以,即使能够看到文件名,但却并不一定能够恢复出它的数据内容。
(版主帮忙删一下最后的两个图片,谢谢)
[ 本帖最后由 ttnml 于 2009-2-5 15:18 编辑 ] 看了,顶一下。。。。。。。。。。。。。。。。。。。。。。。。。 谢谢分享啊 学习了,谢谢楼主 很好的资料,但愿这本书早点出版!! 想法是好的,但是很难实现 xxxxxxxxxxxxxxxxxxxxxxxxxxxx 期待中... ... 写得好,如果磁盘格式化了,我可以按照我设想的方式来,前提是簇大小和以前一样,用winhex把所有的目录项找到,然后把能写出的文件都写出来,如果有能打开的文件进去fat表里面把簇给占用上,以此类推把所有能打开的文件的所在簇都写道fat表里面,剩余的就是不连续的文件,然后在按照上述版主的方式恢复,我觉得这样会更好!(38: (38: 原帖由 haobinnan 于 2009-2-10 07:46 发表 http://bbs.intohard.com/images/common/back.gif
写得好,如果磁盘格式化了,我可以按照我设想的方式来,前提是簇大小和以前一样,用winhex把所有的目录项找到,然后把能写出的文件都写出来,如果有能打开的文件进去fat表里面把簇给占用上,以此类推把所有能打开的文 ...
不错的想法