数据恢复专题:通过例题形式学习 Ext3 文件系统的分区恢复、文件恢复(18)
前言
本篇将通过例题形式学习 Ext3 文件系统的分区恢复、文件恢复
你可以在 https://winhex.im0o.top/ 中查看所有例题文件
总览
实例:恢复严重被破坏分区的 Ext3 文件系统
实例:从底层恢复 Ext3 文件系统中的文件
实例:恢复严重被破坏分区的 Ext3 文件系统
从题库下载题目:230209 - 恢复严重被破坏分区的 Ext3 文件系统
涉及知识点
Ext3 文件系统的超级块结构
Ext3 文件系统的块组描述符表结构
从备份超级块恢复 Ext3 文件系统的 0 号超级块
恢复要求
恢复根目录下的文件 Jay_Hicks_6194.png
附加磁盘文件、使用 Winhex 打开磁盘
导入题目后可以从 计算机管理 —— 磁盘管理 中看到该虚拟磁盘显示位 “没有初始化”,其大小为 150GB,均未分配分区,可以初步判断该虚拟磁盘的 MBR(主引导扇区)损坏。
使用 Winhex 打开虚拟磁盘后开始进行数据恢复。
寻找分区
向下搜索 !00
,在 2050
扇区处找到数据
通常情况下 第一个分区的位置 通常第一个分区的起始位置为 0(USB-FDD)、63、1024、2048、4096 会出现在 63
扇区 或 2n 扇区 处
搜索到的数据位置为 2050
扇区,初步判断所在分区为 ext3/ext4 分区(因为 ext3/ext4 的 0 号超级块相对于分区起始间隔 2 扇区)
确定分区为 ext3/ext4 分区
向前跳转至 2048
扇区后向后跳转 262144
扇区(通常一个块组的大小)可以发现 1 号超级块的数据
现在可以确定当前分区为 ext3 分区
将备份超级块复制至 0 号超级块位置
选中超级块扇区数据,将其复制至 2050
扇区处
修改数据中的 当前超级块所在块组 为 0。
计算分区大小,填写分区表
本部分与 实例:恢复损坏 0 号超级块的 Ext3 文件系统 步骤相似
查看超级块中的 总块数,计算分区大小,填写分区表。
总块数 * 每块扇区数 = 分区大小
该分区数据为
分区类型 | 分区起始位置 | 分区大小 |
---|---|---|
83 | 2048 | 314570752 |
填入 MBR 后,保存后重新打开磁盘,可以发现分区已经恢复。
打开分区后发现分区被损坏,无法正常打开
排查故障
从 0 号块组起始向后跳转 8
扇区到达 块组描述符表 位置
由图中所示,块组描述符表损坏,数据变成了 FF
修复块组描述符表
从备份超级块中寻找块组描述符表 将其复制至 0 号超级块
计算块组描述符表的大小
在这之前,我们需要得知 块组描述符表 的大小
通常情况下,每个块组描述符能表示至多 32768 个块,块组描述符表包含了所有块组描述符
在 Ext3 文件系统的块组描述符分析 > 通过块组描述符计算分区大小 处解释过块组描述符表可以表示分区大小
并且,可以通过块组描述符表计算分区大小
在这里,我们已知分区总块数,逆推教程中计算分区大小的方法,我们可以算出 分区有多少个块组 即 块组描述符的个数
从超级块得到分区总块数为 39,321,344
块
用 总块数 / 32768(每块扇区数)
得到 块组数 为 39,321,344 / 32768 = 1199.992
由于 最后一个块组不一定满 32768 块 所以该分区的块组数量为 1200
块组
所以 块组描述符 的个数为 1200
项
在 块组描述符表 中,每个块组描述符的大小为 32 字节,由此可以计算出 块组描述符表 的字节大小
用 块组描述符个数(即块组数量)* 32 字节
得到 块组描述符表 的大小(字节)
即 1200 * 32 = 38,400
字节
从备份超级块的块组描述符恢复数据
跳转至 1 号超级块后向后跳转 8 个扇区 前往 1 号超级块的 块组描述符表
选中数据,从起始位置向后跳转 38400 字节
如果跳转至此处发现后面还有块组描述符数据,说明 块组描述符表 的数据不是连续存储的,中间包含了 碎片数据。
忽略碎片数据,拼接 块组描述符表 的数据并复制至 0 号超级块的 块组描述符表 数据区处
修复故障,保存并打开分区
保存后从 Winhex 打开分区,可以发现分区已经成功恢复
恢复文件
从目录浏览器中找到目标文件 Jay_Hicks_6194.png
将其恢复。
实例:从底层恢复 Ext3 文件系统中的文件
从题库下载题目:230210 - 从底层恢复 Ext3 文件系统中的文件
涉及知识点
Ext3 文件系统的块组描述符表结构
Ext3 文件系统的 i-节点 结构
Ext3 文件系统的目录项结构
恢复要求
恢复 /GIF/Steve_Kennedy_2941.gif 文件
附加磁盘文件、使用 Winhex 打开磁盘
导入题目后可以从 计算机管理 —— 磁盘管理 中看到该虚拟磁盘显示位 “没有初始化”,其大小为 30GB,均未分配分区,可以初步判断该虚拟磁盘的 MBR(主引导扇区)损坏。
使用 Winhex 打开虚拟磁盘后开始进行数据恢复。
寻找分区
向下搜索 !00
,在 2056
扇区处找到数据
由图中数据可以看出该部分为 ext3/ext4 分区的 块组描述符表
0 号超级块 与 块组描述符表 的间隔为 8
个扇区,所以分区的起始位置为 2056 - 8 = 2048
扇区
尝试修复分区
向后跳转多次 262144
扇区,尝试寻找超级块备份,但是没有找到,于是尝试手动提取文件
手动提取文件
手动提取 ext3/ext4 文件系统中的文件的大致步骤为
块组描述符 => i 节点 => 目录 => i 节点 => 文件
寻找根目录的 i-节点
已知文件位于分区 根目录/GIF/
下,所以从根目录开始寻找
根目录的 i-节点位于 0 号块组
从块组描述符表中找到 0 号块组的块组描述符的 i-节点表 的起始位置
从分区起始位置向后跳转 1,027 * 8 = 8216
扇区,找到 0 号块组的 i-节点表
根目录的 i-节点位于 2 号 i-节点
跳转至根目录的数据区
从 根目录的 i-节点 的直接块指针中找到根目录的数据区的起始位置
得出根目录的位置位于分区起始相对向后 1539 * 8 = 12312
扇区
跳转至根目录的数据区,寻找 GIF/
目录的 i-节点号
GIF 目录的 i-节点号为 00 01 80 01
即 98,305
号 i-节点
跳转至 GIF 目录的数据区
如果已知一个 i-节点号,就可以计算出该 i-节点所在块组,计算方法为
(i-节点号 −1)/ 每块组 i-节点数
计算得出 GIF 目录的 i-节点所在块组为 98,305 - 1 = 98,304
,每块组 i-节点数为 8,192
,所以 GIF 目录的 i-节点所在块组为 98,304 / 8,192 = 12
号块组
如果计算得出的数据带有小数,可以向下取整。对 (i-节点号 - 1) MOD 8192
(取余数)即可计算出该 i-节点在块组中的相对位置
本题没有小数,所以直接计算得出 GIF 目录的 i-节点所在块组为 12 号块组的第 1 个 i-节点
从块组描述符表中找到 12 号块组的块组描述符的 i-节点表 的起始位置
跳转至 12 号块组的 i-节点表,找到 GIF 目录的 i-节点
从 GIF 目录的 i-节点 的直接块指针中找到 GIF 目录的数据区的起始位置为 393,730
号块
即 393,730 * 8 = 3,149,840
扇区
跳转至 GIF 目录的数据区,寻找 Steve_Kennedy_2941.gif
文件的 i-节点号
Steve_Kennedy_2941.gif
文件的 i-节点号为 00 01 80 03
即 98,307
号 i-节点
跳转至 Steve_Kennedy_2941.gif 文件的 i-节点
使用同样的方法计算得出 Steve_Kennedy_2941.gif 文件的 i-节点所在块组为 12 号块组的第 3 个 i-节点
跳转至 12 号块组的 i-节点表,找到 Steve_Kennedy_2941.gif 文件的 i-节点
分析 Steve_Kennedy_2941.gif 文件的数据区
从 Steve_Kennedy_2941.gif 文件的 i-节点 的直接块指针中找到该文件的数据区的起始位置为 106,052
号块,直至 106,063
号块均为该文件的数据区
i-节点的直接块指针有 12 个,大于 12 个的数据区的起始位置需要通过间接块指针来找到
该文件的间接块指针的起始位置为 100,365
号块,第二个间接块指针的起始位置为 100,366
号块
可以判断,该文件的间接块指针的数据是连续的
前往文件 Steve_Kennedy_2941.gif 的间接块指针
跳转至 100,365
号块,查看间接块指针的数据
观察间接块指针中的连续数据,如果两个间接块指针之间的数据不是连续的,那么该文件的数据区就不是连续的;
即目标文件包含碎片数据,需要将碎片数据合并才能得到完整的文件
通过观察间接块指针数据中的直接块指针,或使用 Winhex Script 自动查找每段连续的指针数据,得出该文件的碎片分布情况如下:
106052 -> 106067
108465 -> 108479
108833 -> 108863
106913 -> 106975
108929 -> 109055
111253 -> 111507
112129 -> 112639
113665 -> 113675
前往文件 Steve_Kennedy_2941.gif 的数据区,恢复文件
将以上得出的碎片数据 * 8 换算为扇区单位,得出 8 个碎片的起始位置和结束位置
将 8 个碎片的数据导出为文件,使用 Winhex 的 文件合并
功能将 8 个碎片合并为一个完整的文件
你可以在 使用 Winhex 进行数据恢复(19) 中找到详细的碎片文件恢复教程