【摘要】 本文以信息系统安全为宗旨,以硬盘数据恢复为主线,详细介绍了硬盘分区表、I/O参数块BPB、FAT 表、长文件名等概念,深入浅出,用一个大容量、多分区硬盘遭病毒袭击后通过重新填写分区表成功恢复全部数据的实际例子,验证了文中所介绍的概念和方法的可应用性。
【关键词】信息安全 计算机 硬盘 数据恢复 分区表 FAT表 I/O表 BPB 长文件名
在信息技术作为一个产业蓬勃发展,并为各行各业服务的今天,网络和计算机的信息安全问题已经越来越引人注目地提到日程上来。如所周知,由于计算机病毒以及类似的恶意攻击程序通过数据存储媒介(软盘、数据光盘、优盘等)、互联网电子邮件以及非常领域内的技术手段等途径的肆虐,硬盘数据丢失已成为令企业、学校信息管理人员甚至个人电脑的拥有者头痛的事情。这里所说的硬盘数据丢失,并不是指若干年前由于硬盘存取技术的局限造成盘片磁介质表面的物理损伤(坏道、坏扇区)引起的个别文件丢失,而是由于主引导扇区中的分区表、基本分区I/O表、逻辑分区的引导扇区被改写或者清零,造成系统不能启动,用DOS启动软盘引导后发现有些驱动器的盘符丢失,甚至全部丢失,根本看不到任何盘符的情况。
对于此类硬盘数据丢失的恢复,需要对硬盘的数据结构有较为清晰的了解。本文旨在通过对一例40GB硬盘的数据恢复过程的解读,伴读者走进这个似为神秘的领域,使对硬盘数据结构有一定了解的读者能试着自己动手恢复大量丢失了的硬盘数据。 了解一下硬盘数据丢失的原因,会对查找故障点及解决问题的思路有所帮助。对一块找上门来求助恢复数据的硬盘,如果硬盘的主人对原来的分区情况无法提供有用信息(这在多数情况下是正常的),在什么情况下丢失的也不清楚,则修复起来就会困难一些;如果知道先前有几个分区以及每个分区的大小,甚至能了解数据是在遭受了何种病毒袭击后丢失的,那么针对该病毒特征所做的数据恢复工作就会顺利一些。 造成硬盘数据丢失的原因有以下几种:
- 目标为主引导扇区的计算机病毒袭击(如CIH、POLY BOOT等);
- 恶意攻击程序的破坏;--从实质上讲,恶意攻击程序与计算机病毒没有大的区别,只不过前者的作用范围和具体目标有限,比起后者来,名不见经传而已,但其破坏作用不可小视。
- 使用测试级的硬盘分区工具软件对硬盘做了分区操作;
- 虽然使用了主流分区软件,但在分区或修改分区过程中有误操作;
- 其它(如硬盘对拷时,旧版本拷盘软件对新型大容量硬盘的几何构成参数识别不正确,导致拷贝完成后大容量硬盘的分区表有误)。
图1为某40GB硬盘的分区示意图,它使我们对硬盘的数据结构有一个基本了解。各分区长度为:第一分区 -- 6.32GB;第二分区 -- 6.32GB;第三分区 -- 6.32GB;第一逻辑分区 -- 19.86GB;第二逻辑分区 -- 2.15GB。图中用淡红色标明的扇区(尤以主引导扇区和第一分区引导扇区为最)是易受病毒攻击的扇区。
一.主引导扇区
主引导扇区即主引导记录mbr(Master Boot Record),是硬盘的第一个物理扇区(0柱面,0磁头,1扇区),也就是硬盘的"0"扇区。在它的512个字节中,包括三部分:
- 主引导程序代码,占446字节
- 硬盘分区表HDPT,占用64字节
- 主引导扇区结束标志AA55H
主引导程序代码又称第一关键代码,它的作用是找出系统当前的活动分区,负责把对应的一个操作系统的引导记录即当前活动分区的引导记录载入内存。此后,主引导记录就把控制权转给该分区的引导记录。IBM微型机及其兼容机用DOS的实用程序FDISK分区后,主引导程序代码是通用的。在主引导扇区中,从偏移000H开始到偏移1BEH结束的这446字节内容可以用带参数/mbr的FDISK命令FDISK /mbr重写,除了一并改写分区表之外,不会触及硬盘中其它数据。如果主引导记录被病毒覆盖、清零,或者被某些分区软件(如System Commander Deluxe 4.0)改写,则可以用相应DOS版本的FDISK /mbr命令加以更正。 硬盘分区表分为四小部分,每一小部分表示一个分区的信息,占16字节。这64字节的硬盘分区表又称为主引导扇区上的第二关键代码。在这里我们可以看出,硬盘的总分区数为什么不能大于4。此外,其中可激活分区数不得大于3,扩展分区数不得大于1,当前活动分区数必须等于1。图2为硬盘分区表的结构示意图。从偏移1BEH开始到偏移1FEH结束的64个字节是硬盘分区表。 分区表的每一部分长16字节。第0个字节是自举标志,其值为80H时,表示该分区是当前活动分区,可引导;其值为00H时,表示该分区不可引导。 第4字节是分区类型。如果分区不是NetWare服务器或Linux分区,则两个16进制数各表示不同的含义。左边的16进制数(即8个二进制位中的高4位)只取两个值:0H或1H,为0H时表示此分区为非隐藏分区,为1H时则表示是隐藏分区。右边的16进制数(即8个二进制位中的低4位)表示分区的文件系统格式、类别(是操作系统所在的基本分区还是扩展分区)等信息:取6H则表示是FAT16格式,且大于32MB;取5H表示是DOS扩展分区;取7H表示是NTFS文件格式;取BH表示是FAT32文件格式;取CH表示是FAT32X文件格式;取EH表示是FAT16X文件格式;取FH表示是ExtendedX扩展分区。 每一分区的第1至第3字节是该分区起始地址。其中第1字节为起始磁头号(面号);第2字节的低6位为起始扇区号,高2位则为起始柱面号的高2位;第3字节为起始柱面号的低8位。因此,分区的起始柱面号是用10位二进制数表示的,最大值为210 = 1024,因逻辑柱面号从0开始计,故柱面号的显示最大值为1023。同理,用6位二进制数表示的扇区号不会超过26 - 1 = 63;用8位二进制数表示的磁头号不会超过28 - 1 = 255。 每一分区的第5至第7字节表示分区的终止地址,各字节的释义与第1至第3字节雷同,故不再赘述。这里我们假设一种极端的情况:如果让第5至第7字节的所有二进制位都取1,就获得了柱面号、磁头号和扇区号所能表示的最大值,从而得到最大绝对扇区号为
1024 × 256 × 63 = 16,515,072 这个扇区之前的所有物理扇区所包含的字节数为
16,515,072 × 512Bytes ≈ 8.46×109Bytes = 8.46GB。 那么,容量大于8.46GB的硬盘又该怎么办?由此可见,分区表每一分区的第1至第3字节以及第5至第7字节的数据结构已经不能满足大于8.46GB的大容量硬盘的需要。由此也可知硬盘的容量设计为什么会有8.4GB这一档。由于考虑到向下兼容的需要,业界并未对从DOS时代就如此定义的硬盘分区表提出更改意见,否则改动所牵涉的面太广,会造成硬件和软件发展上的一个断层,几乎无法被业界和用户所接受。硬盘厂商解决这一问题的方法是定义了新的INT 13服务扩展标准。新的INT 13服务扩展标准不再使用操作系统的寄存器传递硬盘的寻址参数,而使用存储在操作系统内存里的地址包。地址包里保存的是64位LBA地址,如果硬盘支持LBA寻址,就把低28位直接传递给ATA接口,如果不支持,操作系统就先把LBA地址转换为CHS地址,再传递给ATA接口。通过这种方式,能实现在ATA总线基础上CHS寻址的最大容量是136.9 GB,而LBA寻址的最大容量是137.4GB。新的硬盘传输规范ATA 133规范又把28位可用的寄存器空间提高到48位,从而支持更大的硬盘。 分区表每一分区的第8至第11字节表示该分区的起始相对扇区号(即该扇区之前的绝对扇区个数),高位在右,低位在左;第12至第15字节表示该分区的实际占用扇区数,也是高位在右,低位在左。我们知道,分区表这类数据结构的图示表达方式与机器中数据的实际存储方式在顺序上是一致的,即低位在前,高位在后。然而人类的数据读写习惯却恰恰相反,是高位在前(左),低位在后(右)。因此,在目读分区表或类似结构的字段,并且从16进制向十进制作数值转换时,需将字段中的16进制数以字节为单位翻转调位。 主引导扇区的第三关键代码是本扇区的最后两个字节(偏移1FEH和偏移1FFH),其值为AA55H,它表示该扇区是个有效的引导扇区,可用来引导硬磁盘系统。
二.基本分区(Primary Partition)和基本分区的引导扇区
从主引导扇区分区表4x16字节的结构可以看出,如果有一个16字节所表示的分区留给扩展分区使用的话,那么基本分区(以下简称分区)最多允许有三个。每个有效分区包括三部分(FAT16、FAT12分区则包括四部分): 1) 分区引导扇区 2) 文件分配表(File Allocation Table) 3) 根目录区(FAT32分区没有界限分明的根目录区) 4) 数据区 分区引导扇区位于分区的第一扇区。当分区被激活为当前活动分区时,则由前面提到的主引导记录把分区引导扇区的引导程序载入内存,并把控制权转交给分区引导程序。 分区引导扇区的前三个字节是一条跳转指令,然后是8个字节长的OEM ID(厂家标识)和版本号,其后是简称为BPB的BIOS参数块(BIOS Parameter Block)。虽然BPB的总长度在过去若干年随着硬盘存取技术的发展不断增加,而且为了留给未来后续内容的扩展而未加定义,但表1所涉及到的前64个字节的内容是确定了的。BPB以非对齐的紧凑格式储存。表1列出了BPB中每个字段的字节偏移、长度和含义。
表1 BPB中每个字段的字节偏移、长度和含义
字段含义 |
偏移 |
长度 (字节) |
注解 |
十进制 |
十六进制 |
每扇区字节数 |
11 |
0BH |
2 |
常取512 |
每簇扇区数 |
13 |
0DH |
1 |
可以是1, 2, 4, 8, 16, 32, 64, 128,取决于文件系统格式及分区大小 |
保留扇区数 |
14 |
0EH |
2 |
FAT32时多为32,FAT16时为1 |
FAT表个数 |
16 |
10H |
1 |
常取2 |
根目录项数 |
17 |
11H |
2 |
一般取512,FAT32时置零(表示根目录项数无限制) |
分区占用扇区数 |
19 |
13H |
2 |
适用于小容量磁盘(分区<32MB),大于32MB时置零 |
介质描述符 |
21 |
15H |
1 |
对固定硬盘取F8 |
每FAT表扇区数 |
22 |
16H |
2 |
用于FAT16等,FAT32时置零 |
每磁道扇区数 |
24 |
18H |
2 |
取决于格式化后的硬盘在使用中的几何构成 |
磁头数 |
26 |
1AH |
2 |
分区起始扇区号 |
28 |
1CH |
4 |
即分区起始扇区之前的绝对物理扇区数 |
分区占用扇区数 |
32 |
20H |
4 |
自偏移13H开始的2个字节置零,则本字段数据有效 |
每FAT表扇区数 |
36 |
24H |
4 |
自偏移16H开始的2个字节置零,则本字段数据有效 |
FAT表同步标识 |
40 |
28H |
2 |
最左端二进制位为零则所有FAT表是同步的,为1则有损坏的FAT表。低4位表示在用的FAT表编号,从零开始计。 |
文件系统版本 |
42 |
2AH |
2 |
文件系统格式版本号。 |
仅用于FAT32文件系统格式 |
根目录起始簇 |
44 |
2CH |
4 |
根目录起始簇之簇号 |
文件系统信息扇区 |
48 |
30H |
2 |
存放文件系统格式信息的扇区号 |
引导扇区备份 |
50 |
32H |
2 |
引导扇区备份所在的扇区号 |
保留 |
52 |
34H |
12 |
用于未来待添加的内容 | 读者已经可以看出,出于FAT32格式是目前最普遍使用的文件系统格式,表1的后半部分是按照FAT32格式给出字段释义的。其中偏移2AH处2字节表示文件系统格式版本号。高4位表示主版本号,低4位表示次版本号,对于Windows95 OSR2及以后的操作系统则双双置零。FAT32的根目录与其它子目录一样,是以簇链的方式存储的,这意味着它可以需要多大就可以多大,对项数无限制。根目录起始簇的簇号至少为2。
偏移(十六进制) |
字段长度(字节) |
定义 |
00H |
4 |
标识码,值为41615252H |
1E4H |
4 |
标识码,值为61417272H |
1E8H |
4 |
尚未占用的簇数,若不明,则为-1 |
1ECH |
4 |
最近分配的簇数 |
1F0H |
12 |
保留 |
1EFH |
2 |
扇区结束标志AA55H | | 对FAT32格式而言,文件系统信息扇区是个新扇区,其结构如左边的表。表中除标明字段之外的所有其它字段均置零。每个FAT32分区至少应该有一个这样的文件系统信息扇区,且寓于保留扇区范围内,还不能与引导扇区备份所在的扇区重叠。一般情况下,文件系统信息扇区紧随分区引导扇区之后,故其相对扇区号为1。 从偏移36开始,对不同的文件系统格式,表1有不同的内容。前面已经给出了适用于FAT32格式的内容。表1中前36个字节曾被称为标准BPB。既有此说,其后的部分就可称为扩展BPB了。表1-a给出了扩展BPB适用于FAT16、FAT12格式的内容。
表1-a BPB自偏移24H开始适用FAT16格式的字段释义
字段含义 |
偏移 |
长度(字节) |
注解 |
十进制 |
十六进制 |
物理驱动器号 |
36 |
24H |
1 |
中断13呼叫的预设值,指明访问的设备。软盘为00H,硬盘为80H |
仅用于FAT16文件系统格式 |
标识 |
38 |
26H |
1 |
扩展引导记录标识,值为28H或29H |
识别码 |
39 |
27H |
4 |
格式化时赋予的随机序列号 |
卷标 |
43 |
2BH |
11 |
分区名称,格式化时人工赋值 |
文件系统识别码 |
54 |
36H |
8 |
除NTFS格式外,值为FAT16或FAT12 | 对于FAT16可引导分区,BPB之后从偏移40H开始是可执行引导程序。它将完成任何必要步骤以继续引导过程。换句话说,从第65字节开始的内容与分区信息的定义与描述无关。但对FAT32可引导分区来说,BPB并没有在第64字节终止,它在偏移40H之后的几个分区信息字段的描述如表1-b所示。
表1-b BPB自偏移40H开始适用FAT32格式的字段释义
字段含义 |
偏移 |
长度(字节) |
注解 |
十进制 |
十六进制 |
物理驱动器号 |
64 |
40H |
1 |
中断13呼叫的预设值,指明访问的设备。软盘为00H,硬盘为80H |
仅用于FAT32文件系统格式 |
当前磁头 |
65 |
41H |
1 |
用于中断13呼叫 |
标识 |
66 |
42H |
1 |
扩展引导记录标识,值为28H或29H |
识别码 |
67 |
43H |
4 |
格式化时赋予的随机序列号 |
卷标 |
71 |
47H |
11 |
分区名称,格式化时人工赋值 |
文件系统识别码 |
82 |
52H |
8 |
除NTFS格式外,值为FAT32 | 图1中的三个基本分区都用了FAT32文件格式。第一分区大小为6.32GB,安装了Windows2000 Pro;第二分区为6.32GB,安装了Windows95 OSR2;第三分区为6.32GB,安装了Windows98 SE。对于FAT32格式,从BPB的第29字节开始,对硬盘数据恢复具有实际意义的重要信息见表2。之所以把表2从表1中节选出来,是由于病毒和恶意程序常以这些字段为袭击对象。
表2 BPB中重要信息字段的字节偏移、长度和含义(FAT32格式)
字段含义 |
偏移 |
长度(字节) |
注解 |
十进制 |
十六进制 |
分区起始扇区号 |
28 |
1CH |
4 |
即起始扇区之前的绝对物理扇区数 |
分区占用扇区数 |
32 |
20H |
4 |
字段数据有效的前提是BPB中从偏移13H开始的2个字节置零 |
每FAT表扇区数 |
36 |
24H |
4 |
字段数据有效的前提是BPB中从偏移16H开始的2个字节置零 |
三.文件分配表(以下简称FAT表)
FAT是DOS、Windows 9X系统的文件寻址格式。在解释文件分配表的概念的时候,我们有必要谈谈簇(Cluster)的概念。文件占用磁盘空间,基本单位不是字节而是簇。分区中只有数据区才划分为簇,其余部分只划分为扇区。一般情况下,软盘数据区每簇是1个扇区,硬盘数据区每簇的扇区数与分区的格式和总容量大小有关,可能是4、8、16、32、64和128。小文件可能放不满一个簇,它占用的簇既是它的开始簇又是它的结束簇,而大文件却可能占用岂止几百上千个簇。同一个文件的数据并不一定完整地存放在磁盘的一个连续的区域内,而往往会分成若干段,像一条链子一样存放。这种存储方式称为文件的链式存储。由于FAT表保存着文件段与段之间的连接信息,所以操作系统在读取文件时,总是能够准确地找到文件各段的位置并正确读出。为了实现文件的链式存储,硬盘上必须准确地记录哪些簇已经被文件占用,还必须为每个已经占用的簇指明存储后续内容的下一个簇的簇号。对一个文件的最后一簇,则要指明本簇无后续簇。这些都是由FAT表来保存的。表中有很多表项,每项记录一个簇的信息。初形成的FAT中所有项都标明为"未占用",但如果磁盘有局部损坏,那么格式化程序会检测出损坏的簇,在相应的项中标为"坏簇",以后存文件时就不会再使用这个簇了。FAT的项数与数据区的总簇数相当,每一项占用的字节数也要能存放得下最大的簇号。FAT的格式有多种,最为常见的是FAT16和FAT32。FAT表的表项被赋予不同值时所表示的含义见表3。 如上述,文件分配表存放着分区内以簇(Cluster)为单位的存储空间的使用情况。簇是数据区中文件存放的基本单位,一个簇只能被一个文件所占用,而不可能同时属于两个以上的文件。分区有多少个簇,FAT表中就应该有对应的多少项。有些引导区型病毒把FAT表中未分配的簇大量地标记为物理坏簇,使人误以为盘片表面被划伤了。对于此种情况,需要把病毒已标记为坏簇的磁盘空间改写成未分配簇。 由于FAT对于文件管理的重要性,所以为了安全起见,FAT有一个备份,即在原FAT的后面再建一个同样的FAT。对一个分区而言,无论它是基本分区还是扩展分区中的逻辑分区,都有两个相同的、前后顺序排列的FAT表,后面的一个作为前面一个的备份。如果第一FAT表被病毒改写,可以实施的简便方法是:用第二FAT表的相应扇区(或全部扇区)覆盖第一FAT表被破坏的扇区(或全部扇区),以挽救分区数据。 FAT16分区的FAT表每项为2字节,FAT32分区的FAT表每项为4字节。其值用下式计算:
FAT表项数 = 数据区簇数 = 数据区字节总数 / 每簇字节数
每项字节数 = FAT表扇区数 * 512 / FAT表项数
表3 FAT表表项赋予不同值时的含义
FAT16分区 |
FAT32分区 |
对应簇的描述 |
0000H |
00000000H |
未占用 |
0002H~FFF6H |
00000002H~0FFFFFF6H |
已占用,而且其值为存储文件后续内容的下一个簇的簇号 |
0001H |
00000001H |
保留 |
FFF7H |
0FFFFFF7H |
坏簇 |
FFF8H~FFFFH |
0FFFFFF8H~0FFFFFFFH |
已占用,而且是文件结束簇 | FAT表的头两项为系统所保留,第一项的第一个字节是磁盘规格说明,对于固定硬盘应为F8。从第三项开始与数据区的簇一一对应,即第三项与数据区第一个簇相对应,第四项与数据区第二个簇相对应,… 依此类推。
四.根目录区
FAT16、FAT12分区的根目录区位于第二个FAT表之后,记录着根目录下每个文件或目录在数据区的起始簇,文件的属性等。定位文件位置时,操作系统根据根目录中的起始簇,结合FAT表就可以知道文件在数据区中的具体位置和大小了。根目录区扇区数用下式计算:
根目录区扇区数 = 根目录项数 * 32 / 每扇区字节数
FAT32分区的根目录项数在FAT表中置零,代入上式则根目录区扇区数也为零,这恰好与前面所提到的情况相符,即FAT32分区没有界限分明的根目录区。这是由于FAT32的根目录与其它子目录一样,是以簇链的方式在数据区存储的,所以在FAT32分区里是找不到单独的根目录区的,它已经和数据区合为一体。根目录起始扇区号用下式计算:
根目录起始扇区号 =((根目录起始簇号-2)* 每簇扇区数)+ 数据区起始扇区号
五.数据区
数据区是真正意义上的数据存储的地方,位于FAT16、FAT12分区的根目录区之后,或FAT32分区的FAT表之后,占据硬盘大部分空间。当将数据复制到硬盘时,数据就存放在数据区。 为了实现文件一级的硬盘数据恢复,我们有必要关注一下FAT文件系统的目录和长文件名。 除了FAT16、FAT12的根目录之外,所有的目录实际上与文件一样,都是以簇链的方式存储的。文件的实际大小记录在它所归属的目录结构里。但目录所占用的字节数却没有什么地方可以记录。目录总是被当作由多个簇组成来对待。当一个新条目(下级子目录或文件的产生)加入时,目录就要扩展,而且目录总是充满的。但FAT16、FAT12的根目录是例外,它们的大小是不能扩展的,在分区被格式化时就确定了。每个目录划分为小结构,称为目录项。每个目录项恰好32字节长,存储着目录所含文件或下级子目录的名称、属性、长度、日期、时间和起始簇号。 FAT文件系统在长文件名方面的扩展又称虚拟FAT(VFAT)。由虚拟FAT支持的长文件名存储在它的缩略文件名目录项之前的一个或几个目录项中。长文件名占用的目录项用旧版本的DOS工具软件是看不到的,因为它使用了在旧版本看来是非法的属性值。长文件名以UNICODE格式储存。UNICODE是ASCII的16位变形,每个UNICODE字符看起来就像是一个ASCII字符后面再跟上一个空字节。每个长文件名目录项最多可以存放13个UNICODE字符。如果长文件名比13字符还要长,就会有新的目录项加入到目录中来用于存放长文件名的其余部分。应该注意长文件名是逆序存放的,它的第一部分占用的目录项刚好在它的缩略文件名目录项之前。表4为正常文件名目录项格式。表5为被长文件名占用的目录项格式。
表4 文件名目录项格式
长度 |
说明 |
8字节 |
空格被压缩的文件名。 第一字节为下列各值之一时表示特别含义: 00H - 目录项未占用,且此项之前没有被占用的目录项 05H - 第一个字符实际上是E5H 2EH - 第一个字符是点号。该目录项是个特殊目录项,不是点号目录项就是双点号目录项,出现在除根目录之外的所有目录中。点号目录项有一个簇号,指向该目录本身。双点号目录项有一个簇号,指向该目录的上一级目录(或为空,如果上一级目录是根目录)。 E5H - 目录项已被删除,未占用。 |
3字节 |
空格被压缩的扩展名。 |
1字节 |
属性。 - 该字段用二进制数释义。只使用第0-4位,第5-7位保留。注意如果字段值为0FH,则表示该目录项是被长文件名占用的目录项。0FH在旧DOS版本中是非法属性值。 00001b - 只读目录或文件 00010b - 系统目录或文件 00100b - 隐藏目录或文件 01000b - 卷 10000b - 目录 |
1字节 |
保留 |
1字节 |
创建时间以0.01秒为单位的精确尾数 |
1字(双字节) |
创建时间 |
1字 |
创建日期 |
1字 |
最后访问日期 |
1字 |
(簇号+2)的高16位(用于FAT32) |
1字 |
最后更新时间(创建时也赋值) |
1字 |
最后更新日期(创建时也赋值) |
1字 |
(簇号+2)的低16位 |
1双字(4字节) |
文件的字节数(若是目录则为零) | 簇号从1开始计数。簇号为零的文件通常字节数也是零,表明它只作为文件名目录项存在,在数据区中没有文件实体所占用的簇。凡是字节数为零的空文件都属于这种情况。 时间和日期用下列紧凑格式存储:
表4-a 时间的紧凑格式
小时 |
分钟 |
秒/2 |
5个二进制位 |
6个二进制位 |
5个二进制位 |
11-15 |
5-10 |
0-4 | |
|
表4-b 日期的紧凑格式
年(+1980) |
月 |
日 |
7个二进制位 |
4个二进制位 |
5个二进制位 |
9-15 |
5-8 |
0-4 | |
表5 被长文件名占用的目录项格式
长度 |
说明 |
1字节 |
长文件名记录的序列号。 第0-5位保持着用6个二进制位表示的序列号(1-63)。注意这个数字从1开始计。它把被每个长文件名占用的目录项的数目限制到63。也就是说,长文件名字符数最多不超过63*13=819 |
10字节 |
5 个UNICODE 字符, 长文件名的第一部分。 |
1字节 |
属性。 - 该字段值为0FH,表示该目录项是被长文件名占用的目录项。 |
1字节 |
保留 |
1字节 |
对缩略文件名的所有字符求校验和,以验证该长文件名目录项属于其后缩略文件名目录项 |
12字节 |
6 个UNICODE 字符, 长文件名的第二部分。 |
1字(双字节) |
起始簇号,对长文件名目录项而言永为零。 |
4字节 |
2 个UNICODE 字符, 长文件名的第三部分。 | 六.数据恢复实例
配置了40.98GB Maxtor硬盘的某台用电话线拨号上网的非局域网台式机在接收完电子邮件后,打开一封只有标题却无正文的电子邮件时出现黑屏。重新启动后硬盘不能引导,无法进入系统。用DOS软盘引导后,硬盘所有盘符尽失,什么都见不到。用FDISK命令查看硬盘信息时,回答是“未定义任何分区”。用DOS版的硬盘分区软件PQMagic6.0查看硬盘各分区时,硬盘以一整条暗灰色长条标识出来,没有任何分区,给出的文字信息是“Unallocated”,意为未分配存储单元的原始硬盘。 这种情况给人造成硬盘数据全部毁坏的初步印象。但推敲起来,未必如此。硬盘数据被病毒或恶意程序所毁,这是肯定的。病毒是由电子邮件携带进来的,这也是肯定的。是哪一种病毒呢?没法确定。盘符找不到,扫描病毒就无从谈起。如果病毒的袭击目标真是40GB硬盘每一个扇区的数据的话,对于CPU为1GHz的计算机而言,没有8~10分钟的时间是完不成的。而病毒发作时只是黑屏死机,对硬盘的长时间读写并没有发生,这从硬盘指示灯在黑屏时没有长时间闪亮,也没有产生持续的硬盘读写噪声可以判断出来。因此,硬盘数据全部遭到破坏的可能性基本上可以排除。既然数据尚安在但没法读出来,就没有不挽救的道理。从全部盘符都看不到的故障现象分析,最大的可能是病毒袭击了硬盘的主引导扇区。如果病毒只是袭击了某个分区的引导扇区或FAT表,只可能导致该分区不能引导或该分区某些文件丢失,其余的分区仍然可以引导,扩展分区中两个逻辑驱动器的盘符也应该能看得到。 既然作出了主引导扇区可能被毁的判断,其余的事情就是寻找硬盘数据修复工具。在比较了几款可在DOS环境下对磁盘做编辑工作的工具软件后,笔者以为KV3000计算机杀毒工具的F6(硬盘救护箱)功能是不错的选择,用起来比较顺手。你要做的看起来烦琐的事,它几乎都能帮上忙。恢复工作使用了KV3000的V65版,现在KV3000已经发布了V71版。 用KV3000杀毒软盘引导后(该盘有建立Win98 DOS环境足够的系统文件,相当于DOS7.10),键入KV3000然后按Enter键,就进入KV3000主界面。再按F6键,就可以见到0柱(磁道)0面(磁头)1扇区,即主引导扇区的数据结构排列。所看到的主引导扇区数据同对故障的判断果然相吻合:主引导扇区全部被清零了。 由于事先没有做过硬盘主引导扇区或任何一个分区引导扇区的备份,所以只能用人工填写的方法恢复主引导扇区数据。 前面已经提到过,主引导扇区有三个关键代码,其中第一关键代码是主引导记录程序代码,位于该扇区前446个字节,可以用带参数的命令FDISK/mbr重写。于是退出KV3000,软驱内换上Win98启动盘,键入FDISK/mbr。然后软驱内换回KV3000杀毒软盘,重新察看主引导扇区内容,发现第一关键代码(主引导程序代码)已经重新写过,第三关键代码(主引导记录结束标志)也已经正确恢复。但是,由于FDISK不支持多操作系统分区,也就是不支持多个基本分区,所以它写出的第二关键代码(硬盘分区表)与硬盘原有的分区情况不符。硬盘原有三个基本分区,扩展分区中还有两个逻辑分区,可是现在的分区表(见图3)只有一个8.4GB的基本分区,没有扩展分区。显然,用这样的分区表是不能正确引导图1所示硬盘的。用人工填写的方法恢复硬盘分区表已无法避免。虽然我们事先知道每个分区大小的粗略值,但却不知道精确值。换句话说,我们不知道每个分区的起始扇区号和它所占用的扇区数。而准确无误地填写分区表的每一个值对恢复全部硬盘数据都是至关重要的。
图3 用FDISK/mbr命令写出的硬盘分区表 从第一分区开始,逐个分区地填写分区信息字段,直至记录结束标志AA55H之前扩展分区的最后一个信息字段填写完毕为止。 按F2键,察看第一分区引导扇区的BPB,从中获取应填入主引导扇区分区表的参考信息。第一分区引导扇区从偏移11开始到偏移90结束的BPB各字段信息如图4所示。
图4 第一分区引导扇区BPB各字段信息 从图4可以看出,从偏移17至偏移19、从偏移19至偏移21、从偏移22至偏移24的这几个字段都被置零,说明该分区的文件格式是FAT32。从偏移28至偏移32的分区起始扇区号3F000000翻转调位后是3FH,转换为十进制是63。从偏移32至偏移36的分区占用扇区数8281BC00翻转调位后是BC8182H,转换为十进制是12353922。系统隐藏扇区数通常为63,分区占用扇区数12353922转换成以字节为单位的长度则是12353922*512=6.32GB。这两个数字是正确的,说明第一分区引导扇区没有受到病毒攻击。将3F000000填入分区表第1部分的第8至第11字节(分区起始扇区号),8281BC00填入分区表第1部分的第12至第15字节(分区占用扇区数)。硬盘数据被破坏之前究竟哪一个分区是活动分区已经不重要,我们假设第一分区是活动分区,因此分区表第1部分第0字节填入80。因为是FAT32格式,而且又是活动分区,所以分区表第1部分的第4字节应填写"0B"。
接下来是第1~3字节(分区起始地址)和第5~7字节(分区终止地址)的填写。起始地址就是分区引导扇区,位于0柱(磁道)1面(磁头)1扇区。第1字节是磁头号,故应填入01。第2、3两个字节填入值的确定如图5所示。因为扇区号是1,故第2字节的低6位应为000001b。因为用10位二进制数表示的柱面号为零,故第2字节的高2位和第3字节的8个二进制位均应为0。这样,由图5可以看到的结果是:第2字节应填写的十六进制数为01H,第3字节为00H。 分区终止地址的(绝对)扇区号为起始地址扇区号与分区占用扇区数之和减1,即
63 + 12353922 - 1 = 12353984。它的柱面号以下式计算:
C = N \(Sm *(Hm + 1)) ……… (1) 式中C为柱面号,N为从零开始计的绝对扇区号,Sm为最大扇区号,Hm为最大磁头号,符号"\"的含义是整除,若人工计算,则符号两端相除后略去小数部分取整。磁头号以下式计算:
H =(N - C * Sm *(Hm + 1))\ Sm ……… (2) 式中H为磁头号。扇区号以下式计算:
S = N - C * Sm *(Hm + 1)- H * Sm + 1 ……… (3) 式中S为扇区号。以上三式中最大扇区号Sm和最大磁头号Hm是硬盘几何构成参数。用Norton Utilities DOS 8.0的磁盘编辑工具测得硬盘参数(过程略)为: 扇区号范围 1~63;磁头号范围 0~254;柱面号范围 0~4980。
将绝对扇区号12353984、最大扇区号Sm = 63和最大磁头号Hm = 254代入以上三式,得C = 768,H = 254,S = 63。把磁头号254转换为十六进制数FEH,填入第5字节。第6、7字节的填写方法与第2、3字节类似,如图6所示。因为扇区号是63,故第6字节的低6位应为111111b。因为用10位二进制数表示的柱面号为768,转换为二进制数为1100000000b,故第6字节的高2位为11b,第7字节的8个二进制位均应为0。这样,由图6可以看到的结果是:第6字节应填写的十六进制数为FFH,第7字节为00H。 至此,分区表的第一部分填写完毕,如图7所示。
图7 填写完毕的分区表第一分区信息(下划黄线部分) 第二分区起始扇区就是该分区引导扇区,它紧跟在第一分区终止扇区后面。故第二分区引导扇区号为
12353984 + 1 = 12353985。 按F3键,输入12353985,按Enter键显示第二分区引导扇区,察看它的BPB,从中获取应填入分区表第二部分的参考信息。第二分区引导扇区从偏移11开始到偏移90结束的BPB各字段信息如图8所示。
图8 第二分区引导扇区BPB各字段信息 从图8可以看出,从偏移17至偏移19、从偏移19至偏移21、从偏移22至偏移24的这几个字段都被置零,说明该分区的文件格式是FAT32。从偏移28至偏移32的分区起始扇区号C181BC00翻转调位后是BC81C1H,转换为十进制是12353985。从偏移32至偏移36的分区占用扇区数也是C181BC00,所以转换为十进制数也是12353985。扇区数12353985转换成以字节为单位的长度则是12353985*512=6.32GB。这两个数字是正确的,表明第二分区长度略长于第一分区,紧随第一分区之后。看来第二分区引导扇区也没有受到病毒攻击。将C181BC00分别填入分区表第2部分的第8至第11字节(分区起始扇区号)和第12至第15字节(分区占用扇区数)。在填写分区表第一部分时已经把第一分区设为活动分区,因此分区表第2部分第0字节应填入00,表明是非活动分区。在多操作系统共存的硬盘上,非活动分区通常是隐藏的,以免被误删系统文件。因为是FAT32格式,而且又是隐藏分区,所以分区表第2部分的第4字节应填写"1B"。
接下来又是第1~3字节(分区起始地址)和第5~7字节(分区终止地址)的填写。起始地址就是分区引导扇区,扇区号为12353985。将此值及硬盘几何构成参数Hm、Sm代入式(1)、(2)、(3),得到起始地址的柱面号C = 769,磁头号H = 0,扇区号S = 1。第1字节是磁头号,故应填入00。第2、3两个字节填入值的确定如图9所示。因为扇区号是1,故第2字节的低6位应为000001b。因为用10位二进制数表示的柱面号为769,转换为二进制数为1100000001b,故第2字节的高2位应为11b,第3字节为00000001b。这样,由图9可以看到的结果是:第2字节应填写的十六进制数为C1H,第3字节为01H。 分区终止地址的扇区号为起始地址扇区号与分区占用扇区数之和减1,即
12353985 + 12353985 - 1 = 24707969。
将此值及硬盘几何构成参数Hm、Sm代入式(1)、(2)、(3),得到终止地址的柱面号C = 1537,磁头号H = 254,扇区号S = 63。把磁头号254转换为十六进制数FEH,填入第5字节。第6、7两个字节填入值的确定如图10所示。因为扇区号是63,故第6字节的低6位应为111111b。因为用10位二进制数表示的柱面号为1537,大于10位二进制数所能表示的最大值1023(前面提到的8.46GB以上的硬盘分区表空间不够用的问题开始发生了),为了不使各类硬盘校验程序在这里产生误判,对长于10位的二进制字串用截位填入的方法显然不妥当。我们按照10位二进制数的最大值1023填入,也就是1111111111b。故第6字节的高2位应为11b,第7字节为11111111b。这样,由图10可以看到的结果是:第6字节应填写的十六进制数为FFH,第7字节为FFH。 至此,分区表的第二部分填写完毕,如图11所示。
图11 填写完毕的分区表第二分区信息(下划黄线部分) 第三分区起始扇区就是该分区引导扇区,它紧跟在第二分区终止扇区后面。故第三分区引导扇区号为
24707969 + 1 = 24707970。 按F3键,输入24707970,按Enter键显示第三分区引导扇区,察看它的BPB,从中获取应填入分区表第三部分的参考信息。第三分区引导扇区从偏移11开始到偏移90结束的BPB各字段信息如图12所示。
图12 第三分区引导扇区BPB各字段信息 从图12可以看出,从偏移17至偏移19、从偏移19至偏移21、从偏移22至偏移24的这几个字段都被置零,说明该分区的文件格式是FAT32。从偏移28至偏移32的分区起始扇区号82037901翻转调位后是01790382H,转换为十进制是24707970,恰恰是引导扇区号。从偏移32至偏移36的分区占用扇区数是C181BC00,翻转调位后是BC81C1H,转换为十进制数是12353985。扇区数12353985转换成以字节为单位的长度则是12353985*512=6.32GB。这两个数字是正确的,表明第三分区与第二分区长度相等,并且紧随第二分区之后。看来病毒同样没有光顾第三分区引导扇区。将82037901填入分区表第3部分的第8至第11字节(分区起始扇区号),将C181BC00填入第12至第15字节(分区占用扇区数)。在填写分区表第一部分时已经把第一分区设为活动分区,因此分区表第3部分第0字节应填入00,表明是非活动分区。前面已经讲过,非活动分区通常是隐藏的。因为是FAT32格式,而且又是隐藏分区,所以分区表第3部分的第4字节应填写"1B"。
接下来又是第1~3字节(分区起始地址)和第5~7字节(分区终止地址)的填写。起始地址就是分区引导扇区,扇区号为24707970。将此值及硬盘几何构成参数Hm、Sm代入式(1)、(2)、(3),得到起始地址的柱面号C = 1538,磁头号H = 0,扇区号S = 1。第1字节是磁头号,故应填入00。第2、3两个字节填入值的确定如图13所示。因为扇区号是1,故第2字节的低6位应为000001b。因为用10位二进制数表示的柱面号为1538,大于10位二进制数所能表示的最大值1023(仍然是前面提到的8.46GB以上的硬盘分区表空间不够用的问题),为了不使各类硬盘校验程序在这里产生误判,对长于10位的二进制字串不采用截位填入的方法,而是按照10位二进制数的最大值1023填入,也就是1111111111b。故第2字节的高2位应为11b,第3字节为11111111b。这样,由图13可以看到的结果是:第2字节应填写的十六进制数为C1H,第3字节为FFH。 分区终止地址的扇区号为起始地址扇区号与分区占用扇区数之和减1,即
24707970 + 12353985 - 1 = 37061954。
将此值及硬盘几何构成参数Hm、Sm代入式(1)、(2)、(3),得到终止地址的柱面号C = 2306,磁头号H = 254,扇区号S = 63。把磁头号254转换为十六进制数FEH,填入第5字节。第6、7两个字节填入值的确定如图14所示。因为扇区号是63,故第6字节的低6位应为111111b。因为用10位二进制数表示的柱面号为2306,大于10位二进制数所能表示的最大值1023(仍然是前面提到的8.46GB以上的硬盘分区表空间不够用的问题),为了不至于让各类硬盘校验程序在这里产生误判,对长于10位的二进制字串不采用截位填入的方法,而是按照10位二进制数的最大值1023填入,也就是1111111111b。故第6字节的高2位应为11b,第7字节为11111111b。这样,由图14可以看到的结果是:第6字节应填写的十六进制数为FFH,第7字节为FFH。 至此,分区表的第三部分填写完毕,如图15所示。
图15 填写完毕的分区表第三分区信息(下划黄线部分) 分区表的第四部分是扩展分区信息。扩展分区的起始扇区里有扩展分区自己的分区表,其结构与主引导扇区里的硬盘分区表类似,用来描述扩展分区中逻辑分区的信息。所不同的是,逻辑分区的起始扇区号不像基本分区那样,取起始扇区的绝对扇区号(从硬盘第0扇区开始计数),而是从扩展分区的起始扇区开始计数(以起始扇区为第0扇区)。 从图1的硬盘分区示意图可以看出,扩展分区应该紧随第三分区之后,所以它的起始扇区号应该是第三分区终止扇区号加1:
37061954 + 1 = 37061955 按F3键,输入37061955,按Enter键显示该扇区。首先需要判断这个扇区是不是扩展分区的起始扇区。从偏移446开始,我们找到了与硬盘分区表类似的结构,如图16所示。
图16 扩展分区的分区表 为了验证这个有类似分区表数据结构的扇区确实是扩展分区起始扇区,我们首先假设它是起始扇区,然后到它所指明的两个逻辑分区(分别为下划黄线和下划红线的部分)的引导扇区中去,用引导扇区BPB的关键字段信息反过来验证它的正确性。图16下划黄线的部分是第一逻辑分区,它的第0字节为00H,表明是非活动分区;第4字节是0B,表明是非隐藏分区,FAT32格式。第8~11字节为3F000000,翻转调位后是3FH,转换为十进制数是63,是第一逻辑分区起始扇区在扩展分区内的相对扇区号。第12~15字节AFBF4F02翻转调位后是024FBFAFH,转换成十进制数是38780847,是第一逻辑分区占用的扇区数。下划红线的部分是第二逻辑分区,它的第0字节为00H,表明是非活动分区;第4字节是05,表明是非隐藏分区,FAT16格式。第8~11字节为EEBF4F02,翻转调位后是024FBFEEH,转换为十进制数是38780910,是第二逻辑分区起始扇区在扩展分区内的相对扇区号。第12~15字节C5FA3F00翻转调位后是003FFAC5H,转换成十进制数是4192965,是第二逻辑分区占用的扇区数。 然后到扩展分区分区表所指明的第一逻辑分区的引导扇区去察看BPB。BPB中的第一逻辑分区起始扇区号及占用扇区数与扩展分区分区表中的相应同义字段应该是互相验证的。也就是说,如果这两个扇区中的相应同义字段的值相等,就验证了扩展分区起始扇区的正确性。按照扩展分区分区表所指,第一逻辑分区的引导扇区号是
37061955 + 63 = 37062018 按F3键,输入37062018,按Enter键显示第一逻辑分区引导扇区,果然看到与BPB相仿的结构。察看它的BPB,从中获取为验证扩展分区起始扇区的正确性所必需的信息。第一逻辑分区引导扇区从偏移11开始到偏移90结束的BPB各字段信息如图17所示。
图17 第一逻辑分区引导扇区BPB各字段信息 从图17可以看出,从偏移17至偏移19、从偏移19至偏移21、从偏移22至偏移24的这几个字段都被置零,说明该分区的文件格式是FAT32,与图1所示第一逻辑分区文件格式相符。从偏移28至偏移32的分区起始扇区号82853502翻转调位后是02358582H,转换为十进制是37062018,恰恰是第一逻辑分区的引导扇区号。从偏移32至偏移36的分区占用扇区数是AFBF4F02,翻转调位后是024FBFAFH,转换为十进制数是38780847,由此计算以字节为单位的分区长度则是38780847*512=19.86GB,符合图1所示第一逻辑分区的长度。这两个数字之正确,使扩展分区起始扇区与第一逻辑分区引导扇区相互验证了正确性。 为填写分区表扩展分区部分所需的信息已经足够,我们回到主引导扇区分区表第四部分。扩展分区不能是活动分区,故第0字节应填00H。扩展分区不是隐藏分区,而且包含FAT32逻辑分区,属于ExtendedX类型,故第4字节应填0F。将扩展分区起始扇区号37061955转换成十六进制数02358543H,翻转调位后是43853502,填入第8~11字节。扩展分区占用的扇区数是第二逻辑分区相对起始扇区号与第二逻辑分区占用扇区数之和
38780910 + 4192965 = 42973875, 转换成十六进制数是028FBAB3H,翻转调位后是B3BA8F02,填入第12~15字节。
而后是第1~3字节(扩展分区起始地址)和第5~7字节(扩展分区终止地址)的填写。起始地址就是扩展分区起始扇区,扇区号为37061955。将此值及硬盘几何构成参数Hm、Sm代入式(1)、(2)、(3),得到起始地址的柱面号C = 2307,磁头号H = 0,扇区号S = 1。第1字节是磁头号,故应填入00。第2、3两个字节填入值的确定如图18所示。因为扇区号是1,故第2字节的低6位应为000001b。因为用10位二进制数表示的柱面号为2307,大于10位二进制数所能表示的最大值1023(仍然是前面提到的8.46GB以上的硬盘分区表空间不够用的问题),为了不使各类硬盘校验程序在这里产生误判,对长于10位的二进制字串不采用截位填入的方法,而是按照10位二进制数的最大值1023填入,也就是1111111111b。故第2字节的高2位应为11b,第3字节为11111111b。这样,由图18可以看到的结果是:第2字节应填写的十六进制数为C1H,第3字节为FFH。 扩展分区终止地址的扇区号为起始地址扇区号与分区占用扇区数之和减1,即
37061955 + 42973875 - 1 = 80035829。
将此值及硬盘几何构成参数Hm、Sm代入式(1)、(2)、(3),得到终止地址的柱面号C = 4981,磁头号H = 254,扇区号S = 63。把磁头号254转换为十六进制数FEH,填入第5字节。第6、7两个字节填入值的确定如图19所示。因为扇区号是63,故第6字节的低6位应为111111b。因为用10位二进制数表示的柱面号为4981,大于10位二进制数所能表示的最大值1023(仍然是前面提到的8.46GB以上的硬盘分区表空间不够用的问题),为了不至于让各类硬盘校验程序在这里产生误判,对长于10位的二进制字串不采用截位填入的方法,而是按照10位二进制数的最大值1023填入,也就是1111111111b。故第6字节的高2位应为11b,第7字节为11111111b。这样,由图19可以看到的结果是:第6字节应填写的十六进制数为FFH,第7字节为FFH。 至此,分区表的第四部分--扩展分区信息填写完毕,如图20所示。
图20 填写完毕的分区表扩展分区信息(下划黄线部分) 填写完分区表第四部分,用手工重新填写分区表的工作即告结束。 分区表填写完毕后经校核无误,重新启动计算机。开机后硬盘恢复原状,没有发生数据丢失。经过扫描杀毒后,用KV3000的硬盘救护箱将主引导扇区、各分区引导扇区、扩展分区起始扇区以及各逻辑分区引导扇区逐一作了软盘备份。
2002/12/21
参考文献
- Thomas Kjoernes, File Allocation Table - How It Seems To Work, http://home.no.net/tkos/info/fat.html May 11, 2000
- DEW Associates Corporation, Detailed Explanation of the FAT Boot Sector, dewassoc.com, 1995-2002, http://www.dewassoc.com/kbase/hard_drives/boot_sector.htm
- 硬盘软故障完全修复手册--数据结构篇 [瑞星3001] 北京瑞星科技股份有限公司 2000-2002 http://it.rising.com.cn/safety/syjq/fhzq/0727ypwqxfshc.htm
- 计算机病毒分析与防治技术 刘真编著 北京 电子工业出版社 1994.7
|