前言

本节将学习如何从底层恢复 exFAT 分区的 DBR,与如何从底层提取 exFAT 分区中的文件。

你可以在 https://im0o.top/winhex-tiku/ 中查看所有例题文件

知识点总览

  • 实例:恢复丢失 DBR 的 exFAT 分区
  • 实例:从 exFAT 分区中提取文件

实例:恢复丢失 DBR 的 exFAT 分区

附加虚拟磁盘文件

导入题目后可以从 计算机管理 —— 磁盘管理 中看到该虚拟磁盘显示位 “没有初始化”,其大小为 50GB,均未分配分区,可以初步判断该虚拟磁盘的 MBR(主引导扇区)损坏。

image-20211220185553136

使用 Winhex 打开虚拟磁盘

使用 Winhex 打开该虚拟磁盘后可以观察到,主引导扇区损坏,首先填写位于最后两个字节的结束标志 55 AA

image-20211220185532744

寻找分区1

image-20211220185942129

1 扇区为主引导记录-引导程序的备份。

image-20211220190056330

从 2 扇区开始,使用快捷键 Ctrl+Alt+x 向下查找 16 进制数值 !00(非零),可以查找到一段数据。

image-20211220190217614

该数据为 exFAT 分区 DBR 后的数据,继续向后寻找其他数据。

在 75 扇区找到了 exFAT 的 DBR,推测该分区为 exFAT 分区结构,该扇区为该分区 DBR 的备份。

image-20211220194844062

选中复制整个扇区,向前跳转 12 个扇区,到达 DBR 位置并粘贴。

image-20211220195500362

读取 BPB 参数,可得分区位置为 00 00 00 00 00 00 00 3F H,分区大小为 00 00 00 00 02 80 48 F5 H。

向记事本内填写该分区的参数:

  • 分区类型:ex(07)
  • 分区位置:63
  • 分区大小:41,961,717

image-20211220203833415

寻找分区2

从分区1的 DBR 处向后跳转 41,961,717 个扇区,前往分区2。

image-20211220203935655

image-20211220203953215

可以看到该扇区为空,后面有着和分区1的 DBR 后一个扇区相同的数据,初步判断该分区为 exFAT 类型分区。

向后跳转 12 个扇区,查看其备份位置。

image-20211220204103403

如上图,备份位置为空,可以判断该分区的备份与 DBR 被损坏。

修复 exFAT 分区的 DBR

需要的数据

修复 exFAT 分区的 DBR 需要以下数据:

  • 跳转指令:EB 76 90(固定值)
  • OEM代号:EXFAT(ASCII 固定值)
  • 分区位置
  • 分区大小
  • FAT 表起始扇区号(FAT 表相对 DBR 的位置)
  • FAT 表大小
  • 簇位图文件起始扇区号(= FAT 表起始扇区号 + FAT表大小)
  • 总簇数
  • 根目录首簇号
  • 每扇区字节数:09(29=512 字节)
  • 每簇扇区数:N(2N = 每簇扇区数)
  • FAT 表个数:01(固定值)
  • 结束标志:55 AA(固定值)

首先填写好固定值与分区位置:

image-20211220204933645

计算 FAT 表偏移位置

接着向后搜索 F8 FF FF FF 找到 FAT 表。

image-20211220205109199

找不到 FAT 表可以向后多次搜索几次,或者打开“偏移计算”

image-20211220205157640

用 FAT 表的位置减去分区 DBR 的位置:41963828 - 41961780 = 2,048

将该值填入 DBR 的 BPB参数中:

image-20211220205449871

计算 FAT 表大小

向后跳转 2048 扇区,到达 FAT 表位置,在空白处向下搜索 !00,找到 簇位图文件位置。

image-20211220205609545

用簇位图文件位置减去 FAT 表文件位置得到 FAT 表大小:41972020 - 41963828 = 8,192

将该值填入 BPB 参数中:

image-20211220205753528

计算簇位图文件偏移位置

用簇位图文件位置减去分区 DBR 的位置:41972020 - 41961780 = 10,240

将该值填入 BPB 参数中:

image-20211220205951015

计算每簇扇区数

在簇位图文件的空白处向下搜索 !00 到大写字符文件处。

image-20211220210057654

跳转后位置如下图:

image-20211220210115450

记录大写字符文件位置为:41972276

