收藏 分享(赏)

谈FAT32文件系统.doc

上传人:fmgc7290 文档编号:6954096 上传时间:2019-04-28 格式:DOC 页数:27 大小:67KB
下载 相关 举报
谈FAT32文件系统.doc_第1页
第1页 / 共27页
谈FAT32文件系统.doc_第2页
第2页 / 共27页
谈FAT32文件系统.doc_第3页
第3页 / 共27页
谈FAT32文件系统.doc_第4页
第4页 / 共27页
谈FAT32文件系统.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、FAT32 文件系统简介Windows95 OSR2 和 Windows 98 开始支持 FAT32 文件系统,它是对早期 DOS 的 FAT16 文件系统的增强,由于文件系统的核心-文件分配表 FAT 由 16 位扩充为 32 位,所以称为 FAT32 文件系统。在一逻辑盘(硬盘的一分区)超过 512 兆字节时使用这种格式,会更高效地存储数据,减少硬盘空间的浪费,一般还会使程序运行加快,使用的计算机系统资源更少,因此是使用大容量硬盘存储文件的极有效的系统。本人对Windows 98 下的 FAT32 文件系统做了分析实验,总体上与 FAT16 文件系统变化不大,现将有关变化部分简介如下:(一

2、)FAT32 文件系统将逻辑盘的空间划分为三部分,依次是引导区(BOOT 区)、文件分配表区(FAT 区)、数据区(DATA 区)。引导区和文件分配表区又合称为系统区。(二)引导区从第一扇区开始,使用了三个扇区,保存了该逻辑盘每扇区字节数,每簇对应的扇区数等等重要参数和引导记录。之后还留有若干保留扇区。而 FAT16 文件系统的引导区只占用一个扇区,没有保留扇区。 (三)文件分配表区共保存了两个相同的文件分配表,因为文件所占用的存储空间(簇链)及空闲空间的管理都是通过 FAT 实现的,FAT如此重要,保存两个以便第一个损坏时,还有第二个可用。文件系统对数据区的存储空间是按簇进行划分和管理的,簇

3、是空间分配和回收的基本单位,即,一个文件总是占用若干个整簇,文件所使用的最后一簇剩余的空间就不再使用,而是浪费掉了。从统计学上讲,平均每个文件浪费 0.5 簇的空间,簇越大,存储文件时空间浪费越多,利用率越低。因此,簇的大小决定了该盘数据区的利用率。FAT16 系统簇号用 16 位二进制数表示,从 0002H 到 FFEFH 个可用簇号(FFF0H 到 FFFFH 另有定义,用来表示坏簇,文件结束簇等),允许每一逻辑盘的数据区最多不超过 FFEDH(65518)个簇。FAT32 系统簇号改用 32 位二进制数表示,大致从 00000002H 到 FFFFFEFFH 个可用簇号。FAT 表按顺序

4、依次记录了该盘各簇的使用情况,是一种位示图法。每簇的使用情况用 32 位二进制填写,未被分配的簇相应位置写零;坏簇相应位置填入特定值;已分配的簇相应位置填入非零值,具体为:如果该簇是文件的最后一簇,填入的值为 FFFFFF0FH,如果该簇不是文件的最后一簇,填入的值为该文件占用的下一个簇的簇号,这样,正好将文件占用的各簇构成一个簇链,保存在 FAT 表中。0000000H、00000001H 两簇号不使用,其对应的两个 DWORD 位置(FAT 表开头的 8 个字节)用来存放该盘介质类型编号。FAT 表的大小就由该逻辑盘数据区共有多少簇所决定,取整数个扇区。(四)FAT32 系统一簇对应 8

5、个逻辑相邻的扇区,理论上,这种用法所能管理的逻辑盘容量上限为 16TB(16384GB),容量大于 16TB 时,可以用一簇对应 16 个扇区,依此类推。FAT16 系统在逻辑盘容量介于128MB 到 256MB 时,一簇对应 8 个扇区,容量介于 256MB 到 512MB 时,一簇对应 16 个扇区,容量介于 512MB 到 1GB 时,一簇对应 32 个扇区,容量介于 1GB 到 2GB 时,一簇对应 32 个扇区,超出 2GB 的部分无法使用。显然,对于容量大于 512MB 的逻辑盘,采用 FAT32 的簇比采用 FAT16 的簇小很多,大大减少了空间的浪费。但是,对于容量小于 512

