当前位置: 首页 > news >正文

浅析FAT32文件系统

本文通过实验测试了FAT文件系统的存储规律,并且探究了部分可能的文件隐藏方法。

实验背景

现有一块硬盘(U盘),其中存在两个分区,分别为FAT32和NTFS文件系统分区。
在这里插入图片描述
在FAT分区中存在如下文件:

在这里插入图片描述
现需要阅读底层数据,找到上述文件的文件内容。

1. 分区分析

已知硬盘分区结构为MBR结构,因此首先对整块硬盘的MBR字段进行分析。MBR分区表数据如下:

在这里插入图片描述
其中各个分区数据如下所示:

分区ID分区表数据
1(1BEH-1CDH)00 20 21 00 0C FE FF FF 00 08 00 00 00 40 85 02
2(1CEH-1DDH)00 FE FF FF 07 FE FF FF 00 48 85 02 00 00 E2 04
300 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

可以发现,盘中存在两个分区,其重要数据段解释结果如下所示。

  • 分区1
字段解释
1BE: 00非活动分区
1BF-1C1: 20 21 00磁头扇面数据
1C2: 0C分区类型为 Win95 FAT32
1C6-1C9: 00 08 00 00数据扇区起始扇区号为 2048
1CA-1CD: 00 40 85 02本分区扇区总数为 42287104,本分区大小为 20.1640625GB
  • 分区2
字段解释
1CE: 00非活动分区
1CF-1D1: FE FF FF磁头扇面数据
1D2: 07分区类型为 NTFS
1D6-1D9: 00 48 85 02数据扇区起始扇区号为 42289152
1DA-1DD: 00 00 E2 04本分区扇区总数为 81920000,本分区大小为 39.0625GB

2. FAT32分区DBR文件头分析

由于FAT32的DBR位于FAT32格式分区的起始扇区,因此跳转到2048扇区便可以看到FAT32的DBR文件头如下所示(其中选中部分为BPB字段):

在这里插入图片描述
此时首先对当前FAT文件系统的DBR文件头中的BPB字段进行分析,结果如下:

Offsets数据内容解释
0x10000B-0x10000C00 02每个扇区512字节
0x10000D20每簇32个扇区,16384个字节(16KB)
0x10000E-0x10000F62 0FFAT保留扇区数量为3938
0x100024-0x1000274F 28 00 00每FAT所占扇区数为10319

此时可以计算出FAT数据区起始扇区位置=2048+3938+10319x2=26624,同时也可以知道FAT表的开头扇区为2048+3938=5986。

3. 根目录FDT扇区分析

由于FAT数据区开头为根目录的FDT扇区,因此直接跳转到26624扇区就可以查看根目录FDT扇区的内容如下所示:
在这里插入图片描述
我们可以发现,当前硬盘里其实存在6个文件和目录项,存在3个长文件名(B列为OF的是长文件名),且第一个簇为根目录文件,存在两个被删除的文件(第一字节为E5H)。

4. 文件寻址

以hello.txt文件为例,其在FDT相关目录项如下所示:

在这里插入图片描述
可以读出,该文件起始簇号的高16位为00 00,低16位为05 00,这意味着该文件在第5簇进行存储。由于根目录FDT是第2簇,因此该文件和根目录FDT之间相差扇区数为3x32=96扇区,因此该文件在物理扇区中扇区号为96+26624=26720,其文件内容如下:

在这里插入图片描述

5. FAT32文件存储模式探究

为了探索存储规律,向硬盘中拷贝一个大小为4382KB的mp4文件。

由于一个簇大小为16KB,因此可以算出该文件应该会占用274个簇。此时跳转到5986扇区,FAT1表中多出了如下内容:

在这里插入图片描述
上述所选部分在FAT簇表中正好占用274簇,因此可以发现,当存储文件时,FAT格式默认从前往后连续存储。此时根目录FDT新增了如下内容。

在这里插入图片描述
此时将该文件删除,删除后再新增一个名为newFile的txt文件。此时根目录FDT内新增数据项如下。

在这里插入图片描述

可以发现原来的MP4文件的开头字节全部变成了E5,说明该文件已经被删除,同时下方出现了64字节的txt文件信息。

