磁盘结构
磁盘的结构一般由主引导记录 (MBR)、基本分区和扩展分区组成。其中,主引导记录又可以称为主引导扇区,由引导程序和分区表组成,主引导扇区的最后两个字节为 0x55AA,代表着主引导扇区的结束。
在 MBR 分区表中最多4个主分区或者 3 个主分区+ 1 个扩展分区,也就是说扩展分区只能有一个,然后可以再细分为多个逻辑分区。Windows系统默认情况下,一般都是只划分一个主分区给系统,剩余的部分全部划入扩展分区。
如下图所示,该硬盘被分成了 3 个主分区和 1 个扩展分区。
主引导扇区各组成部分如下图所示,其中,引导程序为 446 字节,分区表共 64 字节。
对于一个采用此种分区结构的硬盘来说,想要得到4个以上的主要分区是不可能的。这里就需要引出扩展分区了。
扩展分区中逻辑驱动器的引导记录是链式的。每一个逻辑分区都有一个和 MBR 结构类似的扩展引导记录(EBR),其分区表的第一项指向该逻辑分区本身的引导扇区,第二项指向下一个逻辑驱动器的 EBR,分区表第三、第四项没有用到。
下面是分区表中的每一表项各字段的含义,其中,最后两个连续的四字节,分别代表相对扇区数和总扇区数,具体含义如下表所示。
磁盘结构分析
首先,打开我的电脑,查看其分盘结构,可以看到其分为一个 C 盘和一个 E 盘
现在利用 WinHex 工具打开物理磁盘,操作步骤为:Tools -> Open Disk -> Physical Media -> HD1(本实验在虚拟机下进行) -> OK
打开后可以看到如下所示内容,其中第一个扇区即主引导扇区,其以 0x55AA 结束。下图中未选中的部分即主引导扇区中的 446 字节的引导程序部分,选中的部分除最后两个字节即主引导扇区中的 64 字节分区表部分。
由上图可知,后两个 16 字节均为 0,说明本电脑只有两个磁盘,因为在 x86 中为小段模式,即高字节存放在高地址中。那么第一个磁盘分区的相对扇区数为 0x800,总扇区数为 0x03C00000,由于通常一个扇区 512 字节,该分区大小为:0x03C00000
∗
*
∗ 512B = 32,212,254,720 B,大约 32 GB;第二个磁盘分区的相对扇区数为 0x03C00800,总扇区数为 0x013FF000,该分区大小为:0x013FF000
∗
*
∗ 512B = 10,735,321,088 B,大约 10 GB。由于每个分区表项中第五个字节代表分区类型,而第一个磁盘分区的第五个字节是 0x07,代表 NTFS 文件系统结构,第二个磁盘分区的第五个字节是 0x0B,代表 FAT32 文件系统结构。
分区类型 | 相对扇区数 | 总扇区数 | |
---|---|---|---|
C盘 | NTFS | 0x800 | 0x03C00000 |
E盘 | FAT32 | 0x03C00800 | 0x013FF000 |
FAT32下逻辑磁盘结构
我们打开我们的 E 盘,其分区类型为 FAT32 文件系统结构,其内容如下所示。
现在利用 WinHex 工具打开逻辑磁盘 E 盘,操作步骤为:Tools -> Open Disk -> Logical Drive Letters -> FAT32(E:) HD1(本实验在虚拟机下进行) -> OK
我们可以看到 00h-02h 为跳转指令,0Bh-0Ch 为一个扇区有多少个字节:0200H = 512 字节,0Dh 为一个簇有多少个扇区:08H = 8 个扇区,1FEH-1FFH 为结束标志:0x55AA.
打开右上角扩展栏,点击根目录,可以看到 E 盘下每个文件的目录项
找到 test.txt 文件的目录项并对其进行分析,其中,0x00 00 为首簇号高位,0x 04 00 为首簇号低位,首簇号为 0x04 = 4,C4 E1 01 00 为文件大小:0x0001E1C4 = 123,332 B 即 大约为 120 KB.
由上面分析得知:每个簇为 8 个扇区, 每个扇区为 512 字节,那么每个簇即 8 ∗ * ∗ 512 = 4096 字节
综上所述,该文件所占 123332 / 4096 = 30.11 即共占了 31 个簇。
打开右上角扩展栏,点击 FAT 1,可以看到 test.txt 的簇链表
其中,test.txt 的首簇号为 4,即 69 00 00 00 处为其首簇,首簇的内容为下一簇的簇号,说明该文件的下一簇号为 0x69
阴影部分加上首簇共 31 个簇,文件簇的最后为 FF FF FF 0F
文件删除的手动恢复
现在对 E 盘下的该文件进行手动删除,右键删除该文件
通过 WinHex 重新找到 test.txt 的目录项在根目录中的位置,可以看到文件名的第一个字节被修改为了 E5,这是文件被删除的一个标志,可以看到通过这种方式文件目录项的其他信息并没有被改变。
我们现在只需要将文件名的第一个字节恢复为 54 即可,操作步骤为:右键 -> edit -> Fill Disk Sectors.
在更改时,会发生如下报错,说明winhex无法在逻辑磁盘更改
现在我们打开物理磁盘,并选择打开分区2
这时,通过root directory找到目录表项,在物理磁盘分区2下将其更改为54,可以发现更改成功
我们打开 E 盘可以看到成功恢复了已经删除了的 test.txt 文件。