本文通过实验测试了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 |
3 | 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |
4 | 00 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-0x10000C | 00 02 | 每个扇区512字节 |
0x10000D | 20 | 每簇32个扇区,16384个字节(16KB) |
0x10000E-0x10000F | 62 0F | FAT保留扇区数量为3938 |
0x100024-0x100027 | 4F 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,这样文件系统就会认为该文件已经被删除,如下图所示。
此时文件不会显示在文件夹中。