FAT文件系统-1.FAT文件系统概述

admin 2026-05-18 06:39:42 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文详细解析FAT文件系统的技术架构与演进历程,涵盖FAT12/16/32/exFAT四代版本的核心差异,重点阐述其簇化管理与链表式分配两大设计思想。关键发现包括FAT表结构对取证分析的价值(如删除文件恢复、碎片化分析),并提供版本选择与簇大小配置的实践建议。文档通过历史时间线与对比表格系统梳理技术演进路径,具备较高工程参考价值。 综合评分: 82 文章分类: 技术标准,数据安全,应用安全,安全工具,其他


cover_image

FAT文件系统-1.FAT文件系统概述

原创

李北辰 李北辰

SPEEDCoding

2026年5月11日 13:24 山西

在小说阅读器读本章

去阅读

1.1 什么是FAT文件系统

定义

FAT(File Allocation Table,文件分配表) 是一种由微软开发的文件系统,其核心思想是通过一张”分配表”来追踪存储介质上每个簇(Cluster)的分配状态和使用情况。FAT文件系统最早诞生于1977年,是个人计算机历史上最成功、最广泛使用的文件系统之一。

历史起源

| 时间 | 里程碑事件 | | — | — | | 1976年 | 微软购买86-DOS(原名为QDOS)的授权 | | 1977年 | FAT文件系统诞生 — 由 Marc McDonald 在微软设计实现,最初用于Microsoft Standalone Disk BASIC-86 | | 1981年 | MS-DOS 1.0发布,采用FAT12,支持5.25英寸160KB软盘 | | 1984年 | MS-DOS 2.0发布,引入子目录结构,支持硬盘分区 | | 1984年 | FAT16 随PC DOS 3.0和IBM PC/AT一同发布,支持更大容量 | | 1988年 | MS-DOS 4.0支持超过32MB的分区 | | 1996年 | Windows 95 OSR2 引入 FAT32,突破2GB容量限制 | | 2006年 | exFAT 随Windows CE 6.0发布,专为闪存设备优化 |

💡 类比理解:想象你搬进了一栋没有门牌号的公寓楼(空白磁盘)。FAT就像是在前台放置的住户登记表——每一行对应一个房间(簇),记录着这个房间是否空闲、住了谁、下一间房间在哪里。没有这个登记表,你就无法知道哪个房间有人住、哪个是空的。

设计者

FAT文件系统的原始设计者是 Marc McDonald,他是微软的第1号员工(Bill Gates和Paul Allen分别是第2号和第3号)。


1.2 FAT的版本演进

从FAT12到exFAT的演进之路

FAT家族每个版本都是为了解决前一代的容量限制而诞生的:

                    FAT家族演进树

    1977          1984          1996          2006
      |             |             |             |
   FAT12  ──────▶ FAT16  ──────▶ FAT32  ──────▶ exFAT
   (8位时代)     (16位时代)     (32位时代)     (64位时代)
      |             |             |             |
   软盘时代      硬盘时代       大容量时代      闪存时代
   最大16MB      最大2GB        最大2TB         最大128PB

      └─────────────┴─────────────┴─────────────┘
                        |
                   向下兼容

四代FAT版本详细对比

| 特性 | FAT12 | FAT16 | FAT32 | exFAT | | — | — | — | — | — | | 诞生年份 | 1977 | 1984 | 1996 | 2006 | | 簇地址位数 | 12位 | 16位 | 28位* | 32位 | | 最大分区容量 | 16 MB | 2 GB (或4 GB) | 2 TB (理论8 TB) | 128 PB | | 最大文件大小 | 16 MB | 2 GB | 4 GB | 16 EB | | 每簇最大扇区数 | 64 | 256 | 64 | 2^25 | | 最小簇大小 | 512 B | 512 B | 512 B | 4 KB | | 最大簇大小 | 32 KB | 64 KB | 32 KB (通常) | 32 MB | | 最大簇数量 | 4,084 | 65,524 | ~268,435,456 | ~4,294,967,296 | | 根目录 | 固定512项 | 固定512项 (默认) | 动态大小 | 动态大小 | | 长文件名(LFN) | 不支持 | 支持 (Win95+) | 支持 | 原生支持 | | 文件时间戳精度 | 2秒 | 2秒 | 2秒 | 10毫秒 | | 引导扇区备份 | 无 | 无 | 有 (扇区6) | 有 (12个备份扇区) | | 可用簇计数 | 需扫描 | 需扫描 | FSInfo记录 | 启动扇区记录 | | 操作系统兼容性 | 几乎所有系统 | 几乎所有系统 | Win95+ / 现代OS | Win XP+ / 现代OS |

