我们先来看看一个
FAT32
分区的
Boot
扇区
前面我们已经介绍了各个重要参数:
Bytes per sector:
每个扇区字节数,通常情况下都是
512
字节
Sectors per cluster
:
每一个簇占用的扇区数
Reserved sectors
:
第一个
FAT
表距离
boot
扇区的扇区数
Big sectors on drive:
分区大小,占用多少扇区
Big sectors per FAT:
FAT
表大小,占用多少扇区
1st root cluster
:
根目录所在的簇
Backup boot sector:
Boot
扇区备份扇区所在位置,相对于当前
boot
扇区
File system:
文件系统(
FAT32
)
从这个扇区的数据我们可以总结出很多东西:
1、
第一个
FAT
表从第
63+38=101 sec
开始,大小为
12621 sec
;
2、
第二个
FAT
表(
FAT
表备份)从第
101+12621=12722 sec
开始(第二个
FAT
表紧跟第一个
FAT
表);
3、
根目录所在的位置是第
2
号簇紧接在第二个
FAT
表结束处,即
12722+12621=25343 sec
开始;
4、
每个簇大小是
8
个扇区;
5、
第
0
簇可以反推,即
25343-8*2=25327 sec
;
6、
Boot
扇区备份在距离
63
扇区
6
个扇区,也就是第
69
扇区(如果第一个
boot
扇区被破坏,我们可以把备份
boot
扇区还原过来);
一个分区被格式化的时候,所实行的操作就是:
1
、建立
boot
扇区;
2
、建立
boot
扇区备份;
3
、建立
FAT
表和
FAT
标备份;
4
、建立根目录;
所有参数都保存在
boot
扇区中。
Boot
扇区
63sec
|
Boot
扇区备份
69sec
|
FAT
表
101 sec
|
FAT
表备份
12722 sec
|
25343 sec
根目录区
|
数据区
|
|
|
FAT
表大小
12621 sec
|
FAT
表备份大小
12621 sec
|
|
|
Boot
扇区距离主
FAT
表
38
扇区
|
63+38
|
101+12621
|
12722+12621
|
|
|
|
FAT
表、
FAT
表备份、根目录区三个是连续的,中间没有间隔别的数据
|
如果一个带有数据的硬盘被重新格式化,计算机所做的操所就是以上
4
个步骤:重建
boot
扇区,
FAT
表和
FAT
表备份都清
0
,根目录区也请
0
,子目录和数据区没有更改。
揭开
FAT
表真相
1、
簇的概念:磁盘上最小可寻址存储单元称为扇区,通常每个扇区为
512
个字节。由于多数文件比扇区大得多,因此如果对一个文件分配最小的存储空间,将使存储器能存储更多数据,这个最小存储空间即称为簇。根据存储设备
(
磁盘、闪卡和硬盘
)
的容量,簇的大小可以不同以使存储空间得到最有效的应用。在早期的
360KB
磁盘上,簇大小为
2
个扇区
(1,024
字节
)
;第一批的
10MB
硬盘的簇大小增加到
8
个扇区
(4,096
字节
)
;现在的小型闪存设备上的典型簇大小是
8KB
或
16KB
。
2GB
以上的硬盘驱动器有
32KB
的簇。
举个例子:有一个文件大小
1KB
,在硬盘分区中,一个簇大小为
8
个扇区,这个文件存放在
1
个簇就够了,
1
个簇的大小是
4KB
,这个簇存放了
1KB
的数据以后,还剩余
3KB
的空间,这
3KB
是不能在被别的文件使用了,因为一个簇是文件分配的最小存储空间,一个簇上只能存放属于一个文件的数据,不能存放多个文件数据。一旦某个族被用了
1
个字节也好,这个簇被标记为已经存放数据了,别的数据就不能往这个簇里存放了。这样的做法造成了一定磁盘空间的浪费,但是对于操作系统文件存储是有利的,牺牲掉一点空间也就无所谓了。
我们从这个文件属性可以看出来,这个文件实际大小才有
2.19KB
,可是却占用
4KB
的磁盘空间,由此我们可以推断出,这个硬盘分区一个簇是有
8
个扇区组成的。上图
Boot
扇区中明确定义
Sectors per cluster
:
每一个簇占用的扇区数是
8 sec
。簇的大小在格式化的时候可以选择,最大在
windows2003
系统中支持
64KB
。
2
、
FAT
表的概念:在一个硬盘分区中,最小的存储单元是簇,
FAT
表就是对这些簇进行编号。
FAT
位数
簇数量
簇编号范围
FAT12 4096 2
的
12
次方
000
到
FFF 3
位十六进制
12
位二进制
FAT16 65536 2
的
16
次方
0000
到
FFFF 4
位十六进制
16
位二进制
FAT32 4294967296 2
的
32
次方
00000000
到
FFFFFFFF 8
位十六进制
32
位二进制
可以理解为:
FAT12
可以编号
2
的
12
次方个簇,
FAT16
可以编号
2
的
16
次方个簇,
FAT32
可以编号
2
的
32
次方个簇。
也可以理解为:
FAT12
是使用
12
位二进制地址来存放簇的编号,
FAT16
是使用
16
位二进制地址来存放簇的编号,
FAT32
是使用
32
位二进制地址来存放簇的编号。
3、
用
Runtime's DiskExplorer For FAT
查看
FAT
表
查看
FAT
表的方式有两种,一种是通过
Boot
扇区数据计算第一个
FAT
标所在的扇区,例如上图的
Boot
扇区信息,可以得出第一个
FAT
表从第
63+38=101 sec
开始;还有一种方法是通过
Tools
à
Search
(快捷键
Ctrl+F
)从
boot
扇区开始往后搜索:
到达第
101
扇区:
我们用
FAT32
浏览模式看
View
à
as Fat32
(或者按
F8
)
下图就是
Fat32
格式的
FAT
表:
FAT32
用
8
位十六进制编号簇,现在是一个刚刚格式化还没存放数据的分区的
FAT
表,除了开始
3
个编号,其余都是空的。
如果是
Fat12
格式,
FAT
表用
3
位十六进制标号簇,如果是
Fat16
格式,
FAT
表用
4
位十六进制标号簇。
我们往这个分区拷贝一些数据以后,再来看看
FAT
表:
这时候
FAT
表已经编上号码了,显示
的地方是某个文件或者文件夹开始簇标记。
这个分区的
FAT
表大小是
12621 sec
,从上图可以看出,一个扇区可以存放
8*16=128
个簇编号。
12621
个扇区可以存放
12621*128=1615488
个簇,每个簇有
8
个扇区,那么参与簇编号的有
1615488*8=12923904 sec
,其中还剩余少量扇区不参与簇编号。
第
0
簇是不是从
boot
扇区开始算呢,回答是否定的。根据
boot
表信息,目录区是从第
2
号簇开始的,那么第
0
簇就应该是目录区往前移
2
个簇,我们根据上面计算得知,根目录起始扇区是
25343 sec
,那
0
簇就是从
25343-8*2=25327
扇区开始的。这些数据稍后的分析中用到。
Runtime's DiskExplorer For FAT
程序提供这样一个功能,双击分区表,到达该分区的
boot
扇区:
双击
boot
扇区,到达该分区的目录区:
目录区:目录区中的
DATA01
是该分区的
Volume label
(卷标号),紧跟着下面是分区根目录名称个根目录下的文件。
Sector Offset
Name
Ext Status
Type
Attributes
Size
Date Time
Cluster
Created Created Accessed NT
x000062FF x000 DATA01 DIR __l____ 0 2007-05-30 13:48:40 x00000000 00:00:00 x00
25343 x020
记事
.txt
#1 last LFN Check Sum: x7E
x040
记事
TXT FILE a______ 2249 2007-05-30 13:41:38 x00000003 2007-05-30 15:03:36 2007-05-30 x00
x060
数据恢复教程
#1 last LFN Check Sum: x89
x080
数据恢
~1
DIR _d_____ 0 2007-05-30 16:00:04 x00000004 2007-05-30 16:00:02 2007-05-30 x00
x0A0 unused FILE _______ 0 00:00:00 x00000000 00:00:00 x00
x0C0 unused FILE _______ 0 00:00:00 x00000000 00:00:00 x00
从根目录可以看出,这里定义文件名、文件大小、文件存放起始簇号等。
#1 last LFN
是把长文件名分多段存放。一个长文件名有多个
last LFN
。
我们看看“
记事
.txt
”这个文件,这个文件大小是
2249
字节,这里的Size单位是字节,换算成扇区是 2249/512约等于4.4个扇区,约等于2.19KB。存放的开始簇是
x00000003
,也就是编号为3的簇,因为一个簇大小为8个扇区,所以这个文件存放在一个簇就够了。
0
簇从
25327
扇区开始,那么
0
簇就从
25327+3*8=25351 sec
开始,这样“
记事
.txt
”文件存放地就是第
25351
扇区开始,我们到第
25351
扇区看看:
这是一个文本文件,所以文本浏览模式是可读的,经验证确实是
“
记事
.txt
”文件的内容。
在
FAT32
格式的分区中,文件的写入有三个地方数据生成:文件名、文件
FAT
表(主表和备份表)、文件数据。
删除文件的时候,只更改文件名、文件
FAT
表(主表和备份表),没有更改文件数据区。
FAT
分区下删除文件,会清掉
Fat
表信息,在文件名或文件夹名把第一个字节改写成
E5
,
文件夹删除时还在倒数第三个字节填写
10
常值是
00
目录区每一条文件名记录占用
32
个字节
x040
记事
TXT FILE a______ 2249 2007-05-30 13:41:38 x00000003 2007-05-30 15:03:36 2007-05-30 x00
这条记录的十六进制代码如下:
如果删除掉“记事
.txt
”文件
目录会做出删除标记
x040
这一行
记录和十六进制代码如下:
x040
迩事
TXT deleted FILE a______ 2249 2007-05-30 13:41:38 x00000003 2007-05-30 15:03:36 2007-05-30 x00
对比十六进制代码就知道,他们唯一的差别就是开始一个字节由
BC
变成了
E5
。删除掉的文件都把文件名称头部一个字节更改为
E5
,“记事”这两个汉字占用
4
个字节,十六进制代码为“
BC C7 CA C2”
改为“
E5 C7 CA C2”以后显示成了:
某个目录
没删除之前
BB
A4 BA BD CD F8 D5 BE 20 20 20 10 00 9D D3 95
BC 36 BC 36 01 00 D4 95 BC 36 FF 1B 00
00
00 00
删除之后
E5 A4 BA BD CD F8 D5 BE 20 20 20 10 00 9D D3 95
BC 36 BC 36 00 00 D4 95 BC 36 FF 1B 00
10
00 00
通过对
FAT32
文件系统的分析,我们知道格式化硬盘、创建文件、删除文件时,操作系统对硬盘到底作了怎样的操作。这是编写数据恢复软件必须要掌握的知识。
FAT32
文件系统带有数据的分区由于某种原因误格式化、误删除数据以后,我们还是有办法把数据恢复回来。原因是删除以后文件名及目录信息被标记为删除,被删除的文件在
FAT
表内簇号标记被清空。恢复的方法是找到文件名信息(包含文件名、文件大小、文件起始簇位置),根据这些信息绕过
FAT
表,从文件起始簇开始拷贝数据,连续拷贝要恢复文件的大小扇区数。这种成功恢复的前提是,这个文件必须在磁盘上存储是连续的,如果存储不连续,这样的恢复方式只能恢复文件第一个簇开始以后的数据,别的不连续的数据没办法找出来。因为这些分段存储的文件,只有
FAT
表知道他们存放的位置,如果
FAT
表被清空,我们只能恢复文件第一个数据段,往后的数据段都没办法找到。
同名文件覆盖,由于不更改文件存储起始簇,所以原文件数据区肯定被新文件数据覆盖。如果新文件小于原始文件,原始文件尾部也许还能找的到。
文件分段存储的问题在
FAT32
下相对少一些,我曾经做过试验:在一个已有的文件中追加更多内容,保存后整个文件整体迁移到另一个地方了!
我们可以把已经删除的文件名称头部的
E5
这个字节改回原来的数值,这样在计算机里原来删除掉的文件又能正常识别得到,但是不能拷贝,也不能打开。因为操作系统对文件的访问都是基于
FAT
表的,即便把文件名称还原了,文件
FAT
表项是空的,操作系统失去
FAT
信息,就不能读取文件内容。
FAT32
分区每个分区在根目录以前就存放
Boot
扇区、
Boot
扇区备份、主
FAT
表、
FAT
标备份这四个部分的数据,文件数据区绝对不存放在根目录以前的这些空间里。
本文是
数据恢复
原创教材,版权归护航时代所有。如转载请注明转自
[url]http://www.bnuol.com[/url]