6、MB 的盘,采用 FAT32 虽然一簇 8 个扇区,比使用 FAT16 一簇 16 个扇区,簇有所减小,但 FAT32 的 FAT 表较大,占用空间较多,总数据区被减少,两者相抵,实际并不能增加有效存储空间,所以微软建议对小于 512M 的逻辑盘不使用 FAT32。另外,对于使用 FAT16 文件系统的用户提一建议,硬盘分区时,不要将分区(逻辑盘)容量正好设为某一区间的下限,例:将一逻辑盘容量设为 1100M(稍大于 1024M),则使用时其有效存储容量比分区为 950M 的一般还少,因其簇大一倍,浪费的空间较多。还有,使用 FDISK 等对分区指定容量时,由于对 1MB 的定义不一样(标准的

7、二进制的 1MB 为1048576B,有的系统将 1MB 理解为 1000000B,1000KB 等),及每个分区需从新磁道开始等因素,实际分配的容量可能稍大于指定的容量,亦需注意掌握。(五)根目录区(ROOT 区)不再是固定区域、固定大小,可看作是数据区的一部分。因为根目录已改为根目录文件,采用与子目录文件相同的管理方式,一般情况下从第二簇开始使用,大小视需要增加,因此根目录下的文件数目不再受最多 512 的限制。FAT16 文件系统的根目录区(ROOT 区)是固定区域、固定大小的,是从 FAT 区之后紧接着的 32个扇区,最多保存 512 个目录项,作为系统区的一部分。(六)目录区中的目录

8、项变化较多,一个目录项仍占 32 字节,可以是文件目录项、子目录项、卷标项(仅跟目录有)、已删除目录项、长文件名目录项等。目录项中原来在 DOS 下保留未用的 10 个字节都有了新的定义,全部 32 字节的定义如下: (1) 0- 7 字节 文件正名。 (2) 8-10 字节 文件扩展名。 (3) 11 字节 文件属性,按二进制位定义,最高两位保留未用,0 至 5 位分别是只读位、隐藏位、系统位、卷标位、子目录位、归档位。 (4) 12-13 字节 仅长文件名目录项用,用来存储其对应的短文件名目录项的文件名字节校验和等。 (5) 14-15 字节 24 位二进制的文件建立时间,其中的高 5 位

9、为小时,次 6 位为分钟。 (6) 16-17 字节 16 位二进制的文件建立日期,其中的高 7 位为相对于1980 年的年份值,次 4 位为月份,后 5 位为月内日期。 (7) 18-19 字节 16 位二进制的文件最新访问日期,定义同(6)。(8) 20-21 字节 起始簇号的高 16 位。(9) 22-23 字节 16 位二进制的文件最新修改时间,其中的高 5 位为小时,次 6 位为分钟,后 5 位的二倍为秒数。 (10)24-25 字节 16 位二进制的文件最新修改日期,定义同(6)。(11)26-27 字节 起始簇号的低 16 位。 (12)28-31 字节 32 位的文件字节长度。

10、 其中第(4)至(8)项为以后陆续定义的。 对于子目录项,其(12)为零;已删除目录项的首字节值为 E5H。在可以使用长文件名的 FAT32 系统中,文件目录项保存该文件的短文件名,长文件名用若干个长文件名目录项保存,长文件名目录项倒序排在文件短目录项前面,全部是采用双字节内码保存的,每一项最多保存十三个字符内码,首字节指明是长文件名的第几项,11 字节一般为 0FH,12 字节指明类型,13 字节为校验和,26-27 字节为零。 (七)以前版本的 Windows 和 DOS 与 FAT32 不兼容,不能识别FAT32 分区,有些程序也依赖于 FAT16 文件系统,不能和 FAT32 驱动器一

11、道工作。将硬盘转换为 FAT32,就不能再用双引导运行以前版本的 Windows(Windows 95 Version 4.00.950、Windows NT 3.x、Windows NT 4.0 和 Windows 3.x)。 CIH 破坏后的硬盘修复 摘要: 本文记述了 CIH 病毒发作后破坏后的状况及 CIH 的破坏原理,讨论了修复的可能性,针对全盘修复作了讨论,对磁盘原理进行了分析,并对分区表及第一个分区的修复方法作了较为深刻的探讨。最后介绍了一下用此原理编制的程序 FixDriveC。关键字:CIH 病毒 修复 磁盘结构一、CIH 的破坏4 月 26 日,隐藏在数十万台计算机中的 C