注:FAT32实际使用28位存储簇号,高4位保留,因此最大可用簇号为0x0FFFFFF7(约2.68亿个簇)。

各版本关键差异解析

FAT12 → FAT16 的跨越

核心变化:簇地址从12位扩展到16位。

  • 12位的问题:最多只能寻址 2^12 = 4096 个簇。去掉保留值后,实际可用约4,084个簇。
  • 实际影响:在360KB软盘上没问题(每簇512字节),但当硬盘容量超过32MB时,4,084个簇意味着每个簇必须大于8KB,造成严重的空间浪费。
  • 解决方案:16位地址可以寻址 2^16 = 65,536 个簇,大幅提升了容量上限。
FAT12簇地址示意(1.5字节 = 12位)

字节0:  0x23  = 0010 0011
字节1:  0xF1  = 1111 0001

组合后的12位簇号 = 0x123 (第291号簇)

FAT16 → FAT32 的跨越

核心变化:簇地址从16位扩展到32位(实际使用28位),并取消了固定根目录区。

  • 16位的问题:最大65,524个可用簇。对于2GB分区,每簇必须至少32KB,小文件浪费严重。
  • 关键创新
  1. 根目录不再是固定区域——根目录变成数据区中的一个普通簇链,可以像子目录一样动态增长。
  2. 引入FSInfo结构——专门记录空闲簇数量和下一个可用簇的位置,大幅优化了簇分配速度。
  3. 引导扇区有备份——FAT32在扇区6保存引导扇区的备份,提高了可靠性。

FAT32 → exFAT 的跨越

核心变化:全新设计,专为闪存优化,突破了4GB文件大小限制。

  • exFAT虽然名字里还有”FAT”,但内部结构已与FAT12/16/32有很大不同。
  • 引入了位图分配表(Allocation Bitmap),更适合闪存的写入特性。
  • 原生支持长文件名、扩展时间戳精度、访问控制列表(ACL)。

取证价值:不同FAT版本的取证分析方法有细微但重要的差异。例如,FAT12需要处理1.5字节对齐的簇号解析,FAT32需要处理动态根目录和FSInfo结构。如果在取证分析中混淆了版本,可能导致文件定位错误。我们将在后续章节详细讲解每种版本的解析方法。


1.3 FAT文件系统的核心设计思想

两大支柱:链表式分配 + 簇化管理

FAT文件系统的全部设计可以归结为两个核心思想(链表式分配+簇化管理)。理解这两个思想,就等于掌握了FAT的精髓。

支柱一:簇(Cluster)作为最小分配单元

什么是簇?

簇是FAT文件系统管理磁盘空间的最小单位。一个簇由一个或多个连续的扇区组成(扇区通常是512字节)。

为什么要用簇而不是直接用扇区?

想象你在管理一个巨大的图书馆:

  • 用扇区管理(逐本书管理):每本书(每个扇区)都需要一条记录。一个500GB的硬盘有约10亿个扇区,需要一个10亿行的表格。表格本身就占用了巨大空间,查询速度也极慢。
  • 用簇管理(按书架管理):把相邻的书捆成一捆(簇),只需要记录每捆书的位置。如果每簇8扇区(4KB),表格行数减少到约1.25亿行——表格缩小了8倍

簇大小与分区的关系