向后跳转 12 个扇区,到达文件末尾,向下搜索 !00 前往根目录。

image-20211220210255131

记录根目录位置为:41972340

每簇扇区数为根目录位置 - 大写字符文件位置:41972340 - 41972276 = 64

因为 26 = 64,所以在 BPB 中需要填入值 06

image-20211221102329072

计算总簇数

使用 Ctrl+G 快捷键跳转到根目录:41972340

image-20211221101340561

查看簇位图文件的目录项“81H”,可以得知簇位图文件的大小为 122,824 字节。

用簇位图大小乘8可以得出总簇数: 122,824 * 8 = 982,592。

在 BPB 参数中填入总簇数:982,592。

image-20211221102430665

计算根目录首簇号

使用 Ctrl+G 快捷键跳转到根目录:41972340

image-20211221103256905

查看大写字符文件的目录项“82H”,可以得知大写字符文件所在的簇号为 6 号簇,根目录所在簇号即为 6 + 1 = 7 号簇。

将根目录首簇号填入 BPB 参数:

image-20211221103547249

计算分区大小

分区大小为总簇数 * 每簇扇区数:982,592 * 64 = 62,885,888

将分区大小填入 BPB 参数:

image-20211221102648520

将分区数据计入记事本

向记事本内填写该分区的参数:

  • 分区类型:ex(07)
  • 分区位置:41,961,780
  • 分区大小:62,885,888

image-20211221102732209

填写 MBR 主引导记录

将记事本中记录的数据填入 MBR 的分区表中并保存:

image-20211221102846562

在磁盘管理中查看分区情况:

image-20211221103051186

手动填写的 exFAT 分区无法被 Windows 资源管理器读出,但是可以通过 Winhex 识别到该分区:

image-20211221102926981

也可以直接双击打开分区 2:

image-20211221104212883

至此,本题结束。

实例:从 exFAT 分区中提取文件

本题的目标文件为:hkl039.png

附加虚拟磁盘文件

导入题目后可以从 计算机管理 —— 磁盘管理 中看到该虚拟磁盘显示位 “没有初始化”,其大小为 25GB,均未分配分区,可以初步判断该虚拟磁盘的 MBR(主引导扇区)损坏。

image-20211221110353385

使用 Winhex 打开虚拟磁盘

image-20211221110447780

使用 Winhex 打开该虚拟磁盘何以观察到整个主引导扇区都为空,首先填写 MBR 的结束标志 55 AA,接着向下寻找分区。

寻找分区

image-20211221110506677

向下查找 16 进制数值 !00,如图所示,可以判断出这段数据疑似簇位图文件,在空白处继续向下搜索非零。

image-20211221110559667

由上图可知,我们搜索到了大写字符文件,可以判断该分区为 exFAT 分区,记录大写字符文件的起始位置:10559

计算每簇扇区数

向后跳转 12 个扇区,搜索非零,找到根目录:

image-20211221110706604

记录根目录位置:10623,与大写字符位置相减得出每簇扇区数为:10623 - 10559 = 64。

找到文件的目录项

使用快捷键 Ctrl+F 向下搜索 Unicode 字符串:hkl039.png

image-20211221111239372

image-20211221111300636

搜索到了文件 hkl039.png 的目录项。

image-20211221111708733

查看其文件属性 “C0H”,可以得知该文件的起始簇号为:00 00 00 14H

文件大小为:00 04 55 D8 H

转化为十进制后:

  • 起始簇号 20
  • 文件大小 284,120

计算文件位置

回到根目录,查看大写字符文件的目录项 “82H” 属性的起始簇号:

image-20211221112247173

大写字符文件的起始簇号为:6 号簇

根目录首簇号为 6 + 1 = 7 号簇

当前位于根目录,需要向后跳转 20 - 7 = 13 个簇达到文件数据的起始。

跳转至文件数据区,恢复文件

使用快捷键 Alt + G 向后跳转 13 * 64 = 832 扇区到达目标文件的数据位置:

image-20211221112609817

右键文件头,点击“选块起始位置”,向后跳转 284,120 字节,到达文件末尾:

image-20211221112716701

右键点击“选块尾部”选中整个文件数据:

image-20211221112732932

右键选块——编辑——复制选块——至新文件:

image-20211221113003588

将数据另存为一个 png 文件:

image-20211221113112092

打开文件后没有提示损坏:

image-20211221113134373

至此,本题结束。