此时查看FAT簇表如下所示。

在这里插入图片描述
可以发现,原来的MP4对应的簇被新的txt文件占用。

6. FAT32文件夹底层存储方式分析

跳转到FAT32根目录FDT扇区,其中demo文件夹的文件表项如下图所示。

在这里插入图片描述
其中偏移量为0xC0012B的字节为10,这意味着该文件为归档类型,即文件夹。这和我们的预设相符。此时偏移量为0xC0013A-0xC0013B的四个字节为06 00,这意味着该文件夹的内容在6号簇中。结合前文数据,该文件所在扇区为(6-2)x32+26624=26752。扇区内容如下所示。

在这里插入图片描述
可以发现该文件夹的内容和根目录FDT内容结构类似,其中偏移量为0xD10080到0xD1009F的字节为demo.cpp的文件目录。

此时我们可以得到文件夹底层存储方式如下:

  • 每一个目录可以看做一个文件,这个文件的内容都是一个FDT,即文件表项。
  • 某目录中的子目录的文件内容和该目录同构。
  • 硬盘FAT簇表后的第一个扇区就是根目录的FDT,可以使用这个数据索引后续数据。

7. 简易FAT32文件夹隐藏方法

(1)可以通过在FAT表中自定义坏簇的方法实现文件隐藏

我们尝试对于hello.txt文件进行隐藏,隐藏前文件如下所示。

在这里插入图片描述

其在根目录FDT的目录项如下所示。

在这里插入图片描述

读取偏移量为D000DAH-D999DB两个字节的数据为05 00,意味着该文件在第5簇。此时将FAT簇表(5986扇区)中第5簇的内容改为坏簇,结果如下。

在这里插入图片描述
此时在文件系统中能看到该文件,但是点击后无法显示文件具体内容。

在这里插入图片描述

(2)可以通过在FDT中自定义文件为已删除文件的方法实现文件隐藏

要使得文件无法显示,则需要将FDT中文件开头字节改为E5H,这样文件系统就会认为该文件已经被删除,如下图所示。

在这里插入图片描述
此时文件不会显示在文件夹中。

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 洗地机十大品牌排名:2024十大值得入手的洗地机盘点
  • 高德地图PlaceSearch标记点清除
  • vite+ts+mock+vue-router+pinia实现vue的路由权限
  • C# NetworkStream 流的详解与示例
  • 【Linux学习】深入了解Linux中进程状态及其转换
  • golang中的字节序 binary BigEndian 大端 , LittleEndian 小端 理解与write写入注意事项
  • docker 版 mysql 主从同步
  • idea 出现 cpu占用100%
  • 02.爬虫---HTTP基本原理
  • 【openlayers系统学习】3.4波段数学计算(计算NDVI)
  • 【计算机网络】第三章——数据链路层概述
  • RabbitMQ安装及配套Laravel使用
  • 生物识别技术存在的问题及需要考虑的关键事项
  • 【qt】标准型模型 下
  • C++之第八课
  • SegmentFault for Android 3.0 发布
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【5+】跨webview多页面 触发事件(二)
  • 【node学习】协程
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • CSS 提示工具(Tooltip)
  • gcc介绍及安装
  • HTTP--网络协议分层,http历史(二)
  • JS实现简单的MVC模式开发小游戏
  • js算法-归并排序(merge_sort)
  • k8s如何管理Pod
  • Python - 闭包Closure
  • Redux系列x:源码分析
  • vue自定义指令实现v-tap插件
  • WePY 在小程序性能调优上做出的探究
  • yii2中session跨域名的问题
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 通过npm或yarn自动生成vue组件
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 自动记录MySQL慢查询快照脚本
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #nginx配置案例
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (12)目标检测_SSD基于pytorch搭建代码
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (Oracle)SQL优化技巧(一):分页查询
  • (二)斐波那契Fabonacci函数
  • (分类)KNN算法- 参数调优
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (回溯) LeetCode 77. 组合
  • (四) 虚拟摄像头vivi体验
  • (四)Linux Shell编程——输入输出重定向
  • (转)Mysql的优化设置