FAT32文件系统基本原理与数据恢复编程

来源:互联网 发布:黑客帝国4矩阵复活在线 编辑:程序博客网 时间:2024/06/04 18:10

之前一直想把自己开发的数据恢复软件开源,但一直没有进行基本原理、研发过程文档的编写和代码的整理,这几天找出以前的源码,再补充几篇基本原理和研发思路的博文。

为什么会有数据恢复软件?

平时我们使用电脑的时候,会发现删除文件的速度比拷贝文件的速度快很多,但这是为什么呢?这里就有文件系统的基本原理了,我们在创建文件的时候,文件系统会创建文件文件名、属性信息、文件内容,但我们在删除文件的时候,文件系统只会将我们的文件属性设置为“已删除”,将我们文件内容所占的空间设置为未使用,这样文件系统的shell(windows系统就是explorer)就不会显示出已删除的文件,这个很容易理解,一件物品扔到垃圾箱里面就是垃圾,但它仍然存在,只不过放在我们不去关注的地方,磁盘上的文件也是一样,如果我们没有彻底的粉碎它,只是按了一下delete按钮,那它的内容仍然存在在我们的磁盘上,只不过文件系统的shell向我们撒了谎,并没有显示它。

因此,只要我们能够掌握文件系统的实现原理,就可以将delete的文件找回来,这就是为什么会有数据恢复软件存在的根本原因。

对了,前面提到粉碎,如果你确实想把一些文件销毁掉,连FBI也查不到它是否曾经存在,那就要用文件粉碎软件将它彻底销毁,否则你看过的文档、图片、视频什么的,在数据恢复软件的面前就会一览无余。:)

好吧,我们就开始来学习FAT32文件系统吧。

FAT32文件系统是windows系列操作系统上广泛应用的文件系统,相对也比较简单,所以我们从它开始。

首先要理解的一个概念是引导扇区

其实就是分区的第0个扇区。为什么是第0个扇区而不是别的呢?因为计算机没有人类的智能,只会按照默认的位置去识别,当然最前面的一个扇区是首选了,所以以前总是听说有什么引导扇区病毒,其实就是修改了这第0个扇区,让计算机操作系统错误地去识别转而去执行病毒的代码,那么,引导扇区真的是很重要了啊!

我们知道磁盘的一个扇区一般是512个字节,那么,就是这512个字节里描述了整个分区的基本结构信息和相关参数。以下是c语言写的FAT32引导扇区的结构体:我们来逐个地理解其含义。

struct Fat32_BPB_BLOCK
{
//FAT32文件系统引导区数据结构
BYTE JMPCODE[3]       ;
BYTE OEM[8]           ;
WORD BYTESPERSECTOR   ;
BYTE SECTORPERCLUSTER ;
WORD RESERVEDSECTOR   ;
BYTE COUNTFAT         ;
WORD ALIGN1           ;
WORD ALIGN2           ;
BYTE MEDIATYPE        ;
WORD ALIGN3           ;
WORD SECTORPERTRACK   ;
WORD MAXHEAD          ;
DWORD HIDESECTOR      ;
DWORD TOTALSECTOR     ;
DWORD FATSIZE         ;
WORD FLAG             ;
WORD FATDRIVEVER      ;
DWORD ROOTSTARTCLUSTER;
WORD FILESYS          ;
WORD BACKUP      ; 
BYTE RESERVED1[12]    ;
BYTE LOGICALDRV       ;
BYTE ALIGN4           ;
BYTE EXTFLAG          ;
DWORD SN              ;
BYTE NAME[11]         ;
BYTE FAT32[8]         ;
BYTE CODE[0x1FE-0x5A] ;
WORD SIGNATURE        ;
};

