FAT16&FAT32文件结构

Eecho
Eecho
发布于 2024-12-25 / 247 阅读
24
0

FAT16&FAT32文件结构

FAT16

结构

  1. DBR跳转指令:EB 3C 90

  2. OEM代号:windows95为“MSWIN4.1 Windows98为:”MSWIN4.1‘

Windows 200以上为:“MSDOS5.0”

  1. BPB:从0x0B—0x3D

0x0B-0x0C 每扇区字节数(为512) 2 字节

0x0D 每簇扇区数 1字节

0x0E-0x0F DBR保留扇区数 2字节

0x10 FAT表个数 1字节

0x11-0x12 根目录项数 2字节

0x13-0x14 大小(分区小于32MB时在这) 2字节

0x15 介质描述 1字节

0x16-0x17 每FAT扇区数 2字节

0x18-0x19 每磁道扇区数(一般为63) 2字节

0x1A-0x1B 磁头数(一般为256) 2字节

0x1C-0x1F 隐藏扇区数 4字节

0x20-0x27 大小(大于32MB时在这) 4字节

  1. BPB算法

根目录项数:根目录扇区数 - 根目录后面的“.”和“..”目录 * 512 / 32

FDT:根目录项数*32/512

DBR保留扇区数 :FAT1-DBR

每FAT扇区数(FAT大小) :FAT2-FAT1

每簇扇区数:(1)分区大小-DBR保留扇区数-2*每FAT扇区数-FDT占用扇区数

(2)(FAT表大小*512)/2

(3)用(1)/(2)要四舍五入

  1. FAT表(以F8 FF开头)

每个FAT项都有一个固定的编码,这个编号从0开始,第一个FAT项就是0号FAT项,第二个FAT项是1号FAT项。从2号FAT项开始跟数据中的第一个簇映射。

FAT1后面紧跟着FAT2(FAT2为FAT1的备份)

定位FAT表的方法

方法一:

首先定位FAT1,读取DBR中的0x0E-0x0F中的数值(2字节)记录下来

从主DBR向后跳转这个值(Alt+G)

注意:跳转的进制数为10进制,单位为扇区

跳转后(FAT1)

然后从FAT1定位FAT2读取DBR中的每FAT扇区数1x16-1x17 两字节,记录下来

从FAT2向后跳转这个数值

跳转后

方法二:

直接在DBR往下搜索 (ctrl+alt+x0) F8 FF (512=0) 定位FAT1

跳转后

继续在FAT1往下搜索F8 FF FF 定位FAT2 注意:按F3为继续搜索)

跳转后

FDT(根目录,紧跟在FAT2后面):

头:D0 C2 BC D3

定位FDT方法

方法一:

读取DBR中的DBR保留扇区数0x0F-0x0E 2字节,每FAT扇区数1x16-1x17 2字节,记录下来

用DBR保留扇区数+(2*每FAT扇区数)+DBR扇区数,然后从DBR往后跳转

方法二:

直接从FAT2往下搜索D0 C2 BC D3来定位

提取文件:

读取文件的簇号,和大小记录下来。

2*每FAT扇区数+DBR保留扇区数+FDT占用扇区数(一般为32)+(文件簇数-2)*每簇扇区数+DBR扇区数 从DBR跳转(Alt+G)

如果文件头显示E5表示文件已删除

FAT32

结构:

1.跳转指令:EB 58 90

2.OEM代号:MSDOS5.0

3.BPB:

0x0B-0x0C 每扇区字节数 2字节

0x0D 每簇扇区数 1字节

0x0E-0x0F DBR保留扇区数 2字节

0x10 FAT表个数(固定为2) 1字节

0x11-0x14 未用 4字节

0x15 介质描述 1字节

0x16-0x17 未用 2字节

0x18-0x19 每磁道扇区数 2字节

0x1A-0x1B 磁头数 2字节

0x1C-0x1F 隐藏扇区数 4字节

0x20-0x23 大小 4字节

0x24-0x27 每FAT扇区数 4字节

0x28-0x29 标记 2字节

0x2A-0x2B 版本 2字节

0x2C-0x2F 根目录首簇号 4字节

0x30-0x31 文件系统信息扇区号 2字节

0x32-0x33 DBR备份扇区数(固定为6) 2字节

4.BPB算法

BDR保留扇区数:FAT1-DBR

每簇扇区数:(1)大小-DBR保留扇区数-2*每FAT扇区数

(2)每FAT扇区数*512/4

(3)用(1)-(2)

每FAT扇区数:FAT2-FAT1

定位FAT表(F8 FF FF 0F):

从3号簇开始记录,每个簇占用4个字节

FAT2 为 FAT1 的备份

方法一:

读取DBR的DBR保留扇区数 0x0E-0x0F 2字节,和每FAT扇区数 0x24-0x27记录下来

定位到主DBR扇区数,从DBR往后跳转(Alt+G) DBR保留扇区数 到FAT1

然后从FAT1往后跳转(Alt+G) 每FAT扇区数

方法二:

从DBR向下搜索(Ctrl+Alt+X) F8 FF FF 0F 512=0

跳转后到FAT1

继续从FAT1向下搜索F8 FF FF 0F到FAT2(注意:按F3为继续搜索)

根目录位置定位(D0 C2 BC)

方法一:

读取DBR的每FAT扇区数和DBR保留扇区数

计算 根目录位置:每FAT扇区数*2+DBR保留扇区数+DBR保留扇区数 从DBR跳转

然后从DBR跳转(Alt+G)

方法二:

从FAT2跳转每FAT扇区数

方法三:

从DBR往下搜索D0 C2 BC

定位文件数据区

读取文件的簇号和文件的大小

计算数据区:

方法一

2*每FAT扇区数+DBR保留扇区数+(簇号-2)*每簇扇区数(从DBR跳转)+DBR保留扇区数

方法二

(簇号-2)*每簇扇区数+根目录

注意:如果出现“.”和“..”目录就继续计算并跳转



评论