使用Winhex进行数据恢复(3)
前言
现在,你已经学会了简单的修复MBR,迈出了数据恢复的第一步。接下来,我们将了解到 FAT32 格式的分区是如何工作的。
你可以在 https://im0o.top/winhex-tiku/ 中查看所有例题文件
知识点总览
- FAT32分区构成
- 实例:导出损坏分区FAT32中的文件
- 实例:恢复FAT32分区(手动填写FAT32分区的DBR)
- EBR的组成
FAT32 分区的构成
FAT32 文件系统是从微软Windows 95 系统的 OSR2 版本开始使用的,它能够支持大于32MB小于32GB的分区。虽然第三方的格式化程序可以把超过32GB的分区格式化为FAT32,但微软自身的系统不允许将大于32GB的分区格式化为FAT32文件系统。
FAT32文件系统由保留扇区(包含DBR以及其备份等),FAT表1,FAT表2,数据区四个部分组成,下图为其结构示意图:
DBR及其保留扇区
FAT32文件系统的DBR开始于其第一个扇区,由5个部分组成,分别为跳转指令、OEM代号、BPB、引导程序和结束标志,下图为一个完整的FAT32文件系统的DBR。
跳转指令
跳转指令本身占用2字节,它将程序执行流程跳转到引导程序处。
当前DBR中的
EB 58
代表汇编语言中的JMP 58
。需注意,该指令本身占用了2字节,计算跳转目标地址时应该以该指令的下一字节为基准,所以执行下一条指令应该位于5A
处,紧接着跳转指令的是一条空指令NOP(90H
)。由此跳转指令中第二个字节内容可以知道OEM代号与BPB参数的大小,FAT32分区即为90开始向下5行+8个字节(如下图中选中部分)。
OEM代号
这部分占8个字节,其内容有创建该文件系统的OEM厂商具体安排。当前DBR中的OEM代号为
MSDOS5.0
。BPB
FAT32的BPB从DBR的第12(
0BH
偏移处)个字节开始,占用79字节,记录了有关该文件系统的重要信息,其中各个参数的含义为:| 字节偏移 | 字段长度(字节) | 对应图中参数 | 字段内容及含义 |
| ——– | :————–: | :———————————–: | ——————– |
| 0x0B | 2 | 00 02
| 每扇区字节数 |
| 0x0D | 1 | 20
| 每簇扇区数 |
| 0x0E | 2 | 26 00
| DOS保留扇区数 |
| 0x10 | 1 | 02
| FAT表个数 |
| 0x11 | 2 | 00 00
| 未用 |
| 0x13 | 2 | 00 00
| 未用 |
| 0x15 | 1 | F8
| 介质描述符(16进制) |
| 0x16 | 2 | 00 00
| 未用 |
| 0x18 | 2 | 3F 00
| 每磁道扇区数 |
| 0x1A | 2 | FF 00
| 磁头数 |
| 0x1C | 4 | 00 30 60 03
| 隐藏扇区 |
| 0x20 | 4 | 00 48 20 02
| 该分区的扇区总数 |
| 0x24 | 4 | 01 22 00 00
| 每FAT扇区数 |
| 0x28 | 2 | 00 00
| 标记 |
| 0x2A | 2 | 00 00
| 版本 |
| 0x2C | 4 | 02 00 00 00
| 根目录首簇号 |
| 0x30 | 2 | 01 00
| 文件系统信息扇区号 |
| 0x32 | 2 | 06 00
| DBR备份扇区号 |
| 0x34 | 12 | 00 00 00 00 00 00 00 00 00 00 00 00
| 保留 |
| 0x40 | 1 | 80
| BIOS驱动器号 |
| 0x41 | 1 | 00
| 未用 |
| 0x42 | 1 | 29
| 扩展引导标记 |
| 0x43 | 4 | 26 68 E5 DE
| 卷序列号 |
| 0x47 | 11 | 20 20 20 20 20 20 20 20 20 20 20
| 卷标 |
| 0x52 | 8 | 46 41 54 33 32 20 20 20
| 文件系统类型 |
下面对这些参数做详细分析:
0BH~0CH:每扇区字节数
记录每个逻辑扇区的大小,一般为512字节,但512不是固定值,该值可以由程序定义,合法值包括512、1024、2048和4096字节
0DH:每簇扇区数
每簇扇区数记录着文件系统的簇大小,即由多少个扇区组成一个簇1
FAT32最大支持128扇区的簇。
在FAT32文件系统中所有的簇从2开始编号,每个簇都有一个自己的地址编号,并且所有的簇都位于数据区内,在数据区之前是没有簇的。
0EH~0FH:DBR保留扇区数
DBR保留扇区数指DBR本身占用的扇区以及其后保留扇区的总和,也就是说DBR到FAT1之间的扇区总数,也可以说是FAT1的相对地址(相对于DBR)。
10H:FAT表个数
FAT个数描述了该文件系统中有几个FAT表,一般在FAT32文件系统中有2个FAT表,即FAT1和FAT2,FAT2是FAT1的备份。
11H~12H:未用
13H~14H:未用
15H:介质描述符
介质描述符是描述磁盘介质的参数,根据磁盘性质的不同,取不同的值2。
16H~17H:未用
18H~19H:每磁道扇区数
这是逻辑C/H/S中的一个参数,其值一般为63。
1AH~1BH:磁头数
这也是逻辑C/H/S中的一个参数,其值一般为255。
1CH~1FH:隐藏扇区数
隐藏扇区数是指本分区之前使用的扇区数,该值与分区表中描述的该分区的起始扇区号一致。对于主分区来讲,是MBR到该分区DBR之间的扇区数;对于扩展分区中的逻辑分区而言,是其EBR到DBR之间的扇区数3。
20H~23H:扇区总数
扇区总数是指分区的总扇区数,也就是说FAT32分区的大小。
24H~27H:每FAT扇区数
这四个字节用来记录FAT32分区中每个FAT表占用的扇区数。
28H~29H:标志
这两个字节用于表示FAT2是否可用,当其二进制最高位置为1时,表示只有FAT1可用,否则FAT2也可用。
2AH~2BH:版本
这两个字节通常为0。
2CH~2FH:根目录首簇号
分区在格式化FAT32文件系统时,格式化程序会在数据区中指派一个簇作为FAT32根目录区的开始,并把该簇号记录在BPB中。通常斗士把数据区的第一个簇分配给根目录使用,也就是2号簇。
30H~31H:文件系统信息扇区号
FAT32文件系统在DBR的保留扇区安排了一个文件系统信息扇区,用以记录数据区中空闲簇的数量及下一个空闲簇的簇号,该扇区一般在分区的1号扇区,即紧跟DBR后的一个扇区。
32H~33H:DBR备份扇区号
FAT32文件系统在DBR保留扇区中安排了一个DBR的备份,一般在6号扇区,也就是第7个扇区。该备份与原DBR的内容一摸一样,如果原DBR遭到破坏,可以用备份扇区修复。
34H~3FH:保留
40H:BIOS驱动器号
这是BIOS的INT 13H所描述的设备号码,一般把硬盘定义为8xH。
41H:未用
42H:扩展引导标记
扩展引导标记用来确认后面的三个参数是否有效,一般值为29H。
43H~46H:卷序列号
卷序列号是格式化程序在创建系统是生成的一组4个字节的随机数值。
47H~51H:卷标
卷标是由用户在创建文件系统时指定的一个卷的名称,但这是旧系统所记录的位置,现在的系统已经不再使用这个位置记录卷标,而是由一个目录项管理卷标。
52H~59H:文件系统类型
BPB的最后一个参数,直接用ASCII码记录当前分区的文件系统类型。
引导程序
FAT32的DBR引导程序占用420字节(5AH~1FDH)),在Windows 98之前的系统之下,这段代码负责完成DOS三个系统的装入,在Windows 2000之后的系统中,其负责完成将系统文件NTLDR装入,对于一个没有安装操作系统的分区来讲,这段程序没啥用处…
结束标志
DBR的结束标志与MBR、EBR的结束标志相同,都是
55 AA
。
FAT表
FAT(File Allocation Table)即文件分配表,对于FAT文件系统来讲是非常重要的一个组成部分,其主要作用及特点如下:
- FAT文件系统一般有2个FAT表,FAT1是活动FAT,FAT2是备份。
- FAT1的大小与FAT2相同,因此我们可以通过算出FAT1的大小在FAT2处跳转这么多到达数据区。
- FAT表是由FAT表项构成的,我们把FAT表项简称为FAT项,每个FAT项的大小有32位(4字节)。
- 每个FAT项都有一个固定的编号,这个编号从0开始。也就是说,第一个FAT项为0号FAT项,第二个FAT项为1号FAT项,以此类推。
- FAT表的前两个FAT项有专门的用途:0号FAT项用于存放分区所在的介质类型,例如硬盘的类型为“
F8
”,那么硬盘上分区的FAT表第一个FAT项就以“F8
”开始;1号FAT项则用来存储文件系统的肮脏标志,表明文件系统被非法卸载或者磁盘表面存在错误。 - 分区中每一个簇的适应情况都会映射到FAT表中的唯一一个FAT项。因为0号FAT项和1号FAT项和1号FAT项有特殊用途,无法与数据区中的簇形成映射,因此,数据区中的第一个簇的编号对应FAT表中的2号FAT项,以此类推。
总的来说,FAT表是用来表示分区使用情况的一个部分,我们可以通过FAT表来计算FAT分区的大小。
数据区
数据区的位置
FAT32的数据区在文件系统中的具体位置是紧跟在FAT2之后的。
以下为详细流程:
数据区的内容
FAT32文件系统数据区的内容主要由三个部分组成:根目录、子目录和文件内容。在数据中是以簇1为单位来管理这段空间的。
FAT32数据区根目录 目录项
在FAT32文件系统下,分区根目录下的文件及文件夹的目录项存放在根目录区中,分区子目录下的文件及文件夹的目录项存放在子目录区中,根目录区和子目录区都在数据区中。
上图是一条文件目录项,目录项占32字节,从Winhex中看(默认)是两行数据。
让我们来分析下这条目录项的含义:
| 字节偏移 | 字段长度(字节) | 字段内容及含义 |
| ——– | :————–: | ————– |
| 0x00 | 8 | 主文件名 |
| 0x08 | 3 | 文件的扩展名 |
| 0x0B | 1 | 文件属性
(读写/只读/隐藏/系统/卷标/子目录/存档) |
| 0x0C | 1 | 未用 |
| 0x0D | 1 | 文件创建时间精确到 10ms 的值 |
| 0x0E | 2 | 文件创建时间,包括时、分、秒 |
| 0x10 | 2 | 文件创建日期,包括年、月、日 |
| 0x12 | 2 | 文件最近访问日期,包括年、月、日 |
| 0x14 | 2 | 文件起始簇号高位(高位簇
) |
| 0x16 | 2 | 文件修改时间,包括时、分、秒 |
| 0x18 | 2 | 文件修改日期,包括年、月、日 |
| 0x1A | 2 | 文件起始簇号的低位(低位簇
) |
| 0x1C | 4 | 文件大小(字节) |
00H~07H:主文件名共占
8
字节,如果文件名(不包含扩展名)用不完8字节,后面用空格填充4。图中主文件名为IM0O
。另外该位置的第一个字节也用来表示目录项的分配状态,当该字节是
00
时,表示该目录项从未使用过;当该字节是E5
时,表示该目录项曾经使用过,但目前已经被删除。08H~0AH:文件的扩展名
文件的扩展名共占
3
字节,文件夹没有扩展名,如果是文件夹的目录项,该位置会被空格填充。图中的扩展名为JPG
。0BH:文件属性5
文件属性占1字节(
8bit
),可以用来表示文件的各种属性。
上图为一个长文件名文件的目录项,图中长文件的文件名为System Volume Info...
示例文件名SHUJUHUIFU.txt
在Windows 95开始,文件名”8.3“格式的限制被打破了,文件名可以超过8个字符,并且可以使用中文了,扩展名也可以超过3字节,这种格式的文件名就称为长文件名。
在Windows 95以上的系统中,长文件名实际存储着两个名字,一个短文件名和一个长文件名。当创建一个长文件名时,其对应的短文件名有以下3个处理原则。
字节偏移 | 字段长度(字节) | 字段内容及含义 |
---|---|---|
0x00 | 1 | 序列号 |
0x01 | 10 | 文件名的第1~5个Unicode码字符 |
0x0B | 1 | 长文件名目录项的属性标志 |
0x0C | 1 | 保留未用 |
0x0D | 1 | 短文件名校验 |
0x0E | 12 | 文件名的第6~11个Unicode码字符 |
0x1A | 2 | 始终为0 |
0x1C | 2 | 文件名的第12~13个Unicode码字符 |
- 序列号(00)
序列号占1字节,该参数用来描述长文件名目录项的排序。
在这个字节的8位中,0~4这5位用来描述长文件名目录项的顺序号,从1开始编号。6位(也就是说第7位)如果“1”表明该目录项是最后一项。如果文件删除,该字节也会改为
E5
。- 文件名的第1~5个Unicode码字符
该参数长度为10字节(因为Unicode编码储存字符时每个字符占用2字节)。
如果文件名已经记录完,但该参数的空间中还有未用的字节,就会在文件名最后一个字节填充2个字节的
00
,随后未用的字节用FF
填充。- 长文件名目录项的属性标志
该参数长度为1字节,是属性字节。当属性的只读位、隐藏位、系统位、卷标位全为1,其它全为0是,改制就为16进制的
0FH
,表示该目录项为长文件名记录项。- 未用
该字节不使用。
- 短文件名校验和
该参数长度为 1 字节,是个校验和,长文件名目录项通过这个校验和将其与相应的短文件名目录项关联起来。校验和的数值是使用短文件名计算得到,同 文件的长文件名目录项的校验和必须是相 向的。校验和的计算方法是依次将短文件名的各个字符对应的二进制值相加,在每一步相加前要先将二进制的结果值依次向右移动一位,最右边的位循环移动到最左边,然后再加上下一个字符所对应的二进制值,直到把最后一个字符加完,结果就是校验和的数值。
- 文件名的第6~11个字符
同[2.]
③号长文件名目录项的首字节为42H
,换算为二进制等于01000010
,其0~4位的值为00010
,说明这是第二个长文件名目录项,6位上的值是1
,说明这是最后一项长文件名目录项。
②、③两条长文件名目录项的结构一样,以倒序的方式排列在其短文件名目录项之前,完整地记录了文件名shujuhuifu.txt
在子目录所在的文件目录项区域中,总有两个特殊的目录,它们就是.
和..
使用DOS命令dir
可以看到这两个目录
① .
表示当前目录
② ..
表示上级目录
在winhex中查看.
目录与..
目录的目录项:
其中0x00H0x1FH为0x3FH为.
目录的目录项,0x20H..
目录的目录项
.
目录项所描述的起始簇号
是子目录本身所在的簇号。..
目录项所描述的起始簇号
是上级目录的起始簇号,如果上级目录是根目录,则该值为0
。- 所有目录的文件大小都是
0
。
卷标就是一个分区的名字,可以在格式化分区时创建,也可以随时修改。
实例:导出损坏分区FAT32中的文件
首先填写MBR主引导记录所缺失的结束标志55 AA
。接着查看分区表中的第一个分区,并跳转到该分区。
从残留的DBR中,可以看出该分区为FAT32,其每簇扇区数为32
使用快捷键Ctrl+Alt+x
向下搜索16进制数值!00
(非零),可以搜索到根目录。
在根目录中发现需要找到的文件,查看其高位簇,低位簇(位置
)和大小,导出文件即可
跳转到对应位置后选中对应大小,右键>>编辑>>复制选快>>至新文件
实例:恢复FAT32分区(手动填写FAT32分区的DBR)
打开虚拟磁盘后,我们发现MBR的分区表和结束标志被清空,首先,填写结束标志55 AA
。
保存后重新加载虚拟磁盘,点选到00处,向下搜索非零。
根据FAT32分区的特征:RRaA
,可以判断处该扇区前一个扇区为FAT32分区的DBR。
计算FAT32分区所必须的数值
计算FAT32分区保留区大小
在FAT32分区头部有一部分区域为保留区,在填写DBR时我们需要填写
保留区大小
值,所以我们需要计算保留区的大小。- 向下搜索
F8FF
F8FF
为FAT文件系统中FAT表的标识,我们通过找到FAT表的位置后将FAT表位置减去DBR位置得到保留区大小复制FAT表位置
2086
复制DBR位置
2048
用FAT表位置减去DBR位置得到保留区大小为
38
- 向下搜索
计算FAT32分区FAT表大小
填写DBR时还需要填写
FAT表的大小
,那么如何计算FAT表的大小呢?记录FAT1的位置
2086
,向下搜索F8FF
FAT1与FAT2的标识符均为F8FF,用FAT2的位置减去FAT1的位置即可得到FAT表的大小
记录FAT2的位置
27687
用FAT2的位置减去FAT1的位置得到FAT表的大小为
25601
计算FAT32分区每簇扇区数
跳转到数据区
从FAT2向后跳转FAT表大小即可达到数据区
记录数据区的位置:
53288
,该位置为根目录(数据区中的首个扇区)点击空余处,向下搜索非0,搜索到下一簇的目录,位置为
53416
用相邻的子目录的位置减去根目录的位置得到每簇扇区数为
128
计算FAT32分区大小
得到以上参数后我们就可以计算最后需要填写到DBR内的参数——分区大小
(FAT表大小-1)x128x每簇扇区数+保留区大小
即可得到该分区的大小。需注意,这个大小会比分区时的分区大小稍小一点,不过不影响分区中的文件(除非你用满了整个分区)
- 通过计算,我们得到该FAT分区的大小为
419430438
扇区
- 通过计算,我们得到该FAT分区的大小为
填写DBR
填写跳转指令
EB 58 90
在DBR扇区起始处填写FAT32分区的跳转指令
填写每扇区字节数
512
在
0x0B
处(2字节)填写每扇区字节数,默认为512填写每簇扇区数
128
在
0x0D
处(1字节)填写每簇扇区数,本题为128
填写保留区大小
38
在
0x0E
处(2字节)填写保留区大小,本题为38
填写FAT表个数
2
在
0x10
处(4字节)填写FAT表个数,默认为2
填写磁盘介质
F8
在
0x15
处(1字节)填写磁盘介质,默认为F8
填写分区位置
2048
在
0x1C
处(4字节)填写分区位置,本题为2048
填写分区大小
419430438
在
0x20
处(4字节)填写分区大小,本题为419430438
填写FAT表大小
25601
在
0x24
处(4字节)填写FAT表大小,本题为25601
填写根目录首簇号
2
在
0x2C
处(4字节)填写根目录首簇号,默认为2
填写文件系统标识
FAT32(ASCII)
在
0x52
处填写文件系统标识,在ASCII栏处直接填写FAT32
即可填写结束标志
55 AA
在扇区结尾处填写
55 AA
结束标志
- 下图为填写FAT32文件系统DBR全过程。
- 至此,你已经恢复了分区1
从DBR向后跳转分区大小,恢复分区2
- 恢复分区2的步骤与分区1相同
EBR的组成
在上篇文章中我们了解到了扩展分区的结构,以及其在整个磁盘中的作用。本节我们将了解EBR具体的组成。
可以看到,EBR中含有与MBR主引导记录中相似的分区表,通常最多有两个分区表项。
第一个分区表项类同与MBR主引导记录中的分区表格式,不过需要注意的是:扩展分区中的逻辑分区无法成为活动分区。
第二个分区表项用来链接下一个EBR扇区,下图为一个扩展分区的结构
从上图中可以看出,逻辑分区后无扩展分区的情况时,逻辑分区前的扩展分区无第二个分区表项
分区表项1的作用同等于MBR中的分区表项,所以在这里我们查看分区表项2
所谓扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个用来定义分区的参数的指针,这种指针结构形成一个单向链表。
扩展分区的分区表项2是用来指向下一个EBR的位置与大小。
下图为一个磁盘的 EBR 结构。
需要注意的是:EBR 中的位置参数均是以 EBR1(扩展分区的首位置)相对偏移的位置。
图床404 部分图片丢失无法找回 博客已根据现有图片进行部分内容修改 部分无法找回的图片丢失