取证——硬盘数据恢复

FAT 文件系统

FAT 文件系统分为 5 个部分:

MBR区

MBR(Main Boot Record 主引导记录区) 位于整个硬盘的 0磁道 0柱面 1扇区,占用 512 字节。

  • ① MBR 引导程序占用其中的前 446 个字节
  • ② 随后的 64 个字节为硬盘分区表(DPT)。每一个分区为 16 个字节,故共可以划分 4 个主分区。
  • ③ 最后 2 个字节是分区的阶数标志 0x55AA
DBR区

DBR(Dos Boot Record 操作系统引导记录区)通常位于硬盘的 0磁道 1柱面 1扇区,是操作系统可以直接访问的第一个扇区。

它包括一个引导程序和一个被称为 BPB(BIOS parameter) 的本分区参数记录表。

  • 引导程序的主要任务是:当 MBR 将系统控制权交给它时,判断本分区根目录前两个文件是不是操作系统的引导文件,以 DOS 为例,即是 IO.SYS 和 MSDOS.SYS。低版本的 DOS 要求这两个文件必须是前两个文件,而高版本的没有这个限制。如果确定存在,就把 IO.SYS 读入内存,并把控制权交给 IO.SYS。
  • BPB 参数记录块记录着本分区的:起始扇区、结束扇区、文件存储格式、硬盘介质描述符、根目录大小、FAT 个数。
FAT 区

FAT(File Allocation Table 文件分配表)。同一个文件的数据并不一定完整地存放在磁盘的一个连续的区域内,往往会分成若干段,像一条链子一样存放,这种存储方式称为文件的链式存储。

硬盘上的文件常常要进行创建、删除、增长和缩短等操作,这样的操作做的越多,硬盘上的文件就可能被分得越零碎。但是硬盘上会保存着 段与段之间的连接信息(即 FAT),故操作系统可以准确的找到各段的位置并正确读出。
这种以簇为单位的存储方式有一定的缺陷:每个文件的最后一簇都有可能有未被完全利用的空间(Slack 空间)。

为了实现文件的链式存储,硬盘上记录着 哪些簇已经被文件占用,且必须为每个已经占用的簇致命存储后继内容的下一个簇的簇号,对于一个文件的最后一簇,则要指明本簇无后继簇。这些信息都由 FAT 来记录,表中的每个项 记录 1 个簇的信息。由于 FAT 很重要,所以在原 FAT 的后面会再建一个同样的 FAT 做备份。

DIR区

DIR(Directory)是根目录区,紧接着第二FAT表(即备份的FAT表)之后,记录着根目录下每个文件(目录)的起始单元,文件的属性等。定位文件位置时,操作系统根据DIR中的起始单元,结合FAT表就可以知道文件在硬盘中的具体位置和大小了。

DATA区

DATA(数据)区,是真正意义上数据存储的地方。位于DIR区之后,占据硬盘上的大部分数据空间。


Windows 的文件删除和恢复

Windows 文件删除分为逻辑删除物理删除

  • 逻辑删除:将文件删除到回收站,它只是在系统的文件分配表 FAT 中被删除的文件目录条目的相关位置上做上删除标记,并未将文件从硬盘上彻底删除
  • 物理删除:物理删除相当于 清空回收站,文件的目录条目被破坏,但是在硬盘中的数据依然还在,但是若是重新写入文件将这些空间覆盖则无法找回

当文件被物理删除时,会将该文件的目录条目中的文件名的第一个字符替换成删除标记:E5;其后面的簇都会被标记成未被分配,从而使操作系统无法识别该文件,但是磁盘中的文件数据依然还在。

基于文件目录的数据恢复

当执行“删除文件”操作时,系统做了两件事:

  • 将目录区中该文件的第一个字符改为 “E5H” 来表示该文件已经删除
  • 将文件所占的 文件簇 在 文件分配表 中的对应表项设为 0

系统在文件分配表(FAT)中相应位置检测到 0 就认为该文件簇处于空闲状态,可以写入其他文件,而实际上硬盘的数据并没有被删除,除非新的数据被写进那些扇区,才会把原来的数据覆盖,从而真正删除。

所以在 Windows 中,删除文件可以说仅仅只改变了某些状态。

基于文件数据特征的数据恢复

