《NTFS文件系统扇区存储探秘》——第1章 FAT文件系统的数据结构 1.1 主引导记录

简介:

本节书摘来自异步社区《NTFS文件系统扇区存储探秘》一书中的第1章,第1.1节,作者:宋群生 , 宋亚琼著,更多章节内容可以访问云栖社区“异步社区”公众号查看

第1章 FAT文件系统的数据结构

NTFS文件系统扇区存储探秘
硬盘在分区以后,其每一个逻辑驱动器都必须建立起完整的数据结构,才能正常使用。FAT文件系统和NTFS文件系统的数据结构大部分都不相同,只在存储系统分区数据的扇区上,有某些相同或相似的地方。

FAT文件系统的数据结构由6部分组成,分别是主引导记录、主分区表或分区链表、分区引导记录、文件分配表、文件目录表和数据区。这里需要说明的是,主引导记录和主分区表都只有一个,共同存储在一个扇区中。如果使用CHS(柱面数、磁头数、扇区数)寻址方式,这个扇区是0柱面0磁头1扇区;如果使用线性寻址方式,这个扇区是0号扇区。从硬盘分区后的区域结构上划分的话,该扇区可以认为是属于第1个逻辑驱动器,也就是通常所说的C盘。而其他的逻辑驱动器就没有主引导记录和主分区表了,在这些逻辑驱动器所属的第1个系统隐藏扇区上,只有分区链表。

NTFS文件系统的数据结构中,用于系统引导的部分基本与FAT文件系统相同,如主引导记录、主分区表或分区链表、分区引导记录这3部分。不过在这3部分中,很多字段的数据所表示的内容是完全不同的,只是都有相同的称呼罢了。

FAT文件系统的另外3部分,即文件分配表、文件目录表和数据区,在NTFS文件系统中则不存在。NTFS文件系统使用的是“磁盘上的任何事物都为文件”的存储模式,甚至连系统使用的引导文件数据,都作为文件存储在磁盘上。

了解文件系统的数据结构和扇区存储规律,是对物理硬盘扇区进行读写操作的基础,也是将扇区读写技术应用于系统修复和文件恢复的先决条件。因为一个硬盘上有很多逻辑驱动器,这些逻辑驱动器可能使用不同的文件系统,而对于不同的文件系统,读写与分析扇区数据的方法是完全不相同的。

本章先介绍FAT文件系统的数据结构。

1.1 主引导记录

NTFS文件系统扇区存储探秘
硬盘的主引导记录也称MBR,存储在0柱面0磁头1扇区。如果读写扇区时采用线性寻址方式,则该扇区的编号为“0”。在本书后面的章节里,扇区地址全部使用线性寻址方式来表示。该扇区的512字节有3部分内容,除了主引导记录外,还有分区表和结束标志55 AA。

主引导记录的作用非常重要,它是硬盘启动时最先加载的扇区数据。下面通过分析硬盘的启动过程,来说明它的重要性。

(1)计算机系统接通电源以后,主板BIOS加电进行自检。自检的内容很多,是一个很复杂的过程,这里只介绍与硬盘有关的部分。

(2)将硬盘第1个扇区,也就是0柱面0磁头1扇区(线性寻址时是0号扇区)的内容

读入内存。

(3)检查结束标志,也就是扇区最后两个字节的值是否等于“aa55H”(存储顺序是低字节在前,高字节在后)。若不等则打印屏幕提示,然后死机。

(4)执行主引导记录中的程序,将控制权转交给主引导程序。

(5)主引导程序首先将自己读入内存,然后查找在分区表中是否有活动分区。找到活动分区以后,将分区引导记录读入内存。

(6)检查结束标志是否等于“aa55H”,然后执行分区引导记录中的启动程序,将控制权交给操作系统。

(7)操作系统加载系统文件,计算机启动。

通过对以上过程的分析可以看出,如果主引导记录不正常,后面所有的启动过程都不可能正常执行。

有一种特殊情况,使计算机启动过程的前两步与上面介绍的不一样。如果硬盘上安装了多系统引导软件,如Partition Magician分区软件,则该软件将主引导记录替换成自己的一段程序。这段程序将BIOS引向软件设置的专用分区,然后根据操作者的选择激活某一个分区,再进入正常的启动过程。类似Partition Magician这样的分区软件还有很多,它们各有自己的特点,这些第三方软件都不在本书的讨论范围之内。通常情况下,一块硬盘上只有一个主引导记录。

