一、FAT文件系统分为四个部分
参考别人的博客
1.
最开始的位置,第一个保留扇区是引导区。包括基本的文件系统信息,比如它的类型和其它指向其它扇区的指针。通常包括操作系统启动调用代码。保留扇区的总数记录在引导扇区中的一个参数中。
- FAT区(文件分配表)
包含两份文件分配表,分区信息的映射表,指示簇是如何存储的。
- 根目录区
- 数据区域
主引导记录(主引导扇区),读设备时最开始读这个分区。
- MBR(master boot record)MBR 又称作主引导记录占用 Boot Sector 的前 446 个字节 ( 0 to 0x1BD ), 存放系统主引导程序 (它负责从活动分区中装载并运行系统引导程序).
- DPT 即主分区表占用 个字节 (0x1BE to 0x1FD), 记录了磁盘的基本分区信息,主分区表分为四个分区项,,每项 16 字节,分别记录了每个主分区的信息(因此最多可以有四个主分区).
- Boot Record ID 即引导区标记占用两个字节 (0x1FE and 0x1FF), 对于合法引导区,它等于 0xAA55,这是判别引导区是否合法的标志。
二、主引导扇区(MBR)的具体结构如下图所示:
Offset | Description | Size |
000h | Executable Code (Boots Computer) | 446 Bytes |
1BEh | 1st Partition Entry (See Next Table) | 16 Bytes |
1CEh | 2nd Partition Entry | 16 Bytes |
1DEh | 3rd Partition Entry | 16 Bytes |
1EEh | 4th Partition Entry | 16 Bytes |
1FEh | Executable Marker (55h AAh) | 2 Bytes |
USB hound 得到的数据
512 IN fa 31 c0 8e d8 8e c0 8e d0 bc 00 7c fb fc e6 .1.............. 55.1.0(2)
bf 00 06 b9 00 01 f3 a5 ea dc 06 00 00 10 00 01 ................ 55.1.16
00 00 7c 00 00 00 00 00 00 00 00 00 00 80 3f 00 ..............?. 55.1.32
ff 00 b4 03 1e 0e 1f 3a 16 10 00 74 06 1f ea 36 .......:...t...6 55.1.48
e7 00 f0 3d fb 75 05 8c d8 fb eb 1d 80 fc 08 ...=.Tu......... 55.1.
75 1b e8 81 00 8a 36 13 00 fe ce 8b 0e 15 00 86 u.....6......... 55.1.80
cd c0 e1 06 0a 0e 11 00 31 c0 f8 eb 65 80 fc 02 ........1...e... 55.1.96
72 cb 80 fc 04 77 c6 60 80 cc 40 50 be 00 00 c7 r....w.`..@P.... 55.1.112
04 10 00 30 e4 44 02 5c 04 8c 44 06 66 31 ...0..D..\..D.f1 55.1.128
c0 66 44 0c 88 f0 f6 26 11 00 88 cf 88 eb c0 .f.D....&....... 55.1.144
ef 06 81 e1 3f 00 01 c8 48 c7 a1 13 00 f7 26 ....?...H......& 55.1.160
11 00 f7 e3 01 f8 81 d2 00 00 44 08 0a ...........D..T. 55.1.176
58 30 c0 8a 16 10 00 e8 0c 00 88 26 03 00 61 a1 X0.........&..a. 55.1.192
02 00 1f ca 02 00 9c ff 1e 22 00 c3 80 fa 8f 7f ........."...... 55.1.208
04 88 16 2d 06 be 87 07 e8 8d 00 be be 07 31 c0 ...-..........1. 55.1.224
b9 04 00 f6 04 80 74 03 40 f5 81 c6 10 00 e2 ......t.@....... 55.1.240
f2 48 74 02 cd 18 bf 05 00 be 1d 06 c7 44 02 01 .Ht..........D.. 55.1.256
00 66 8b 46 08 66 44 08 b8 00 42 8a 16 2d 06 .f.F.f.D...B..-. 55.1.272
cd 13 73 0d 4f 74 49 30 e4 8a 16 2d 06 cd 13 eb ..s.OtI0...-.... 55.1.288
d8 a1 fe 7d 3d 55 aa 75 37 fa 66 a1 4c 00 66 a3 ....=U.u7.f.L.f. 55.1.304
3f 06 be 13 04 8b 04 48 04 c1 e0 06 8e c0 31 ?......H.......1 55.1.320
ff be 1d 06 b9 60 00 fc f3 a5 c7 06 4c 00 17 00 .....`......L... 55.1.336
a3 4e 00 fb 8a 16 2d 06 ee fa ea 00 7c 00 00 .N....-......... 55.1.352
be aa 07 e8 02 00 eb fe ac 20 c0 74 09 b4 0e bb ......... .t.... 55.1.368
07 00 cd 10 eb f2 c3 53 74 61 72 74 20 62 6f 6f .......Start boo 55.1.384
74 69 6e 67 20 66 72 6f 6d 20 55 53 42 20 65 ting from USB de 55.1.400
76 69 63 65 2e 2e 2e 0d 0a 00 42 6f 6f 74 20 66 vice......Boot f 55.1.416
61 69 6c 65 00 00 00 ea eb d4 ca 00 00 00 00 ailed........... 55.1.432 第一分区
硬盘分区表 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 55.1.448 第二分区
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 55.1.4 第三分区
00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 04 ................ 55.1.480 第四分区
05 00 0b fe ff b3 00 01 00 00 80 8c e8 00 55 aa ..............U. 55.1.496
过256扇区后是这个分区 *512byte=7.2G
硬盘分区表
字节数 | 描述 | |
00~00 | 1 | 可引导标志0x00不可引导,0x80可引导 |
01~03 | 3 | |
04~04 | 1 | 分区类型 |
05~07 | 3 | |
08~0B | 4 | |
0C~0F | 4 | 分区大小扇区数 |
第一字节用于记录分区起始磁头号,第二字节低六位用于记录分区起始扇区号,用10bit记录分区起始柱面号:第二个字节的高两位作为起始柱面的高两位,第三个字节作为分区起始柱面的低八位。
三、DBR分区,读文件系统时最开始读这个分区。
winhex 读取的数据
【1】0x00~0x02:3 个字节,跳转指令。
【2】0x03~0x0A:8 个字节,文件系统标志和版本号,这里为 MSDOC5.0。
【14】0x20~0x23:4 个字节,文件系统大小扇区数,156657(0x 00 EEBF C1)。
【15】0x24~0x27:4 个字节,每个 FAT 表的大小扇区数,15248(0x 00 00 3B 90)。 7.4M
四、文件分配表FAT
位于保留区后的是 FAT 区,有两个完全相同的 FAT(File Allocation Table, 文件分配表)表组成。
3. 如果某个簇未被分配使用,它所对应的 FAT 表项内的 FAT 表项值即用 0 进行填充,表示该 FAT 表项所对应的簇未被分配。
定位一个 FAT32 文件系统的数据起始处,可以通过引导扇区的相关参数计算出来。
1.从引导扇区的偏移 0x0E~0x0F 字节处得到保留扇区。
2.从偏移 0x10 字节处得到 FAT 表的个数。
3.从偏移 0x24~0x27 字节处得到每个 FAT 表的大小扇区数。
4.利用如下公式计算:
保留扇区数 + 每个 FAT 表大小扇区数 × FAT 表个数 = 数据区起始扇区号
256+2272+15248*2=33024
计算其他已知簇号的扇区号,还要由引导扇区的偏移 0x0D 字节处查找到每个簇大小扇区数,并使用如下公式计算:
某簇起始扇区号 = 保留扇区数 + 每个 FAT 表大小扇区数 × FAT 表个数 + (该簇簇号 - 2) × 每簇扇区数
卷标Kingston
【7】0x10~0x11:2 个字节,文件创立的日期,16bit 也划分为三个部分:
0~4bit 为日,有效值为 1~31
5~10bit 为月,有效值为 1~12
11~15bit 为时,有效值为 0~127,这是一个相对于 1980 年的年数值,也就是说该值加上 1980即为文件创建的日期值。该部分笔者就不再举例就计算了,原理和计算创建时间是一样的。请读者自己去计算。
【8】0x12~0x13:2 个字节,最后访问日期。
【9】0x14~0x15:2 个字节,文件起始簇号的高两个字节。
【10】0x16~0x17:2 个字节,文件最后修改的时间。