Fat32文件系统存储原理及数据恢复

来源:互联网 发布:阿里巴巴e助手软件 编辑:程序博客网 时间:2024/06/05 20:50

转自:http://blog.csdn.net/landerlyoung/article/details/12401761

分析本地硬盘的主引导扇区

 

首先我们要做的是熟悉fat32 文件系统。

实验环境是Windows8 操作系统+winhex 17.2。鉴于本地没有fat32格式的磁盘分区。

1.        在win8下创建一个虚拟磁盘vhd,并格式化为fat32,然后挂载。


如图,“磁盘2”即为创建的虚拟磁盘,大小为1G,win8下的盘符为I;

 

2.        我们用winhex打开此磁盘看一下结构。

以管理员身份打开winhex,单击工具,选择打开磁盘


3.        选择我们创建的磁盘。


4.        点击引导扇区(模板)

Fat32  DBR(Dos Boot Record)各个字节表示的意义如下

(注意数据是以little-ending的形式存储的)

 

l  0H~02H 一条跳转指令,指针指向后面的引导程序

a)        通常是eb 58 90反汇编后得到指令为:

                              i.             Jmp 0x5a;

                            ii.             nop

l  03H~0AH 厂商名和系统版本

l  0BH~0CH 每扇字节数,一般为512字节

l  0DH 每簇扇区数(有关簇的概念我们在后面会详细介绍),对于FAT32的磁盘该字节一般为08H,既每簇为8H*512B=4K。

l  0EH~0FH 保留扇区数

l  10H 磁盘FAT的个数,一般为2个

l  11H~12H 对于FAT16的磁盘为根目录的最大目录项,对于FAT32的磁盘该值总为“00H00H”

l  13H~14H 对于软盘或早期小硬盘该处为分区总扇区数,对于硬盘一般此值为“00H 00H”

l  15H 介质描述,对于1.44软盘此处长为“F0H”,对于硬盘此处长为“F8H”

l  16H~17H 对于软盘或早期小硬盘该处为每个FAT占用的扇区数,对于硬盘一般此值为“00H 00H”

l  18H~19H 每道扇区数,一般为“3FH 00H”,即每道有63个扇区

l  1AH~1BH 磁头数,一般为“FFH 00H”,即每个柱面有255个磁头

l  1CH~1FH 隐含扇区数

l  20H~23H 对于大硬盘来说该处存放的是该分区占用的扇区数

l  24H 每个Fat表的扇区数

l  34H~3FH  Reserved

l  40H BIOS drive (hex, HD=8x)

l  24H~27H 对于大硬盘来说该处存放的是每个FAT占用的扇区数

l  32H 备份DBR所在的扇区

l  40H 该处为磁盘BIOS信息,第一块硬盘为“80H”,一般软盘为“00H”

l  47H~51H 用户设置的卷标,如果没有卷标此处常为字符串“NO NAME ”

l  52H~59H 文件系统,对于FAT32文件系统此处常为“FAT32”

l  5AH~1FDH引导程序代码(开始的jmp指令跳转至5A)

l  1FEH~1FFH 结束标识,和上文提到的主引导区的结束标识一样为“55H AAH”

 

5.        利用模板我们可以更方便的查看各个字节的含义

比较重要的信息是:

0BH~0CH:每个扇区(sector)512字节

0DH:每个簇(cluster)有8个扇区

0EH~0FH:保留扇区数4122(不知道问什么这么多)

10H: 磁盘FAT的个数,2个

24H:每个Fat表占有的扇区数2035

 

6.        根据以上信息我们可以计算出fat表所在的位置和根目录所在的位置。

针对只有连个fat表的fat32文件系统布局如下

DBR 1字节

保留扇区 大小有DBR 的EH~0FH 指定

Fat1

Fat2

根目录

数据存储区域

由第五步得到的信息我们可以算出根目录的起始扇区:

1 + 4122 + 2035*2 =8193

由于扇区从0开始编号,所以对应的扇区编号是8192

Winhex跳转的根目录验证一下


的确是8192号扇区。

 

由于根目录是第2号簇,所以我们也就得到了簇的起始地址。

 

 

 

 

3.  第三阶段:

      熟悉FAT32文件格式。

 

我们从文件如何存放来了解fat32 是如何工作的。

在fat32 中文件夹(directory)被当成一种特殊的文件来存放,所以在fat32中所有的数据都是文件。

比如在根目录下创建一个文件hello.txt,它会在根目录里产生一个记录


即是图中阴影部分。

各个字节表示的含义为:

 

因此我们可以知道这个文件的其实簇号0000 0005H,大小是0000 000cH,即12字节。

然后我们去fat表中查看这个文件占用的簇。


在fat表中,每四个字节对应一个簇,簇从0开始编号,但是根目录是2号簇,也就是说数据是从2号簇开始存储的。图中的阴影部分是5号簇的标记:FFFFFF0F,表示结束。

也就是说hello.txt只占用了一个簇,当文件占用了多个簇时,簇的标记指向文件占用的下一个簇的编号,类似于链表。

比如我们在创建一个大一点的文件:young.txt 大小为9k整,


其在根目录中的记录为上图,起始簇号为00000006H。我们再去查看fat表:


每个簇8个扇区,每个扇区512字节,所以9k文件共占用了3个簇。

我们看到第六号簇的标记是0000 0007H,表示文件下一个占用的簇时7号簇,

7号簇内容是0000 0008H,表示文件下一个占用的簇时8号簇,

8号簇内容是FFFF FFFF0FH,表示文件结束了。

 

OK,回到hello.txt该文件起始簇是5号簇,我们跳转过去看一下有什么



就是我们文件中存放的内容,完全一致。

 

或者我们也可以查看一下young.txt对应存储区域的信息,跳转至第六簇:


 

 

 

以上简单的阐述了fat32存放文件的方式。

下面我们尝试恢复一个被删除的文件。

 

第四阶段:

      手工恢复被删除的文件

首先删除我们刚才创建的大文件young.txt(大小9216字节)。


Shift+delete永久删除。这是windows explorer中已经没有这个文件了,


此时查看根目录内容,

 

删除之后:



删除之前:


发现首字节变成了E5,其他都没变化,E5标志该目录项已被删除。

 

我们再去看fat表,

删除之后:


删除之前:


发现fat表中对应簇的信息被清空了。

我们跳转到第六簇,也就是文件的原本存储区域看一下:


发现文件的信息还都在。

 

所以我们的恢复思路很简洁,把根目录中的文件记录开头第一字节改成非E5开头,需要注意:不能乱改,要和原文件名一致,否则文件名校验和不对,依然会提示找不到文件。(话说我没找到校验和在那里存储呀)

去fat表中恢复文件占用的簇的链接情况。

修改如下:

 

把E5改成59(对应ascii码为Y),保存。

此时windows explorer中出现Young.txt。


但是当我们尝试打开时会提示找不到文件,

 

原因是没有恢复fat表。

所以接着我们去恢复fat表,


再次打开就一切正常了,

 

0 0
原创粉丝点击