12、IH 病毒突然发作,造成全国大面积的计算机瘫痪,损失十分惨重。病毒发作的机器 BIOS(基本输入输出系统)被改写,硬盘数据被损坏,造成机器无法启动,重要数据丢失。据有关调查表明,在上月 26 日 CIH 病毒的大规模发作中,我国受到损害的计算机总量为 36 万台,造成的直接、间接经济损失超过 10 亿元。调查还表明,这次 CIH 病毒发作中全国受到侵害的计算机中主板受损的比例为15%,造成的直接经济损失为 0.8 亿元,间接经济损失超过 10 亿元。二、CIH 病毒简介CIH 病毒是台湾大学生陈英豪编制的,起初据称只是为了“使反病毒软件公司难堪”,但后来由于病毒传染力强,迅速扩散到了世界各个国

13、家的计算机系统上。以至于造成现在的严重情况。CIH 病毒属文件型病毒,其别名有 Win95.CIH、Spacefiller、Win32.CIH、PE_CIH,它主要感染Windows95/98 下的可执行文件,目前的版本不感染 DOS 以及 WIN3.X 下的可执行文件,并且在 WinNT 中不能发作。其发展过程至现在公认经历了v1.0,v1.1、v1.2、v1.3、v1.4 五个版本,目前最流行的是 v1.2 版本。其中 1.0 版时间较早,没有破坏作用;1.1 版被感染文件大小不变,没破坏力;1.2 版加入破坏硬盘和 BIOS 的程序,在每年的 4 月 26 日发作;1.3版修正了部分感染

14、自解压文件时的出错问题,而且将发作日期改为每年 6月 26 日;1.4 版对于所有的 Winzip 自解压文件都不感染,并会在每个月的 26 日发作。三、CIH 发作分析CIH 发作时将会把部分 5V 电压的 Flash ROM 重写,填入杂乱的数据,使机器无法启动,同时从第一个硬盘的第一个扇区开始以 2048 个字节为单位将内存中不相关的数据填入硬盘。IOS_SendCommand 是 Win95 的一个非常底层的 VXD 调用,通常是用作对 IO 设备的低层操作,如:读,写,加锁,格式化等等。一般情况下只能在 Ring 0 和虚拟机中使用。CIH 病毒先构造一个 IOR,再使用 IOS_S

15、endCommand 调用,完成 IOR 所指定的功能。 病毒指定第一次写的磁盘为第一个磁盘,位置为 0,即 0 柱面 0 磁头 1 扇区,指定一次写的长度为 2048 个字节,然后调用 IOS_SendCommand 进行一次写操作。如果成功,将继续重复写操作,直到将所有的扇区全部写完,然后转到第二个硬盘继续写。病毒理想的情况是将所有硬盘全部写完。但由于写盘的速度比较慢,加之 Flash ROM 在硬盘破坏之前被破坏,因此很可能导致死机或被用户 Reset 复位,所以病毒不会将所有的数据破坏掉,通常只能破坏硬盘前部的几百个至上千个扇区。而现在的硬盘都比较大,病毒并没有破坏到数据区,这就给恢复

16、提供了先决条件。四、磁盘结构综述1.硬盘结构硬盘的内部是由圆形金属片堆叠起来的,每个盘片的两面都有一个磁头(Head)负责读写这个磁面(Side),在每个磁面上划分了一圈一圈的同心圆,叫做柱面(Cylinder)对于软盘通常称之为磁道,在每个柱面中又划分了若干段,称之为扇区(Sector)。由于技术的发展,硬盘的密度越来越大,使得硬盘的实际盘片数越来越少,对磁盘操作的柱面、磁头、扇区被硬盘控制器内部转换,已经不是实际的柱面、磁头、扇区了。由于最早时磁盘存取系统估计不足,传输数据时只给扇区留了 6 位,柱面留了 10 位,磁头留了 8 位。也就是说,柱面最大只能为 1023。但是大硬盘的柱面远大

17、于这个数,所以后来就采用将柱面数减少,将磁头数增加的方式来满足磁盘寻址的要求,对于实际地址的转换在 BIOS 中进行,这叫逻辑块寻址方式(Logical Block Addressing,LBA)硬盘中有关柱面、磁头、扇区的数据都是以此为基准的。2.分区结构众多的文件数据存放在磁盘上,需要有组织,这就形成了文件系统。但是各个操作系统的文件系统都不尽相同,为了划分管理文件系统,在现在的PC 机上都采用通用的分区结构。分区机构是这样的:硬盘的以一个扇区(就是 0 柱面 0 磁头 1 扇区)叫主引导扇区(Main Boot Record,MBR),存放着引导程序和主分区表(Main Partitio

18、n Table)和结束标志“55AA”。一般称的分区表即是主分区表。一个分区表最多可包含四个分区表项,每个分区表项中标示着一个分区信息或一个扩展分区表的位置,而扩展分区表中可能还有扩展分区表,这就形成了一个链状结构,可以记录很多个分区。主引导扇区结构如图所示。C 语言定义如下typedef structchar bootcode0x1be; /启动代码PartitionTable PT4; /分区表word EndingFlag; /结束标识MBR;分区表项的如下:typedef structbyte BootFlag; /启动标志CHS StartCHS; /分区开始的柱面、磁头、扇区byt