| 分区容量 | FAT12 簇大小 | FAT16 簇大小 | FAT32 簇大小 | | — | — | — | — | | 0 – 16 MB | 512 B – 4 KB | — | — | | 16 MB – 128 MB | — | 2 KB | — | | 128 MB – 256 MB | — | 4 KB | — | | 256 MB – 512 MB | — | 8 KB | — | | 512 MB – 1 GB | — | 16 KB | — | | 1 GB – 2 GB | — | 32 KB | — | | 2 GB – 8 GB | — | 64 KB* | 4 KB | | 8 GB – 16 GB | — | — | 8 KB | | 16 GB – 32 GB | — | — | 16 KB | | 32 GB – 2 TB | — | — | 32 KB |

注:FAT16在Windows中最大支持32KB簇,但某些系统允许64KB簇,这会导致与一些工具的兼容性问题。

簇的编号规则

           簇0和簇1是保留簇,不用于存储数据。
  • 数据从簇2开始
  • 簇号存储在FAT表中,每个簇号对应一个FAT表项。

支柱二:链表式文件分配

FAT的核心数据结构——文件分配表(File Allocation Table)

FAT表本质上就是一个巨大的数组,数组的索引就是簇号,数组的值就是下一个簇的簇号(或特殊标记)。

文件A (3个簇): 簇2 → 簇3 → 簇5 → 簇6 (EOF,文件结束)
文件B (1个簇): 簇4 (EOF)
文件C (2个簇): 簇8 → 簇10 → ...
空闲簇: 簇7 (FAT值为0x00000000)

FAT表中的特殊值

| 值 (FAT12) | 值 (FAT16) | 值 (FAT32) | 含义 | | — | — | — | — | | 0x000 | 0x0000 | 0x00000000 | 空闲簇(未分配) | | 0x001 | 0x0001 | 0x00000001 | 保留值(不应出现) | | 0x002-0xFEF | 0x0002-0xFFEF | 0x00000002-0x0FFFFFEF | 已分配簇,值为下一个簇号 | | 0xFF0-0xFF6 | 0xFFF0-0xFFF6 | 0x0FFFFFF0-0x0FFFFFF6 | 保留值 | | 0xFF7 | 0xFFF7 | 0x0FFFFFF7 | 坏簇(标记为损坏) | | 0xFF8-0xFFF | 0xFFF8-0xFFFF | 0x0FFFFFF8-0x0FFFFFFF | 文件结束(EOF) |

目录项与FAT表的协作

目录项(Directory Entry)记录文件的元数据(文件名、大小、时间戳等),以及文件内容的第一个簇号。FAT表则负责追踪从这个首簇开始的完整簇链。

步骤:
1. 在目录区找到 report.doc 的目录项 → 得知首簇是簇2
2. 查FAT表 FAT[2] → 值是5,表示下一个簇是簇5
3. 查FAT表 FAT[5] → 值是7,表示下一个簇是簇7
4. 查FAT表 FAT[7] → 值是EOF (0xFFFFFFFF),文件结束
5. 按顺序读取簇2、簇5、簇7的内容,组合成完整文件

取证价值:链表式分配的设计对取证分析有深远影响:

  1. 文件删除后的簇链残留:当文件被删除时,目录项的首字节被标记为0xE5,但FAT表中的簇链可能不会立即被清零(取决于操作系统)。这意味着即使文件已被删除,我们仍有可能通过残留的簇链恢复文件。
  2. 碎片化文件分析:文件的簇链揭示了文件在磁盘上的实际物理分布。通过分析簇链的模式,可以推断文件的写入历史——如果簇号连续,文件可能是在空闲磁盘上一次性写入的;如果簇号跳跃,说明磁盘在写入时已有大量碎片。
  3. 时间线分析:FAT表本身没有时间戳,但结合目录项的时间戳和簇的分配顺序,可以构建文件操作的时间线。
  4. 坏簇中的隐藏数据:标记为坏簇(0xFFFFFF7)的区域被操作系统忽略,但数据仍然存在于磁盘上。恶意用户可能故意将数据写入”坏簇”来隐藏证据。

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:SPEEDCoding 李北辰 李北辰《FAT文件系统-1.FAT文件系统概述》

评论:0   参与:  0