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长文件名目录项的结构。
(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目录项。根据目录项的属性字节,目录项可以为一个子目录,也就是说目录项中所指的文件内容其实是子目录的目录项,那么,对于子目录的分析,其方法应该和对根目录的分析方法一致。我们很容易的想到这样的内容处理用递归函数很容易实现。
好了,基本的思路建立起来了,我们就来编程实现。
- FAT32文件系统基本原理与数据恢复编程
- 软件安全学习笔记(5):FAT32文件系统与数据恢复
- Fat32文件系统存储原理及数据恢复
- Fat32文件系统存储原理及数据恢复
- 实际数据恢复案例-手工修复FAT32文件系统
- sd卡与FAT32文件系统
- 数据恢复基本原理
- FAT32文件系统
- FAT32文件系统
- FAT32文件系统
- FAT32文件系统
- FAT32文件系统
- FAT32文件系统
- FAT32文件系统
- fat32 文件系统
- FAT32文件系统
- FAT32文件系统
- FAT32文件系统
- 转 -- 2012年 PostgreSQL中国用户大会演讲主题征集
- 总结
- Mysql基本命令
- .net2.0注册到IIS ,重新注册IIS ,iis注册
- 处理表单重复提交
- FAT32文件系统基本原理与数据恢复编程
- perl 在butterfly的HDS中加用户
- 在Ubuntu下搭建Eclipse+SVN,涉及 Failed to load JavaHL Library的解决方法~
- Oracle 加号外连接
- MVC3从头到尾--新建一个开发环境
- Struts1 - 配置 - 说明详细且配合例子,简单易懂
- 可否编程对链接模型进行修改或选择链接模型中的对象?
- Oracle11G R2 用exp无法导出空表解决方法
- GXT之旅:第八章:Portal&Drag-Drop——项目使用Drag-Drop重构(3)