使用Winhex进行数据恢复(3)

发表于 2019-11-28更新于 2019-12-31阅读次数

前言

现在,你已经学会了简单的修复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,数据区四个部分组成,下图为其结构示意图:

image.png

DBR及其保留扇区

​ FAT32文件系统的DBR开始于其第一个扇区,由5个部分组成,分别为跳转指令、OEM代号、BPB、引导程序和结束标志,下图为一个完整的FAT32文件系统的DBR。

fatdbr.png

  1. 跳转指令

    跳转指令本身占用2字节,它将程序执行流程跳转到引导程序处。

    当前DBR中的EB 58代表汇编语言中的JMP 58。需注意,该指令本身占用了2字节,计算跳转目标地址时应该以该指令的下一字节为基准,所以执行下一条指令应该位于5A处,紧接着跳转指令的是一条空指令NOP(90H)。

    由此跳转指令中第二个字节内容可以知道OEM代号与BPB参数的大小,FAT32分区即为90开始向下5行+8个字节(如下图中选中部分)。

    image.png

  2. OEM代号

    这部分占8个字节,其内容有创建该文件系统的OEM厂商具体安排。当前DBR中的OEM代号为MSDOS5.0

  3. BPB

    FAT32的BPB从DBR的第12(0BH偏移处)个字节开始,占用79字节,记录了有关该文件系统的重要信息,其中各个参数的含义为:

    image.png

    字节偏移 字段长度(字节) 对应图中参数 字段内容及含义
    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 文件系统类型

    下面对这些参数做详细分析:

    1. 0BH~0CH:每扇区字节数

      记录每个逻辑扇区的大小,一般为512字节,但512不是固定值,该值可以由程序定义,合法值包括512、1024、2048和4096字节

    2. 0DH:每簇扇区数

      每簇扇区数记录着文件系统的簇大小,即由多少个扇区组成一个簇1

      FAT32最大支持128扇区的簇。

      在FAT32文件系统中所有的簇从2开始编号,每个簇都有一个自己的地址编号,并且所有的簇都位于数据区内,在数据区之前是没有簇的。

    3. 0EH~0FH:DBR保留扇区数

      DBR保留扇区数指DBR本身占用的扇区以及其后保留扇区的总和,也就是说DBR到FAT1之间的扇区总数,也可以说是FAT1的相对地址(相对于DBR)。

    4. 10H:FAT表个数

      FAT个数描述了该文件系统中有几个FAT表,一般在FAT32文件系统中有2个FAT表,即FAT1和FAT2,FAT2是FAT1的备份。

    5. 11H~12H:未用
    6. 13H~14H:未用
    7. 15H:介质描述符

      介质描述符是描述磁盘介质的参数,根据磁盘性质的不同,取不同的值2

    8. 16H~17H:未用
    9. 18H~19H:每磁道扇区数

      这是逻辑C/H/S中的一个参数,其值一般为63。

    10. 1AH~1BH:磁头数

      这也是逻辑C/H/S中的一个参数,其值一般为255。

    11. 1CH~1FH:隐藏扇区数

      隐藏扇区数是指本分区之前使用的扇区数,该值与分区表中描述的该分区的起始扇区号一致。对于主分区来讲,是MBR到该分区DBR之间的扇区数;对于扩展分区中的逻辑分区而言,是其EBR到DBR之间的扇区数3

    12. 20H~23H:扇区总数

      扇区总数是指分区的总扇区数,也就是说FAT32分区的大小。

    13. 24H~27H:每FAT扇区数

      这四个字节用来记录FAT32分区中每个FAT表占用的扇区数。

    14. 28H~29H:标志

      这两个字节用于表示FAT2是否可用,当其二进制最高位置为1时,表示只有FAT1可用,否则FAT2也可用。

    15. 2AH~2BH:版本

      这两个字节通常为0。

    16. 2CH~2FH:根目录首簇号

      分区在格式化FAT32文件系统时,格式化程序会在数据区中指派一个簇作为FAT32根目录区的开始,并把该簇号记录在BPB中。通常斗士把数据区的第一个簇分配给根目录使用,也就是2号簇。

    17. 30H~31H:文件系统信息扇区号

      FAT32文件系统在DBR的保留扇区安排了一个文件系统信息扇区,用以记录数据区中空闲簇的数量及下一个空闲簇的簇号,该扇区一般在分区的1号扇区,即紧跟DBR后的一个扇区。

    18. 32H~33H:DBR备份扇区号

      FAT32文件系统在DBR保留扇区中安排了一个DBR的备份,一般在6号扇区,也就是第7个扇区。该备份与原DBR的内容一摸一样,如果原DBR遭到破坏,可以用备份扇区修复。

    19. 34H~3FH:保留
    20. 40H:BIOS驱动器号

      这是BIOS的INT 13H所描述的设备号码,一般把硬盘定义为8xH。

    21. 41H:未用
    22. 42H:扩展引导标记

      扩展引导标记用来确认后面的三个参数是否有效,一般值为29H。

    23. 43H~46H:卷序列号

      卷序列号是格式化程序在创建系统是生成的一组4个字节的随机数值。

    24. 47H~51H:卷标

      卷标是由用户在创建文件系统时指定的一个卷的名称,但这是旧系统所记录的位置,现在的系统已经不再使用这个位置记录卷标,而是由一个目录项管理卷标。

    25. 52H~59H:文件系统类型

      BPB的最后一个参数,直接用ASCII码记录当前分区的文件系统类型。

  4. 引导程序

    FAT32的DBR引导程序占用420字节(5AH~1FDH)),在Windows 98之前的系统之下,这段代码负责完成DOS三个系统的装入,在Windows 2000之后的系统中,其负责完成将系统文件NTLDR装入,对于一个没有安装操作系统的分区来讲,这段程序没啥用处…

  5. 结束标志

    DBR的结束标志与MBR、EBR的结束标志相同,都是55 AA

