前言

本篇将分析 NTFS 分区下常见的元文件与计算分区大小的多种方法。

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

知识点总览

  • NTFS 常见元文件分析
  • 多种方法计算 NTFS 分区大小
  • 实例:恢复丢失 DBR 的 NTFS 分区
  • 实例:从 NTFS 分区提取文件

NTFS 常见元文件分析

元文件 $MFTMirr

$MFTMirr 是系统以恢复为目的创建的文件,其内容为元文件 $MFT 的前 4 项记录的备份。

在 NTFS 的每簇扇区数大于 4KB 时,那么 $MFTMirr 文件则备份 $MFT 前一个簇的文件记录,而且是按照文件记录的顺序进行备份的。

元文件 $BitMap

元文件 $Bitmap 用来管理卷中簇的使用情况,在簇位图中,每个字节表示8位,对应8个簇(LCN)。

元文件 $LogFile

日志文件的数据区由一系列 4KB 大小的日志记录组成,记录头的固定标识是 RCRD,其重启页的头部标志是 RSTR,位于重启区域的开始部分。

在文件被写到磁盘上时会在日志文件中更新文件系统有关的一些数据(如文件创建时间)。日志文件会记录这些操作的成功与失败,在系统故障后第一次进入磁盘时,系统读取日志文件并使其恢复到最后一次操作开始前的状态。恢复时间与磁盘大小无关,只与失败任务的复杂程度有关。

日志文件的数据区位置起始通常在 NTFS 分区的中间部分。

日志文件记录类型

NTFS 文件系统会为以下事务写入更新记录:

① 创建文件

② 删除文件

③ 扩展(修改)文件

④ 截断文件

⑤ 设置文件信息

⑥ 重命名文件

⑦ 更改应用于文件的安全信息

日志文件的文件记录

$LogFile 是 $MFT 中的第三个文件记录,其文件记录号为 02H。

多种方法计算 NTFS 分区大小

通过 $LogFile 的文件位置计算

image-20211202105110859

日志文件的数据区位置起始通常在 NTFS 分区的中间部分

所以我们可以通过计算出 $LogFile 相对于 DBR 的位置,再乘2,就能推断出该分区的大致大小。

计算方式:$LogFile的位置(扇区) * 2 = 分区的大致大小

通过 $BitMap 的文件记录计算

根据簇位图表示分区大小,我们可以从 $BitMap 文件记录的 80H 属性中找到该文件的数据区大小

数据区大小(簇数)* 每簇扇区数 可以得到 数据区大小(扇区数)

数据区大小(扇区数)* 每扇区字节数(512) 可以得到 `数据区大小(字节数)``

由于每个字节有8位,也就可以表示8个簇的使用情况,可以用 数据区大小(字节)* 8 可以得到 分区总簇数

分区大小(簇数) * 每簇扇区数 即可得出分区的扇区大小

通过 $BitMap 的数据区大小计算

在文件记录被破坏等情况下,我们可以直接找到 $BitMap 的数据区,大致估算出数据区大小,再进行上述操作计算出分区大小。

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

附加虚拟磁盘文件

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

image-20211202150436226

使用 Winhex 打开虚拟磁盘

使用 Winhex 打开该虚拟磁盘后可以观察到,主引导扇区的分区表及结束标志损坏,故左上角的“分区类型”显示为?,首先填写位于最后两个字节的结束标志 55 AA

image-20211202150815517

寻找分区

从 1 扇区开始,使用快捷键 Ctrl+Alt+x 向下查找16进制数值!00(非零),可以查找到 B O O T M G R 字样,判断出这个扇区为 NTFS 分区中 $Boot 元文件的第二个扇区,第一个扇区即为 DBR。

image-20211202151045678

记录下 DBR 的隐藏扇区数(位置)为 63 扇区。

计算分区大小

通常情况下,$MFT 的位置位于该分区起始处向后偏移 786432 簇,每簇扇区数通常为 8 扇区/簇,换算成扇区数为 6291456 扇区。

本次计算使用“通过 $BitMap 的文件记录计算分区大小”方法。

向后跳转 6291456 个扇区,到达 $MFT。

image-20211202151421126

image-20211202151500455

已知 $BitMap 通常位于 6 号文件记录,每个文件记录占 2 个扇区。向后跳转 6*2=12 扇区,即可到达 $BitMap 的文件记录位置。

image-20211202151620288

通过观察 80H 属性中的 RunList,可以得出:

该分区的 $BitMap 大小占 0xA0 个簇,换算成10进制为 160 个簇。

通过 (160 * 8 - 1) * 512 * 8 * 8 可计算出分区大小为 41,910,272 扇区

寻找该分区的备份,修复 DBR

使用快捷键 Ctrl + G 跳转到分区 DBR 位置(63扇区),再向后跳转 41,910,272 扇区,至该分区尾部。

由于计算分区大小时为了放置分区大小计算过大,通常会在 $BitMap 的扇区大小数 - 1 再进行后续的计算,这样计算出来的值会比实际分区大小略微小一点,不过不会影响数据恢复。

向下查找 !00,找到该分区的备份。

image-20211202152250208

选中整个扇区(分区备份),复制粘贴至该分区的 DBR 位置。

image-20211202152346650

填写 MBR

跳转到 0 扇区后填写 MBR 的分区表。

NTFS 分区的标识为 07

该分区所在位置为 3F(63)

该分区的大小为 72 CB 7F 02(41,929,586)

image-20211202152923455

保存更改后重新加载该磁盘

保存后从 计算机管理——磁盘管理 处刷新该磁盘,可以看到该虚拟磁盘的分区恢复成功。

image-20211202153001162

使用资源管理器打开分区后,文件显示正常。

image-20211202153029017

至此,本题结束。

实例:从 NTFS 分区提取文件

本题目标文件为:site.png

附加虚拟磁盘文件

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

image-20211203094902876

使用 Winhex 打开虚拟磁盘

image-20211203095108974

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

寻找分区

向下查找 16 进制数值 !00,如图所示,可以判断出该分区为 NTFS 分区。

image-20211203095346883

分区位置为 63。

前往 $MFT,寻找文件

向后跳转 6291456 扇区至元文件 $MFT。

image-20211203095517636

使用快捷键 Ctrl+F 向下查找 Unicode 文本 site.png

image-20211203095605699

如图所示,该扇区为图片 site.png 的文件记录。

image-20211203095634975

计算文件属性,恢复文件

找到该文件记录的 80H 属性,其 RunList 值为 22 94 02 57 19

故该文件位置为 19 57H(簇),大小为 02 94H(簇)。

换算成 10 进制扇区数为:

文件位置:51896(簇)

文件大小:5280

从 DBR 处向后跳转 51896*8=415168 个扇区,到达文件数据区。

image-20211203095955848

右键数据区开头,点击“选块起始位置”设定该位置为选块的起始。

image-20211203100031449

向后跳转 5280 个扇区,到达文件数据末尾。

右键数据区末尾,点击“选块尾部”,建立选块。

image-20211203100159351

右键选块,点击“编辑”——“复制选块”——“至新文件”,即可将文件手动恢复出来。

image-20211203100233705

image-20211203100335904

用资源管理器打开文件夹,即可看到该文件被恢复了出来。

image-20211203100411696

至此,本题结束。