现在用“读硬盘扇区数据.EXE”程序将一块硬盘的主引导记录读出,程序运行界面如图1-1所示。“读硬盘扇区数据.EXE”程序将在《工具篇》中介绍,现在先使用该程序的运行结果。

screenshot

图1-1所示的左图是程序运行的主窗口。在主窗口的编辑框中显示了数值“10084”,这是主引导记录所在扇区中,全部字节的累加算术和。为什么要取这个数值的原因将在《工具篇》中详细说明。

图1-1所示的右图是程序运行后弹出的对话框。该对话框中显示了512字节的十六进制值,每行显示16字节,共显示32行。

在图1-1中,位移从00H到1bdH就是主引导记录。如果用扇区内的字节编号来表示某一字节,设起始号为1,就是从第1到第446字节。为什么要使用位移和扇区内编号这两种计算方式呢?因为在今后分析扇区数据时,或者是手工编制扇区中的字节数据时,某些场合用编号计算是比较方便的。

譬如在《工具篇》中介绍的“修改扇区文件数据.EXE”程序,可以将每个扇区的512字节,按照每行16字节,一共32行的格式显示在屏幕上。如果从1开始编号,则感觉很有对称性,容易查找某一字节。如果用位移值计算,就感觉不太方便。

字节位移是从0开始计数,而字节编号是从1开始编号,所以对同一字节来说,字节编号的值要比字节位移的值大1。

位移从1beH到1fdH是分区表,字节编号为447到510。有关分区表的内容在下一节讨论。

最后两字节是结束标志“55 AA”。因为两字节组成一个字,写入磁盘的顺序是低字节在前,高字节在后,所以“55 AA”写成十六进制应为“aa55H”。

结束标志“55 AA”是查找系统数据扇区的标志,据此对扇区进行搜索,可用于寻找主引导记录、主分区表或分区链表所在的扇区地址,也可以具此查找分区引导记录的扇区地址。

主引导记录扇区所在的磁道,通常称为0磁道,它属于隐藏磁道,这个磁道的63个扇区属于隐藏扇区。操作系统的所有命令,除了FDISK以外都不能访问它们。就连格式化程序FORMAT,对这些隐藏扇区也无能为力。

主引导记录和主分区表的数据,只占用了0磁道的第1个扇区,系统对其他的62个扇区弃之不用。正因为如此,0磁道的剩余62个扇区就成了一些病毒程序代码、操作系统的引导代码、应用软件用于自我保护的识别标记、BIOS功能扩展程序代码的栖息之地。

经常监测并分析0磁道的扇区数据变化,就能发现很多不为人知的秘密,作者举一例来说明这个问题。

美国的MACROMEDIA公司堪称网页制作软件的鼻祖,该公司的三大软件颇具影响力。这三款软件是:网页制作软件DREAMWEAVER MX、图象处理软件FIREWORKS MX和动画制作软件FLASH MX。

这三款软件有试用版,从操作者安装使用开始,时间限制为30天。超过试用期后,软件就不能运行了。即使重新安装操作系统和这三款软件,甚至将硬盘格式化或重新分区,也无济于事。

那么这三款软件采用了什么保护机制呢?作者通过对0磁道扇区数据的监测,发现了这三款软件的一个秘密。

这三款软件中的每一款软件安装以后,都会向0磁道的第32扇区写入一部分识别代码。当操作者对逻辑盘进行格式化,或是对整个硬盘重新分区时,所运行的程序都不会访问第32扇区,所以软件的时间限制仍然有效。

作者用扇区清零程序将32扇区的数据清掉,然后再安装这三款软件的试用版,则可以继续使用了。

采取这种保护方式的软件还有很多,只要经常监测0磁道并用心去分析,就能发现许多不为人知的秘密。

下面用作者使用的两块硬盘运行“监视0磁道变化.EXE”程序,将两块硬盘的0磁道63个扇区的数据分别读出,然后进行比较。所使用的工具程序在《工具篇》中再详细介绍。

先看一块新硬盘的显示数据,如图1-2所示。