FAT表

FAT(File Allocation Table)即文件分配表,对于FAT文件系统来讲是非常重要的一个组成部分,其主要作用及特点如下:

  1. FAT文件系统一般有2个FAT表,FAT1是活动FAT,FAT2是备份。
  2. FAT1的大小与FAT2相同,因此我们可以通过算出FAT1的大小在FAT2处跳转这么多到达数据区。
  3. FAT表是由FAT表项构成的,我们把FAT表项简称为FAT项,每个FAT项的大小有32位(4字节)。
  4. 每个FAT项都有一个固定的编号,这个编号从0开始。也就是说,第一个FAT项为0号FAT项,第二个FAT项为1号FAT项,以此类推。
  5. FAT表的前两个FAT项有专门的用途:0号FAT项用于存放分区所在的介质类型,例如硬盘的类型为“F8”,那么硬盘上分区的FAT表第一个FAT项就以“F8”开始;1号FAT项则用来存储文件系统的肮脏标志,表明文件系统被非法卸载或者磁盘表面存在错误。
  6. 分区中每一个簇的适应情况都会映射到FAT表中的唯一一个FAT项。因为0号FAT项和1号FAT项和1号FAT项有特殊用途,无法与数据区中的簇形成映射,因此,数据区中的第一个簇的编号对应FAT表中的2号FAT项,以此类推。

总的来说,FAT表是用来表示分区使用情况的一个部分,我们可以通过FAT表来计算FAT分区的大小。

image.png

