这是一次实验报告,觉得学到点东西,与大家分享。
转载声明出处: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表,
再次打开就一切正常了,