19、e SystemID; /分区类型CHS EndCHS; /分区结束的柱面、磁头、扇区dword RelativeSectors; /分区相对扇区数,指分区相对于记录该分区的分区表的扇区位置之差dword TotalSectors;/分区总扇区数PartitionTable;其中 CHS 为一个柱面、磁头、扇区的结构,定义如下:struct CHSbyte Head; /磁头byte Sector:6; /扇区byte CyH2:2; /柱面的高两位byte CyL8; /柱面的低八位word Cylinder() return (word(CyH2)*256+CyL8); /返回柱面值voi

20、d SetCylinder(word Cylinder) /设置柱面值CyH2=(Cylinder8)CyL8=(Cylinder;其中分区类型是对应于各种文件系统统一编排的一个代码。比如 06H 是大于 32M 的 FAT16 分区的标志,05H 是扩展分区的标志,等等。一般的,对于DOS/Windows3.x/Windows95/98 的系统来说,第一个分区表项记录着 DOS主分区(C 盘)的信息,而且是可以启动的,第二个分区表项一般是扩展分区,在这个扩展分区表项所指向的分区表中又是一个 Dos 主分区(D 盘)和一个扩展分区,依次类推。而在绝大部分系统中 Dos 主分区(C 盘)是从 0

21、柱面 1 磁头 1 扇区开始的。(有些机器在这个位置有个小分区,专门用来管理启动或机器设置,之后才是 C 盘的分区)3.FAT 文件系统FAT 文件系统(FAT12/FAT16/FAT32)是从 DOS 发展过来的一种文件系统,其优点是简单易用,并被多种操作系统支持。(目前支持 FAT32 的操作系统还不多)FAT 文件系统名称后的数字是标识文件中系统一个分配单元所需的位(bit)数。一个 FAT12/16 文件系统的结构是这样的:引导扇区 第一文件分配表 第二文件分配表 根目录 数据区(1).引导扇区引导扇区是文件系统的第一个扇区,其中包含分区重要的数据信息BPB(BIOS Parament

22、er Block-磁盘参数表)。磁盘参数表中包含分区总大小、磁盘参数等重要信息。其 C 语言定义为:typedef structword SectorBytes; /每扇区字节数byte SectorsPerCluster; /每簇扇区数word ReservedSectors; /保留扇区数byte NbrFat; /FAT 的个数word RootEntry; /根目录项数word TotalSectors; /分区总扇区数(分区小于 32M 时)byte Media; /分区介质标识word SectorsPerFAT; /每个 FAT 占的扇区数word SectorsPerTrack

23、; /每道扇区数word Heads; /磁头数dword HiddenSectors; /隐含扇区数dword BigTotalSectors; /分区总扇区数(分区大于 32M 时)BPB_FAT16;其中保留扇区数为从分区开始到第一个 FAT 表开始中间的扇区数。隐含扇区数同分区表中的隐含扇区数含义相同。虽然存在 FAT 个数的定义,但现在的 FAT12/16 系统基本上没有除 2 以外的值。因而一般不考虑其他情况。根目录项数是指根目录总共能容纳下的目录的项数。一个目录项占 32 个字节,所以一个扇区有 512/32=16 个目录项。用这个值除以 16 就是根目录所占的扇区数。分区总扇区

24、数在分区大于 32M 时已经超过 65535,两个字节已经无法表示,因此在大于 32M 的分区中 TotalSector 总是等于零,而将实际的数放在 BigTotalSectors 中。分区介质标识是确定 BPB 有效的标志。它必须与 FAT 表中第一个字节的分区介质标识统一。硬盘的分区介质标识为 0F8h,如果这个标识不对或者与 FAT 不统一则将会出“Invalid media type”的错误。SectorsPerFAT 是每个 FAT 所占的扇区数。系统根据分区起始地址+保留扇区数+每个 FAT 所占扇区数*FAT 个数+根目录项数/16 来确定数据区开始的位置,然后由这个位置+簇号

25、*每簇扇区数来最终确定数据在硬盘扇的具体位置。(2)文件分配表文件分配表是文件在磁盘上分布的信息。FAT 文件系统将数据区按每簇扇区数为单位划分成一个一个单元,每个单元是文件分配的最小单位。这个单元就称为簇。一些大的文件可能占用了很多簇,而且在磁盘上没有连续存放。FAT 表就是为了确定文件每个簇的连接关系而设的。FAT 表的每一项都对应着数据区的一个簇,FAT16 的 FAT 表每一项占 16 位,也就是两个字节。每一项的内容表示其对应簇的分配情况,0 表示尚未分配;FFF0hFFF6h 为备用;FFF7h 表示坏簇,即该簇中磁盘有损坏;FFF8hFFFF 表示文件结束;其他值则表示当前簇的下

26、一簇的簇号。FAT 表的最前面两项是不用的,因此第一个数据簇的簇号为 2。FAT 表第一个字节也是分区介质类型,和 BPB 中的一样。因此用“F8 FF FF”可以作为硬盘 FAT 起始的标志。绝大多数 FAT 系统有两个 FAT 表,第二个 FAT 表又称为后备文件分配表。系统内部完成后备文件分配表与第一文件分配表的统一。本文讨论的完全恢复是基于后备文件分配表没有被破坏的情况下的恢复,如果两个文件分配表都被损坏,理论上就无法完全确定文件信息,因此无法完全恢复。(3)根目录FAT12/16 的根目录是单独列出来的,在后备文件分配表和数据区之间。每个目录项为 32 个字节,记录一个文件或目录的信

27、息。(长文件名例外)文件修复的原理就是由目录项中指示的起始簇号和数据区开始位置来确定文件的位置,从而恢复小的文件。4.FAT32 文件系统FAT32 文件系统与 FAT12/16 的差别较大,一个主要的差别就是将根目录划归到数据区中了,在 BPB 中专门加了一项根目录开始簇号。这样根目录的大小就不再受到限制,大大增加了根目录的自由度。FAT32 的 BPB 定义如下:typedef structword BytesPerSector; /每扇区字节数byte SectorsPerCluster; /每簇扇区数word ReservedSectors; /保留扇区数byte NumberOfFA

28、Ts; /FAT 的个数word RootEntries; /根目录项数(FAT32 不用)word TotalSectors; /分区总扇区数(FAT32 不用)byte MediaDescriptor; /分区介质标识word SectorsPerFAT; /每个 FAT 占的扇区数(FAT32 不用)word SectorsPerTrack; /每道扇区数word Heads; /磁头数dword HiddenSectors; /隐含扇区数dword BigTotalSectors; /分区总扇区数dword BigSectorsPerFat; /每个 FAT 占的扇区数word Ext

29、Flags; /扩展标志word FS_Version; /文件系统版本dword RootDirStartClus; /根目录起始簇号word FSInfoSec; /指向包含 BIGFATBOOTFSINFO 结构的扇区word BkUpBootSec; /后备引导区的位置byte Reserved12; /备用BPB_FAT32;从上可以看出,FAT32 的 BPB 是在 FAT16BPB 的基础上加入了一些参数,并停用了一些参数。每个 FAT 所占扇区数变为 4 个字节,根目录项数不再使用。FAT32 与 FAT12/16 的另一不同点在于,FAT32 既可以同时使用多个FAT 表,也

30、可以只使用其中的某一个 FAT 表。ExtFlags 正是这个标志。当ExtFlags 的第 8 位为 0 时表示同时使用每个 FAT 表,当其为 1 时表示只使用其中的一个 FAT 表,这个 FAT 表的序号由 ExtFlags 的低 4 位给出。FS_Version 文件系统版本现在都为 0。FAT32 将根目录也视作一个目录文件,使用一个簇链(Cluster Chain),RootDirStartClus 正是这个链的起始簇号。FAT32 有个专门放BIGFATBOOTFSINFO 结构的扇区,该结构包含了剩余簇个数,下一个空闲簇号等信息。这个扇区通常紧接着引导扇区。由于与恢复关系不大,

31、本文不做讨论。FAT32 将引导扇区和文件系统信息扇区信息存了两份,另一份的位置由 BkUpBootSec 指出。这样由于偶然发生的损坏就很容易恢复。5.扩展 BIOS 参数块在 BPB 的后面是 Extended BIOS Paramenter Block。EBPB 的结构如下:typedef struct /Extended BIOS Paramenter Blockbyte PhysicalDriveNumber; /物理硬盘号byte CurrentHead; /当前磁头byte ExtBootRecSign; /扩展引导记录标志dword SerialNumber; /序列号char

32、 VolumeLabel11; /卷标char FSID8; /文件系统标识EBPB;其中物理硬盘号和当前磁头是系统运行时使用的,硬盘上的值没有什么实际意义。ExtBootRecSign 一般为 28h 或 29h。SerialNumber 是格式化后生成的序列号。文件系统标识指示了文件系统的类型,即“FAT12”、 “FAT16”、 “FAT32”6.压缩磁盘简介从 DOS6.0 开始有了压缩磁盘的功能。DBLSPACE、DRVSPACE、DRVSPACE3是各个不同时期的磁盘压缩系统。压缩磁盘其实是个大文件,其内部是个更为复杂的 FAT 系统。这个大文件包含了文件头、MDFAT(Micro

33、soft Drivespace FAT)、内部 BPB、内部 FAT、内部根目录及内部数据区,和分区非常相似。主要不同的是,它的 FAT 不直接对应数据区,而是对应于MDFAT 表,每一个 MDFAT 表项包含扇区起始位置信息和扇区的压缩信息。这样在存取一个文件时需要由目录项确定起始簇,由起始簇表确定 MDFAT表项,再由 MDFAT 得到扇区位置,并由压缩信息决定是否进行压缩解压。根据 FAT 表来确定下一个簇或者文件结束。但其中的扇区位置等信息都是相对于这个文件的逻辑地址,具体物理地址还要用外部的分区信息和外部FAT 表决定。因此对于 C 盘被压缩后的恢复是非常困难的。五 分区表的修复分区

34、表的链状结构在前面已经讲述过了。由于 CIH 从头连续破坏的特点,使得 CIH 几乎破坏不到扩展分区及以后的分区。在正常情况下,即一个 DOS 主分区,一个扩展分区的模式,只要找到扩展分区开始的扇区,就能把主分区表中扩展分区的表项重建,扩展分区前的分区(通常就是 C 盘)的分区表项也可以重建。这是一个非常简单的过程。对于用标准分区的系统(占绝大多数),分出的扩展分区都是从某个柱面的 0 磁头 1 扇区开始的。因此只搜索每个柱面的第一个扇区速度很快。搜索的条件是分区结束标志为“55AA”,并且分区表项合法。找到扩展分区了以后,主分区表中的扩展分区表项就完全可以建立了。起始柱面扇即是找到的位置,类

35、型标识为5,分区总扇区数等于扩展分区中所有分区的总扇区数之和再加上第一个分区的隐含扇区数。然后由分区起始地址和分区总扇区数就可以计算出终止柱面扇。扩展分区表项一确定,主 DOS 分区表项就可以确定了。在此就不敷述了。需要指出的一点是,如果用户以前分过区,后来分区改变了,即使格式化过,旧的分区信息依然可能留在硬盘上。这时如果分区修复软件找到旧的分区信息并使用,则生成的分区表就是错误的。这种错误的概率很大。有人就遇到过 kv300 将一个分区修成两个分区的错误情况。解决的办法是需要用户手工确认。现在很多用户装了多个操作系统,比如Linux,Windows NT 等。如果这些系统不是在第一个分区的话

36、也是完全能够修复的。如果这些系统在扩展分区中,则在恢复扩展分区的过程中就恢复了这些分区,否则,就需要单独处理这些分区。通常这些分区也是从 0磁头 1 扇区开始的,在搜索时 NTFS 分区可以搜索结束标识“55AA”和在偏移为 3 的地方判断“NTFS”标志。Linux native 分区可以在偏移为 2的地方搜索“LILO”标志和分区结束标识。分区表项的文件系统类型为01hFAT1202hXNEIX root03hXNEIX usr04hFAT16(小于 32M)05hExtend 扩展分区06hBIGDOS FAT16(大于 32M) 07hNTFS 或 HPFS08hAIX09hAIX b

37、oot0BhFAT320ChFAT32x (同 0Bh,使用 Int13 扩展) 0EhBIGDOS FAT16x (同 06h,使用 Int13 扩展) 0FhExtendx(同 05h,使用 Int13 扩展) 63hUnix SystemV/38664hNetware28665hNetware38682hLinux swap83hLinux Native六. 完全型修复完全型修复的原理就是将没有被破坏的后备文件分配表复制到主文件分配表,然后生成引导扇区。这样恢复的前提就是后备文件分配表及以后没有被破坏。其关键的步骤是搜索根目录和后备文件分配表。确定几个重要位置 (1).根目录位置的确定根

38、目录的确定比较容易,手工查找时在盘上搜索“COMMAND COM”(中间是空格),很容易找到根目录。程序查找时要在查找到后确定第一个根目录开始的扇区,需要从找到的扇区开始向前判断,直到不是目录的扇区为止。同时应注意长文件名的影响。(2).后备 FAT 表的位置确定后备 FAT 表可由 F8 FF FF 来搜索,在 Diskedit 中由专门的功能。但应注意的是这样搜索的结果可能有很多,判断的条件是前一个扇区和这个扇区有明显差别,而且这个扇区是规范的 FAT 样式。手工可用 Diskedit 的 F5或 Alt-F5(FAT32)来看。(3).数据区起始的确定如果是 FAT32,则需要用到数据区

39、开始,通常数据区开始就是根目录,但个别系统不是。如果根目录的前面扇区明显不是 FAT,则要向前搜索数据区的开始。2.理想情况下的恢复在理想情况下,正确得到后备 FAT 表的位置及 FAT 的类型、数据区开始位置、根目录开始位置、分区总扇区数后,用下面的方法恢复。(1).主 FAT 的恢复由以上的介绍可知,根目录(FAT16)或数据区(FAT32)的起始位置=分区开始位置+保留扇区数+每 FAT 扇区数*FAT 个数。因为绝大多数系统 FAT 个数都是 2,所以第一个 FAT 开始的位置就等于=根目录(FAT16)或数据区FAT32)的起始位置-每 FAT 扇区数*2。这样,如果准确的找到第二个