上图为FAT32文件系统中的FAT1
### 数据区
  1. 数据区的位置

    FAT32的数据区在文件系统中的具体位置是紧跟在FAT2之后的,下图为系统找到FAT32分区中数据区位置的流程图。

    image.pngJJJ

    以下为详细流程:

    ① 系统通过读取MBR中分区表的信息定位到该分区的DBR扇区;

    ② 读取 DBR 的0EH~0FH偏移处,得到DBR保留扇区数的值为38;

    ③ 读取 DBR 的24H~27H偏移处,得到FAT表大小的值为8705;

    ④ 用DBR保留扇区数+2*FAT表大小,结果等于17448,从DBR向后跳转17448扇区,这里就是数据区的开始。

  2. 数据区的内容

    FAT32文件系统数据区的内容主要由三个部分组成:根目录、子目录和文件内容。在数据中是以1为单位来管理这段空间的。

    image.png

    FAT32数据区根目录
  3. 目录项

    在FAT32文件系统下,分区根目录下的文件及文件夹的目录项存放在根目录区中,分区子目录下的文件及文件夹的目录项存放在子目录区中,根目录区和子目录区都在数据区中。

    image.png

    1)短文件名目录项

    image.png

    上图是一条文件目录项,目录项占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 文件大小(字节)
    1. 00H~07H:主文件名共占8字节,如果文件名(不包含扩展名)用不完8字节,后面用空格填充4。图中主文件名为IM0O

      另外该位置的第一个字节也用来表示目录项的分配状态,当该字节是00时,表示该目录项从未使用过;当该字节是E5时,表示该目录项曾经使用过,但目前已经被删除。

    2. 08H~0AH:文件的扩展名

      文件的扩展名共占3字节,文件夹没有扩展名,如果是文件夹的目录项,该位置会被空格填充。图中的扩展名为JPG

    3. 0BH:文件属性5

      文件属性占1字节(8bit),可以用来表示文件的各种属性。

    <<返回目录项类型

    2)长文件名目录项

    image.png

    上图为一个长文件名文件的目录项,图中长文件的文件名为shujuhuifu.txt

    在Windows 95开始,文件名”8.3“格式的限制被打破了,文件名可以超过8个字符,并且可以使用中文了,扩展名也可以超过3字节,这种格式的文件名就称为长文件名。

    在Windows 95以上的系统中,长文件名实际存储着两个名字,一个短文件名和一个长文件名。当创建一个长文件名时,其对应的短文件名有以下3个处理原则。

    • 系统取长文件名的前6个字符加上~1形成短文件名,其扩展名不变;

    图中取前六个字符SHUJUH

    • 如果已存在这个名字的文件,则符号~后的数字自动增加;

    例如:SHUJUH~1TXTSHUJUH~2TXT

    • 如果有DOS和Windows 3.x非法的字符,则以下划线_替代。
    • 每个长文件名目录项也占用32字节,一个目录项作为长文件名目录项使用时,其属性字节值为0FH,能够存储13个字符,如果文件名很长,一个长文件名就需要多个目录项,这些目录项按倒序排列在其短文件名目录项之前。

    如图中标明的顺序

    字节偏移 字段长度(字节) 字段内容及含义
    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码字符

      1. 序列号(00)

      序列号占1字节,该参数用来描述长文件名目录项的排序。

      在这个字节的8位中,0~4这5位用来描述长文件名目录项的顺序号,从1开始编号。6位(也就是说第7位)如果“1”表明该目录项是最后一项。如果文件删除,该字节也会改为E5

      1. 文件名的第1~5个Unicode码字符

      该参数长度为10字节(因为Unicode编码储存字符时每个字符占用2字节)。

      如果文件名已经记录完,但该参数的空间中还有未用的字节,就会在文件名最后一个字节填充2个字节的00,随后未用的字节用FF填充。

      1. 长文件名目录项的属性标志

      该参数长度为1字节,是属性字节。当属性的只读位、隐藏位、系统位、卷标位全为1,其它全为0是,改制就为16进制的0FH,表示该目录项为长文件名记录项。

      1. 未用

      该字节不使用。

      1. 短文件名校验和

      该参数长度为 1 字节,是个校验和,长文件名目录项通过这个校验和将其与相应的短文件名目录项关联起来。校验和的数值是使用短文件名计算得到,同 文件的长文件名目录项的校验和必须是相 向的。校验和的计算方法是依次将短文件名的各个字符对应的二进制值相加,在每一步相加前要先将二进制的结果值依次向右移动一位,最右边的位循环移动到最左边,然后再加上下一个字符所对应的二进制值,直到把最后一个字符加完,结果就是校验和的数值。

      1. 文件名的第6~11个字符

      同[2.]

    ③号长文件名目录项的首字节为42H,换算为二进制等于01000010,其0~4位的值为00010,说明这是第二个长文件名目录项,6位上的值是1,说明这是最后一项长文件名目录项。

    ②、③两条长文件名目录项的结构一样,以倒序的方式排列在其短文件名目录项之前,完整地记录了文件名shujuhuifu.txt

    <<返回目录项类型

    3).目录项和..目录项

    子目录所在的文件目录项区域中,总有两个特殊的目录,它们就是...

    使用DOS命令dir可以看到这两个目录

    image.png

    .表示当前目录

    ..表示上级目录

    在winhex中查看.目录与..目录的目录项:

    image.png

    其中0x00H0x1FH为.目录的目录项,0x20H0x3FH为..目录的目录项

    img.png

    img.png

    图为两个目录项的在模板管理器中的效果
    从这两个目录项的实际数据可以得知:
    1. .目录项所描述的起始簇号是子目录本身所在的簇号。
    2. ..目录项所描述的起始簇号是上级目录的起始簇号,如果上级目录是根目录,则该值为0
    3. 所有目录的文件大小都是0

    <<返回目录项类型

    4)卷标目录项

    卷标就是一个分区的名字,可以在格式化分区时创建,也可以随时修改。

    ① 对于FAT格式的分区,卷标的长度最多为11字节,若果卷标为中文,则最多支持5个字符。

    ② 卷标的目录项中不记录簇号和大小。

    ③ 卷标的目录项中不记录创建时间和最后访问时间,只记录修改时间。

    <<返回目录项类型

