我们先来看看一个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表已经编上号码了,显示<eof>的地方是某个文件或者文件夹开始簇标记。
这个分区的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]

转载于:https://blog.51cto.com/199818/32679

解读FAT32分区文件系统相关推荐

  1. DSP之解读FAT32文件系统

    FAT 的全称是File Allocation Table(文件分配表系统),FAT 文件系统1982年开始应用于MS- DOS 中. FAT 文件系统主要的优点是它可以被多种操作系统访问,如MS- ...

  2. linux ntfs 密码,linux 加载ntfs和fat32分区

    原标题:linux 加载ntfs和fat32分区 纯手工打造每一篇开源资讯与技术干货,数十万程序员和Linuxer已经关注. 导读 关于加载ntfs和fat文件系统的文章极多,但写的不太明确,新手上路 ...

  3. 怎么从FAT32分区中恢复数据?

    FAT32指的是文件分配表是采用32位二进制数记录管理的磁盘文件管理方式,因FAT类文件系统的核心是文件分配表,命名由此得来.优点是稳定性和兼容性好,能充分兼容Win 9X及以前版本,且维护方便.缺点 ...

  4. linux的文件分区格式转换,怎么无损数据地转换NTFS到FAT32分区

    NTFS和FAT32是什么? 一般Windows磁盘上,我们常见的有NTFS,FAT32,exFAT等,除此之外,还有苹果系统的APFS,Linux系统的EXT4等.那么这些缩写的单词统称是什么呢? ...

  5. C语言读取FAT32分区文件簇链

    文章目录 FAT32基本结构 DBR的结构 目录项的结构 短目录项的重要字段 长目录项重要字段 FAT表项 解析文件路径(英文路径) 源代码 验证 长文件名/目录名 占多个簇 后续需要考虑的 参考链接 ...

  6. 给安卓手机安装linux系统分区,把Linux装在你的FAT32分区

    把Linux装在你的FAT32分区 发布时间:2007-02-14 12:44:20来源:红联作者:williamEXE 本文仅供参考学习 经过几天的实践,我找到一个方法,可以把Linux以普通文件的 ...

  7. 分区文件系统FAT文件系统

    最近个人几篇文章分析了改分区文件系统的文章. 关联文章的地址 一.分区与分区表 分区和卷是一个经常换着应用的语术.通常情况下没有什么问题,因为他们是一同件事件.只是说法上稍有不同而已.当然,理解这两个 ...

  8. 关于FAT32分区的U盘4GB文件的测试

    关于FAT32分区的U盘4GB文件的测试 很多人都知道FAT32的分区,单文件大小不能超过4GB,关于这个问题就来测测看. FAT32最大文件大小为2的32次方,也就是4294967296 Byte, ...

  9. linux fat32 乱码,解决linux下挂载windows的FAT32格式文件系统乱码问题

    在linux(ubuntu)系统中,默认挂载windows下的FAT32(VFAT)文件系统分区后,其中的中文文件名会变成乱码,但是NTFS文件系统分区中的中文文件名则不会变成乱码,所以推荐windo ...

最新文章

  1. CCS卸载安装过程及所遇问题
  2. vuex 基本入门和使用(二)
  3. 【错误记录】360 加固后的运行错误 ( 加固 SO 动态库时不能对第三方动态库进行加固 )
  4. mysql 设置编码
  5. redisson集成spring-session和shiro实现分布式session
  6. java reactor框架_Java反应式框架Reactor中的Mono和Flux
  7. 性能监控工具javamelody与spring的集成
  8. 巧改注册表拥有超级cpu
  9. HDU5002:Tree(LCT)
  10. 【248天】跃迁之路——程序员高效学习方法论探索系列(实验阶段06-2017.10.11)...
  11. 1.nagios服务端安装
  12. 【java奇思妙想】使用多线程的思想来实现java网络编程接收和发送的问题
  13. 从ARM裸机看驱动之按键中断方式控制LED(二)
  14. mysql字符集导出_关于mysql字符集及导入导出
  15. (22)Spring Boot 拦截器HandlerInterceptor【从零开始学Spring Boot】
  16. spring源码:@Bean注解解析
  17. Eclipse插件开发
  18. BFS和DFS搜索汇总(未完待续)
  19. 如何给C盘扩容?不用软件,把其他盘的空间分给C盘即可(图文详解)
  20. 报表格式.fp3打开查看方式

热门文章

  1. 关不掉的APP——永不停止的应用程序
  2. ubuntu18.10下wine运行大航海时代II、金庸群侠传1、三国志英杰传、笑傲江湖
  3. 微信小程序-form表单保存提交与重置
  4. 如何在线倍速播放存储在百度网盘的视频?偷偷告诉你一个巧妙的简易方法!
  5. 离职原因这么说,HR可以接受
  6. spring框架中用到了哪些设计模式
  7. 淘宝官方订单接口、商品订单详情API、订单列表API
  8. 我带过的一名C++实习生——Z同学
  9. 计算机能力培训研修问题,信息技术应用能力提升培训问题汇集.docx
  10. html+css 简单的静态网页小米官网