40、 FAT 标的位置,和根目录(FAT16)或数据区(FAT32)的起始位置,就可以确定主 FAT 的位置,从而可以将第二个 FAT表复制到第一个的位置,完成 FAT 标的修复。(2).引导扇区及 BPB 的恢复分区引导扇区的修复是这样的:对于大部分情况,C 盘是从 0 柱面 1 磁头1 扇区开始的。所以缺省可以认为满足这个条件。修复时将一个其他系统的完好的引导扇区复制到当前位置,然后再修复 BPB。修复 BPB 只需要将本分区可能于其他系统不同的值计算出即可。以 FAT32 的 BPB 为例,需要重新计算的参数有每簇扇区数、保留扇区数、磁头数、分区总扇区数、每个 FAT 的扇区数和根目录起始簇

41、号。分区总扇区数由主分区表中的信息获得。每个 FAT 的扇区数=根目录(FAT16)或数据区(FAT32)的起始位置-第二个 FAT 标的起始位置。每簇扇区数由分区总扇区数和 FAT 表占扇区数确定。FAT16 每个表项占两个字节,所以一个扇区含 256 个表项。分区总的簇数就约等于 256*每个 FAT 所占扇区数。用分区总扇区数-保留扇区数-每个FAT 占扇区数*FAT 个数/分区总的簇数再一圆整就得到每簇扇区数。FAT32每项占 4 个字节,所以每个扇区包含 128 个表项,和 FAT16 稍有差别,算法是一样的。保留扇区数就是计算出的主 FAT 表开始位置减去引导扇区的位置。磁头数可以