实例:导出损坏分区FAT32中的文件

  1. 导入题目FAT32-19123.vhd后用Winhex打开

题库/FAT32-19123

fat32.png

  1. 填写结束标志,跳转到FAT32分区

首先填写MBR主引导记录所缺失的结束标志55 AA。接着查看分区表中的第一个分区,并跳转到该分区。

image.png

从残留的DBR中,可以看出该分区为FAT32,其每簇扇区数为32

  1. 向下搜索!00

使用快捷键Ctrl+Alt+x向下搜索16进制数值!00(非零),可以搜索到根目录。

image.png

在根目录中发现需要找到的文件,查看其高位簇,低位簇(位置)和大小,导出文件即可

image.png

box.png在3号簇,大小为3,752字节

box.txt在4号簇,大小为283字节

跳转到对应位置后选中对应大小,右键>>编辑>>复制选快>>至新文件

FATintonewfile.gif

导出文件步骤(gif有录制时有点问题)
> 在本题中有一道附加题,即恢复分区2。

实例:恢复FAT32分区(手动填写FAT32分区的DBR)

  1. 导入题目FAT32-191226.vhd后用Winhex打开

题库/FAT32-191226

image.png

  1. 填写结束标志55 AA,向下搜索非0,确定分区类型与DBR位置

打开虚拟磁盘后,我们发现MBR的分区表结束标志被清空,首先,填写结束标志55 AA

保存后重新加载虚拟磁盘,点选到00处,向下搜索非零。
image.png

搜索到下图内容:

image.png

