使用Winhex进行数据恢复(3)
前言
现在,你已经学会了简单的修复MBR,迈出了数据恢复的第一步。接下来,我们将了解到 FAT32 格式的分区是如何工作的。
你可以在 http://winhex.baklib.com 中查看所有例题文件
题库密码:im0o.top
知识点总览
- FAT32分区构成
- 实例:导出损坏分区FAT32中的文件
- 实例:恢复FAT32分区(手动填写FAT32分区的DBR)
- EBR的组成
- 实例:恢复扩展分区中的FAT32分区
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分区中数据区位置的流程图。
以下为详细流程:
数据区的内容
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
),可以用来表示文件的各种属性。
上图为一个长文件名文件的目录项,图中长文件的文件名为
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中查看
.
目录与..
目录的目录项:其中0x00H
0x1FH为0x3FH为.
目录的目录项,0x20H..
目录的目录项图为两个目录项的在模板管理器中的效果 从这两个目录项的实际数据可以得知:.
目录项所描述的起始簇号
是子目录本身所在的簇号。..
目录项所描述的起始簇号
是上级目录的起始簇号,如果上级目录是根目录,则该值为0
。- 所有目录的文件大小都是
0
。
卷标就是一个分区的名字,可以在格式化分区时创建,也可以随时修改。
实例:导出损坏分区FAT32中的文件
导入题目FAT32-19123.vhd后用Winhex打开
填写结束标志,跳转到FAT32分区
首先填写MBR主引导记录所缺失的结束标志55 AA
。接着查看分区表中的第一个分区,并跳转到该分区。
从残留的DBR中,可以看出该分区为FAT32,其每簇扇区数为32
向下搜索!00
使用快捷键Ctrl+Alt+x
向下搜索16进制数值!00
(非零),可以搜索到根目录。
在根目录中发现需要找到的文件,查看其高位簇,低位簇(位置
)和大小,导出文件即可
跳转到对应位置后选中对应大小,右键>>编辑>>复制选快>>至新文件