42、直接利用系统调用得到。对于 FAT32,需要得出根目录起始簇号。它等于(根目录起始位置-数据区起始位置)/每簇扇区数+2。由于大部分 FAT32 系统的根目录就在数据区的开始,所以这个值就等于 2。3.FAT 类型未知时的确定当 FAT 的类型未知的时候,手工比较好确认。用磁盘工具查看后备 FAT 表时,如果明显是 4 个字节一个单元,就是 FAT32。突出特点是后两个字节为 00 00 或 01 00 等很小的值。程序判断时可用如下方法:分区大于 2048M 时肯定为 FAT32;分区小于 512M 时几乎都为 FAT16。在512M2048M 之间时,由于 FAT32 的每簇扇区数一般是

43、2、4、8、16、32(很少),FAT16 一般是 32,64, FAT32 的每个扇区包含128 个项,而 FAT16 包含 256 项,所以 FAT32 总扇区数SectorPerFAT*256*(32)所以 FAT32 的TotalSectors/SectorPerFAT256*32=8192 所以用中间的一个数如 5000就可以区分两种 FAT 类型。4. 其他情况分析上面谈的理想情况对于用 Microsoft 的软件建立的系统几乎都是适用的。但由于一些磁盘软件如 Partition Magic 等建立的文件系统就不一定非常适用了。(1).C 盘不是从 0 柱面 1 磁头 1 扇区开始