根据FAT32分区的特征:RRaA,可以判断处该扇区前一个扇区为FAT32分区的DBR。

  1. 计算FAT32分区所必须的数值

    1. 计算FAT32分区保留区大小

      在FAT32分区头部有一部分区域为保留区,在填写DBR时我们需要填写保留区大小值,所以我们需要计算保留区的大小。

      • 向下搜索F8FF

      F8FF为FAT文件系统中FAT表的标识,我们通过找到FAT表的位置后将FAT表位置减去DBR位置得到保留区大小

      image.png

      • 复制FAT表位置 2086

      • 复制DBR位置 2048

      • FAT表位置减去DBR位置得到保留区大小38

    2. 计算FAT32分区FAT表大小

      填写DBR时还需要填写FAT表的大小,那么如何计算FAT表的大小呢?

      • 记录FAT1的位置2086,向下搜索F8FF

        FAT1与FAT2的标识符均为F8FF,用FAT2的位置减去FAT1的位置即可得到FAT表的大小

      • 记录FAT2的位置27687

      • FAT2的位置减去FAT1的位置得到FAT表的大小25601

    3. 计算FAT32分区每簇扇区数

      • 跳转到数据区

        FAT2向后跳转FAT表大小即可达到数据区

        image.png

      • 记录数据区的位置:53288,该位置为根目录(数据区中的首个扇区)

      • 点击空余处,向下搜索非0,搜索到下一簇的目录,位置为53416

      • 相邻的子目录的位置减去根目录的位置得到每簇扇区数128

    4. 计算FAT32分区大小

      得到以上参数后我们就可以计算最后需要填写到DBR内的参数——分区大小

      (FAT表大小-1)x128x每簇扇区数+保留区大小即可得到该分区的大小。

      需注意,这个大小会比分区时的分区大小稍小一点,不过不影响分区中的文件(除非你用满了整个分区)

      • 通过计算,我们得到该FAT分区的大小419430438扇区
  2. 填写DBR

    1. 填写跳转指令EB 58 90

      在DBR扇区起始处填写FAT32分区的跳转指令

    2. 填写每扇区字节数 512

      0x0B处(2字节)填写每扇区字节数,默认为512

    3. 填写每簇扇区数128

      0x0D处(1字节)填写每簇扇区数,本题为128

    4. 填写保留区大小38

      0x0E处(2字节)填写保留区大小,本题为38

    5. 填写FAT表个数2

      0x10处(4字节)填写FAT表个数,默认为2

    6. 填写磁盘介质F8

      0x15处(1字节)填写磁盘介质,默认为F8

    7. 填写分区位置2048

      0x1C处(4字节)填写分区位置,本题为2048

    8. 填写分区大小419430438

      0x20处(4字节)填写分区大小,本题为419430438

    9. 填写FAT表大小25601

      0x24处(4字节)填写FAT表大小,本题为25601

    10. 填写根目录首簇号2

      0x2C处(4字节)填写根目录首簇号,默认为2

    11. 填写文件系统标识FAT32(ASCII)

      0x52处填写文件系统标识,在ASCII栏处直接填写FAT32即可

    12. 填写结束标志55 AA

      在扇区结尾处填写55 AA结束标志

    • 下图为填写FAT32文件系统DBR全过程。

    fat32dbr.gif

    • 至此,你已经恢复了分区1
  3. 从DBR向后跳转分区大小,恢复分区2

    • 恢复分区2的步骤与分区1相同

附加题:填写NTFS文件系统DBR

​ NTFS文件系统的DBR填写起来非常简单,你只需要复制一个其他NTFS文件系统的DBR到你需要填写的位置,更改分区的位置与大小参数即可(通常情况是这样)

EBR的组成

在上篇文章中我们了解到了扩展分区的结构,以及其在整个磁盘中的作用。本节我们将了解EBR具体的组成。

img.png

可以看到,EBR中含有与MBR主引导记录中相似的分区表,通常最多有两个分区表项。

第一个分区表项类同与MBR主引导记录中的分区表格式,不过需要注意的是:扩展分区中的逻辑分区无法成为活动分区。

第二个分区表项用来链接下一个EBR扇区,下图为一个扩展分区的结构

image.png

从上图中可以看出,逻辑分区后无扩展分区的情况时,逻辑分区前的扩展分区无第二个分区表项

分区表项1的作用同等于MBR中的分区表项,所以在这里我们查看分区表项2

EBR.gif

扩展分区的分区表项2是用来指向下一个EBR的


  1. 1.分区中的簇:文档
  2. 2.磁盘介质描述符:文档
  3. 3.不过该值不严谨,填写时可以直接填其绝对位置
  4. 4.空格在16进制中的数值为20H
  5. 5.FAT32目录项的文件属性:文档