FAT32引导扇区描述
偏移 说明
1    00H-02H 一条跳转指令、指针指向后面的引导程序
2    03H-0AH 厂商名和系统版本
3    0BH-0CH 每扇字节数
4    0DH 每簇扇区数
5    0EH-0FH 保留扇区数
6    10H 磁盘FAT的个数
7    11H-12H 对于FAT16的磁盘为根目录的最大目录项,对于FAT32的磁盘,该值总为"00H00H"
8    13H-14H 对于软盘或早期小硬盘,该处为分区总扇区数,对于硬盘一般此值为"00H00H"
9    15H 介质描述
10  16H-17H 对于软盘或早期小硬盘,该处为每个FAT占用的扇区数,对于硬盘,一般此值为"00H00H"
11  18H-19H 每道扇区数
12  1AH-1BH 磁头数
13  1CH-1FH 隐含扇区数
14  20H-23H 对于大硬盘来说,该处存放的是该分区占用的扇区数
15  24H-27H 对于大硬盘来说,该处存放的是每个FAT占用的扇区数
16  28H 标记
17  2AH 版本
18  2CH-2FH 引导目录的第一簇,即根目录的起始簇
19  30H-31H FS信息扇区,引导扇区本身占用的扇区数
20  32H-33H 备份引导扇区的位置
21  34H-3FH 保留不用,一般全为00H
22  40H 该处为磁盘BIOS信息
23  41H 保留未用
24  42H 扩展引导标记
25  43H-46H 序列号
26  47H-51H 用户设置的卷标
27  52H-59H 文件系统
28  1FEH-1FFH 结束标志


好了,看看我们能从这里找到什么有用的东西, 20H-23H这四个字节存放了该分区占用的扇区数,0BH-0CH这两个字节存放着每扇区的字节数,两个相乘,不就是该分区的容量吗?

下面我们再来看看FAT32文件系统中的FAT表。

前面的引导扇区描述中,有几处有关FAT的地方,对于FAT32类型分区,我们能够用到的是10H偏移处:磁盘FAT的个数,这个数字一般都是2个了。24H-27H,磁盘每个FAT占用的扇区数。2CH-2FH引导目录的第一簇,即根目录的起始簇。根据引导扇区中提供的信息,我们可以获知该分区FAT表的存储空间大小了,只要知道FAT在分区中存储的起始扇区号,我们就可以将其读入内存,进而对分区数据进行分析了。

下面我们来看看FAT表的结构。

FAT32文件系统中,一个FAT表项为一个字节,八位

00000000H                               代表未用的空簇

00000001H~FFFFFFEFH      代表文件已使用的簇

FFFFFFF0H~FFFFFFF6H      代表系统保留簇

FFFFFFF7H                              代表坏簇

FFFFFFF8H~FFFFFFFFH     代表文件的最后一簇

下面我们介绍FAT32目录项的结构和FAT32长文件名目录项的结构。

FAT32短文件目录项32个字节的表示定义字节偏移(16进制)字节数定义0x0~0x78文件名0x8~0xA3扩展名0xB*1属性字节00000000(读写)00000001(只读)00000010(隐藏)00000100(系统)00001000(卷标)  00010000(子目录)00100000(归档)0xC1系统保留0xD1创建时间的10毫秒位0xE~0xF2文件创建时间0x10~0x112文件创建日期0x12~0x132文件最后访问日期0x14~0x152文件起始簇号的高16位0x16~0x172文件的最近修改时间0x18~0x192文件的最近修改日期0x1A~0x1B2文件起始簇号的低16位0x1C~0x1F4表示文件的长度FAT32长文件目录项32个字节的表示定义字节偏移
(16进制)
字节数定义0x01属性字节位意义7保留未用61表示长文件最后一个目录项5保留未用4顺序号数值32100x1~0xA10长文件名unicode码①0xB1长文件名目录项标志,取值0FH0xC1系统保留0xD1校验值(根据短文件名计算得出)0xE~0x1912长文件名unicode码②0x1A~0x1B2文件起始簇号(目前常置0)0x1C~0x1F4长文件名unicode码③

根据以上这些信息,我们就可以编程对FAT32文件系统进行分析了。

让我们来整理一下编程思路:

1、首先我们必须从磁盘中读入FAT32引导扇区,这样才能利用引导扇区提供的相关信息

2、我们需要从磁盘中读入FAT表,通过FAT表获得磁盘存储空间的分配情况和文件存储位置信息

3、逐个读取并分析FAT32目录项。

前两个步骤是建立基本信息,第三步才是文件系统分析的主要内容。

我们看到,FAT32引导扇区中提供了根目录的起始簇,并且每一个FAT32目录项的大小都是32个字节,这样就可以通过一个循环来每次读入32个字节来进行分析,直到最末的FAT32目录项。根据目录项的属性字节,目录项可以为一个子目录,也就是说目录项中所指的文件内容其实是子目录的目录项,那么,对于子目录的分析,其方法应该和对根目录的分析方法一致。我们很容易的想到这样的内容处理用递归函数很容易实现。

好了,基本的思路建立起来了,我们就来编程实现。


















原创粉丝点击