44、这样的情况多见于在 C 盘之前有一个小的分区,通常用作多操作系统启动或机器形同设置。这时引导扇区的位置就要改变,按照第一个 FAT 的位置向前排。(2).保留扇区数不标准通常标准的保留扇区数 FAT16 是 1,FAT32 是 32。如果最后求出来的保留扇区数和这接近,则有可能是正确的,如果是正的较大的值,则可能是第一种情况或是压缩的磁盘,如果为负值,就是搜索到的备份 FAT 表或根目录(FAT16)或数据区(FAT32)的位置不对。(3). 压缩磁盘由于压缩磁盘的内部也可以搜索到 FAT 表、根目录等信息,因此在不清楚情况的时候可能进行误恢复。5.总论对于各种情况,引导扇区位置+保留扇区数+

45、FAT 占扇区数*FAT 个数=根目录起始位置(FAT16)或数据区起始位置(FAT32) 这个公式是始终成立的。其中引导扇区位置、保留扇区数、FAT 个数都有一般的常用值,所以知道FAT 所占扇区数就可以求得根目录起始位置(FAT16)/数据区起始位置(FAT32),反过来也是。而根据磁盘总扇区数和 FAT 类型基本可以确定FAT 所占扇区数和根目录(FAT16)/数据区(FAT32)的值。所以这几个参数是环环相扣的,各方面满足的好的话才能进行恢复(特别是程序),不然就有可能造成错误修复的情况。七.文件型修复当后备文件分配表被损坏或者根目录及数据区部分损坏后,完全修复的可能性就非常小了。但是