如果文件删除后,某些存放文件内容的簇被重新分配使用,这将可能导致无法使用文件的目录信息来恢复数据。但是存放文件内容的簇不一定完全被分配到,所以 某些残余的碎片数据 可能该存在。虽然文件的目录数据被破坏后,无法确定哪个数据簇原本属于哪个文件,但是各种类型的文件都有一定的特征,所以可以依据不同文件类型的数据特征来从数据区直接恢复文件数据。

逻辑分区恢复

数据恢复 还包括分区表和 BPB 的恢复 等内容。
文件管理是通过目录来完成的,而目录是建立在分区基础上的,一个物理磁盘通过分区表划分成为若干个逻辑分区,分区表损坏就不能定位逻辑盘。但是每个分区的开头都有其特征,根据这些特征可以恢复分区表,重新分区后也能找到先前的分区。


Linux 系统的文件删除和恢复

组成 Linux 文件系统的数据通常分为两大部分:文件的信息和文件的数据。

  • 文件的信息包括:超级块、索引节点、目录文件等,被称为元数据
  • 文件的数据:即文件的内容

文件的数据存储在磁盘上的数据块中;
数据块的状态(空闲/已分配)信息存储在数据块位图中;
通过索引文件、目录文件等元数据,文件系统才能将一个或多个数据块中的数据组合成抽象的文件。

Linux 中删除一个文件

① 首先将索引节点文件所占用的数据块的状态信息标记为空闲
② 然后增大目录文件中相应目录项的前一项中记录项长度的值
③ Linux 文件的删除过程中 知识释放了索引节点表和所占用的数据块,只要该数据块没有被覆盖,其数据还是存在于磁盘中的

1. 知道文件内容的文件恢复方法

若不小心删除了某个文件,并且知道该文件的部分内容,首先要停止该文件所在分区上的所有 I/O 操作:可以卸载该分区、或者是系统处于单用户状态。

可以将该文件所在分区以只读方式重新挂载:
mount -o ro -n /dev/hda /mnt

下面假设是 /etc/passwd 被删除了,演示恢复步骤:
① 查看挂载情况
df

② 使用 dd 命令将 /etc/passwd 所在分区进行拷贝到一个文件中
dd if=/dev/xxx of of=/home/test.dsk

③ 使用 cat 命令和 grep 命令来查找 /etc/passwd 文件中所知道的文件内容
cat -n test.dsk | grep "root:x:0:1"

④ 使用 grep -A 命令来查找 “root❌0:1” 该行和后面 10 行的内容,并重定向输出
grep -A 10 "root:x:0:1" test.dsk > passwd

⑤ 这样数据就恢复到了 passwd 文件中

2. 根据文件的类型来恢复文件

文件被删除后,文件内容一直保留在磁盘上知道文件被覆盖为止。一旦文件被删除,被删除文件所在的数据块成为未分配空间的一部分。可以通过在未分配空间中寻找文件头的方法来手工恢复文件

用这种方法必须满足以下 3 个条件:

  • 可以识别文件头信息
  • 文件没有被覆盖
  • 文件是连续存储的,如果文件不是连续存储的,则只能恢复部分文件

假设有一个含有被删除的 .jpg 文件的磁盘映像,演示恢复步骤
① 首先通过查找字符 “JFIF” 来确定每个 .jpg 文件的第一个扇区
(JFIF 是 JPG 文件的标注信息,且 JPG 文件的前三个开始字符是 ffd8ff)

② 假设得出被删除文件的起始扇区地址是 0x5e400;将其转换成 10 进制数为 386048;再除以每个扇区的字节数(假设为 512B),即 386048 / 512 = 754.
则 754 就是该文件的起始扇区号

③ 在大多数情况下不知道被删除文件的确切长度,所以只能猜测。
如果猜少了,则只能恢复部分文件,图像就不完整;
如果猜多了,则依旧可以显示完整的图像。

④ 利用 dd 命令来恢复被删除的文件
dd 命令的输入 if 是我们准备好的 磁盘映像文件输出文件则是要恢复出的图像文件。

指定开始扇区号为 754,文件大小猜测为 15KB(30个扇区)
dd if=image.dd of=recover.jpg skip=754 count=30

你可能感兴趣的:(取证)