本节书摘来自异步社区《NTFS文件系统扇区存储探秘》一书中的第2章,第2.2节,作者:宋群生 , 宋亚琼著,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.2 FAT16扇区寻址实例分析
NTFS文件系统扇区存储探秘
详细了解文件系统的扇区分配是排除硬盘逻辑故障的重要基础。下面以作者使用的硬盘为例,介绍FAT16文件系统的扇区地址的寻址计算方法。
在进行扇区寻址和计算的过程中,需要用到后面《工具篇》中介绍的一些工具程序,本章先使用这些程序的执行结果,程序的详细运行方法在后面的章节中再作介绍。
作者使用的计算机上挂接了两块硬盘,为了在以后进行扇区扫描时节省时间,特意选用了两块小容量的硬盘。一块容量是6.2GB,接在第一IDE接口上,硬盘编号是“0”。另一块容量是40GB,接在第二IDE接口上,硬盘编号是“1”。
现在将1号硬盘作为主要操作对象,该硬盘划分成C、D、E、F、G、H、I七个逻辑驱动器,将0号硬盘作为辅助操作对象。1号硬盘的前五个逻辑驱动器的容量都是2GB,除了F盘使用NTFS文件系统,其余的C、D、E、G盘都使用FAT16文件系统。后两个逻辑驱动器使用FAT32文件系统,H盘的容量是10GB,I盘的容量是18GB。
下面以E盘为例,介绍FAT16文件系统的扇区分配。
运行“备份系统扇区数据.EXE”程序,就可以将硬盘上所有的逻辑驱动器的系统扇区数据,备份到文件中进行保存。每个逻辑驱动器备份两个扇区,其中一个是存储分区表或分区链表的扇区,另一个是存储分区引导记录的扇区。当分区引导记录占用多个扇区时,如FAT32和NTFS文件系统,只备份第一个扇区的数据。
程序运行以后,除了每个逻辑驱动器建立两个备份文件之外,还建立了一个扇区号的备查文件。目的是当系统引导出现故障时,可以将备份出来的数据,再按照原来的扇区号写回去,就可以修复硬盘。
扇区号备查文件的内容如下。
Boot sector number:
1: 0
2: 63
3: 4192965
4: 4193028
5: 8385930
6: 8385993
7: 12578895
8: 12578958
9: 16771860
10: 16771923
11: 20964825
12: 20964888
13: 41447700
14: 41447763
根据扇区号备查文件中的记录,可以读出E盘存储分区链表的扇区号是“8385930”。再运行“查看硬盘扇区数据.EXE”程序,将“8385930”号扇区的数据显示在对话框中,程序的运行结果如图2-1所示。
因为E盘不是第一个逻辑驱动器,所以在图2-1所示的对话框显示的数据中,没有主引导记录,只有分区链表。
找到字节位移1c6H开始的4字节,也就是字节编号455-458,扇区数据中的字节值是“3F 00 00 00”。这是一个双字,由于存储时的顺序是低字节在前,高字节在后,因此这个双字写成十六进制的形式是“0000003fH”,换算成十进制是“63”。
这个数值是分区前的扇区数,也可以看作是系统保留的扇区数。文件系统在检索文件的过程中,需要进行扇区号计算时,是从分区引导记录存储的扇区号开始的,系统保留扇区不计算在内。
在这63个系统保留扇区中,只有最前面的扇区写有数据,其余62个扇区空置不用。系统保留扇区之后,就是存储分区引导记录的扇区。用8385930加上63,就得到分区引导记录的扇区号是“8385993”。
运行“查看硬盘扇区数据.EXE”程序,将“8385993”号扇区的数据显示在对话框中,程序的运行结果如图2-2所示。
在图2-2所示的对话框显示的数据中,与当前讨论的问题相关的是BPB表,其他的内容不在本书讨论的范围。
解读E盘BPB表的内容,可以参考第1章中的表1-2来进行。为了简化叙述的过程,在描述扇区中某一个字节的位置时,只使用字节编号,暂时就不再使用字节位移的概念了。
现在找到第23字节开始的两字节,存储在扇区中的数据是“00 01”,也就是“0100H”,十进制是“256”。这一个字段的值,记录的是每个FAT表占用的扇区数。
先读出第一FAT表的第一个扇区,因为FAT16文件系统的分区引导记录只占用1个扇区,而紧接在分区引导记录之后的就是FAT表,所以第一FAT表的首扇区号是“8385993”加上1,即“8385994”。
运行“查看硬盘扇区数据.EXE”程序,将“8385994”号扇区的数据显示在对话框中,程序的运行结果如图2-3所示。
在第1章中曾经介绍过,FAT16文件系统和FAT32文件系统有一个共同的特点,它们的FAT表的首扇区的前两字节是F8 FF,图2-3所示的对话框显示的数据符合这个特征。
用第一FAT表的首扇区号加上每个FAT表占用的扇区数,就是第二FAT表的首扇区号。具体计算方法是8385994+256=8386250。
运行“查看硬盘扇区数据.EXE”程序,将“8386250”号扇区的数据显示在对话框中,程序的运行结果如图2-4所示。
将图2-4所示的对话框显示的数据与图2-3所示数据比较一下,可以发现它们完全相同。因此当第一FAT表意外损坏时,可以将第二FAT表的数据拷贝到第一FAT表相对应的扇区中去,覆盖损坏的数据,就可以修复文件系统。
接下来继续计算文件目录表FDT的扇区地址。将第二FAT表的首扇区号,加上每个FAT表占用的扇区数,就是FDT的首扇区号,具体计算方法是8386250+256=8386506。
运行“查看硬盘扇区数据.EXE”程序,将“8386506”号扇区的数据显示在对话框中。可是FDT表的首扇区不象FAT表的首扇区那样,有一个“F8 FF”的判断标志,如何验证显示的就是首扇区呢?为了消除这个疑问,可以在显示了“8386506”号扇区的数据以后,再打开一个对话框,显示的是其前一个扇区,即“8386505”号扇区的数据。通过两个对话框数据的比较,就能验证这个问题,程序的运行结果如图2-5所示。
如图2-5所示,左边的对话框显示的是“8386505”号扇区的数据,右边的对话框显示的是“8386506”号扇区的数据。因为“8386505”号扇区属于第二FAT表的最后一个扇区,而一般情况下FAT表不会被写满,所以该扇区的数据为0。由此可以验证出,“8386506”号扇区确是FDT表的首扇区。
如果将 “8386506”号扇区的数据用字符方式显示出来,就能观察到存储在E盘的部分目录或文件名。在WINDOWS 2000的32位图形界面下,有些特殊字符不容易显示,使用辅助的16位程序,显示效果要好一些。打开WINDOWS 2000的“命令提示符”窗口,在命令行运行程序READSF.EXE,显示效果如图2-6所示。
现在将图2-6的截图画面解释一下。执行程序时在命令行输入“readsf /rc”,readsf是可执行文件名,/rc是命令行开关,设定程序用字符方式显示文件内容。回车后程序显示提示行“Enter file name :”,输入需要显示数据的文件名“fdtfile”,该文件中备份的是“8386506”号扇区的数据,是由“查看硬盘扇区数据.EXE”程序建立的。
在显示的字符内容中,上面几行的第一个字符都是“σ”,这个ASCII字符的值是e5H,表示原来的文件已被删除。下面有几行显示出目前存储的目录或文件名,如在第11行显示的“NTCPP”就是一个目录名。
最后计算数据区DATA的首扇区地址。因为FAT16文件系统的FDT表占用固定的32个扇区,所以用FDT表的首扇区号加上32,就是数据区的首扇区号,计算结果是“8386538”。为了验证这种推导是否正确,仍然采用前面的方法,将其前一个扇区的数据并列显示在对话框中加以比较。程序的运行界面如图2-7所示。
如图2-7所示,左边的对话框显示的是“8386537”号扇区的数据,右边的对话框显示的是“8386538”号扇区的数据。因为“8386537”号扇区属于FDT表的最后一个扇区,而一般情况下FDT表不会被写满,所以该扇区的数据为0。由此可以验证,“8386538”号扇区确实是数据区DATA的首扇区。