46、一些小文件或者在磁盘上连续存放的文件还是可以恢复的。(1).根据目录来确定文件这是最常用而且是较为成功的方法。但首先必须得到数据区开始位置和每簇扇区数。如果在无法直接确定每簇扇区数的时候,可以观察目录区的文件的簇号排列。大部分目录中文件都是顺序排下来的,观察一下相邻文件的簇号,在簇号基本相连的情况下看一下多大的文件簇号相隔大于 1,就可以确定每簇扇区数了。例如连续两个文件 a 和 b,a 从 10000 簇开始,b从 10002 开始,而且 a 大小是 46789,就可以知道每簇 32k,就是说每簇扇区数为 64。数据区开始位置无法直接确定时可以用磁盘总大小和每簇扇区数及 FAT 的类型得到,

47、然后用一些文本文件来验证。例如如果分区总扇区数为 1645056(800M),每簇扇区数为 64,FAT16,则每 FAT 扇区数粗略值为 1645056/64/256=100.4。取 100,则 FAT 扇区数精确值为(1645056-1-100*2-16)/64/256=100.39, 即为 101。那么数据区应该从 分区偏移 1+101*2+16)=219 扇区开始。用小文件确定的方法:例如在磁盘上搜索到FILE1.txt 的目录项,起始簇号为 clus,每簇扇区数为 SectorPerClus 并搜索到 FILE1.txt 文件在磁盘总第 a 扇区,则数据区开始位置为总第a-(clus

48、-2)*SectorPerClus 扇区。这两个参数确定后就可以用数据区开始位置+(簇号-2)*每簇扇区数来确定文件的具体位置。然后按目录项中的文件大小来截取文件复制到正常盘。如果文件较小或连续存放,就将文件正确恢复了。(2)全盘查找文件如果目录项也被破坏了,就只能全盘查找文件来恢复了。这对于一些文本文件特别是源程序恢复比较容易,对于其他文件就不是很灵了。八.FixDriveC 简介FixDriveC 就是利用以上原理编制的分区表及完全型修复软件。它含有分区表修复和 C 盘修复的功能,特点是自动修复与手工配合相结合,使得一些特殊情况计算机很难判断时用人工确定。而且程序在修复之前作的判断比较多,在确保安全的前提下才进行修复。九.后记以上分析了 CIH 病毒破坏的原理,详述了有关的磁盘概念,讨论了分区表的修复、分区的完全修复以及文件恢复的方法,并简单介绍了修复软件FixDriveC。其实本文不只是对于 CIH 的破坏,对其他形式造成的硬盘数据丢失同样可以使用。希望本文对读者有较大帮助,如果您对此有问题或者不同意见,可以发 Email 至 或 ,本人将会尽力回答。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报