screenshot

图1-2所示的扇区编号没有使用线性寻址的表示方法,而是使用了1~63的编号方式,这是为了强调在硬盘的结构中,每磁道有63个扇区的虚拟物理概念。

从图1-2所示的扇区字节算术和可以看出,只有第1扇区写有数据,其他62个扇区全部为0。这是因为该硬盘使用不久,还没有写入其他程序的垃圾代码。

再看一块老硬盘的显示数据,如图1-3所示。

如图1-3所示,除了第1扇区写有系统引导数据以外,还有很多扇区也写有数据。与第1扇区字节算术和相同的,如第6扇区,是作者备份的系统数据,目的是日后出现引导故障时修复硬盘。与第1扇区字节算术和不相同的扇区,就是硬盘使用三年多来,各种应用软件写入的垃圾代码。

screenshot

相关文章
|
6月前
|
存储 C语言
数据结构中的线性表链式存储介绍及其基本操作
链式存储是线性表的一种重要存储方式,它通过节点和指针的结构,实现了灵活的动态存储管理。本文介绍了单向链表的基本操作,并提供了相应的C语言代码示例。理解和掌握链表的操作对学习和应用数据结构具有重要意义。希望这篇博客能帮助你更好地理解线性表的链式存储。
135 2
|
2月前
|
存储 安全 数据库
除了 HashMap,还有哪些数据结构可以实现键值对存储?
【10月更文挑战第11天】 除了`HashMap`,其他常见支持键值对存储的数据结构包括:`TreeMap`(基于红黑树,键有序)、`LinkedHashMap`(保留插入顺序)、`HashTable`(线程安全)、`B-Tree`和`B+Tree`(高效存储大量数据)、`SkipList`(通过跳跃指针提高查找效率)及`UnorderedMap`(类似`HashMap`)。选择合适的数据结构需根据排序、并发、存储和查找性能等需求。
|
3月前
|
存储 Java
java数据结构,线性表链式存储(单链表)的实现
文章讲解了单链表的基本概念和Java实现,包括头指针、尾节点和节点结构。提供了实现代码,包括数据结构、接口定义和具体实现类。通过测试代码演示了单链表的基本操作,如添加、删除、更新和查找元素,并总结了操作的时间复杂度。
java数据结构,线性表链式存储(单链表)的实现
|
3月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
443 8
|
3月前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
|
3月前
|
存储 机器学习/深度学习 C语言
数据结构基础详解(C语言): 树与二叉树的基本类型与存储结构详解
本文介绍了树和二叉树的基本概念及性质。树是由节点组成的层次结构,其中节点的度为其分支数量,树的度为树中最大节点度数。二叉树是一种特殊的树,其节点最多有两个子节点,具有多种性质,如叶子节点数与度为2的节点数之间的关系。此外,还介绍了二叉树的不同形态,包括满二叉树、完全二叉树、二叉排序树和平衡二叉树,并探讨了二叉树的顺序存储和链式存储结构。
|
3月前
|
存储 算法 C语言
C语言手撕数据结构代码_顺序表_静态存储_动态存储
本文介绍了基于静态和动态存储的顺序表操作实现,涵盖创建、删除、插入、合并、求交集与差集、逆置及循环移动等常见操作。通过详细的C语言代码示例,展示了如何高效地处理顺序表数据结构的各种问题。
|
3月前
|
存储 Java
java数据结构,线性表顺序存储(数组)的实现
文章介绍了Java中线性表顺序存储(数组)的实现。线性表是数据结构的一种,它使用数组来实现。文章详细描述了线性表的基本操作,如增加、查找、删除、修改元素,以及其他操作如遍历、清空、求长度等。同时,提供了完整的Java代码实现,包括MyList接口和MyLinearList实现类。通过main函数的测试代码,展示了如何使用这些方法操作线性表。
|
4月前
|
存储 Java
数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储
这篇文章通过Java代码示例展示了如何实现哈希表,包括定义结点类、链表类、数组存储多条链表,并使用简单的散列函数处理冲突,以及如何利用哈希表存储和查询学生信息。
数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储
|
4月前
|
存储 缓存 算法
深入解析B树:数据结构、存储结构与算法优势
深入解析B树:数据结构、存储结构与算法优势