您的位置:首页 > 其它

数据恢复软件设计与实现(七)

2013-11-09 21:38 246 查看
6  NTFS文件系统介绍

NTFS文件系统是随着Windows NT操作系统诞生的,名字都有相似之处。NTFS有很多的特点:安全性、可恢复性、文件压缩、磁盘配额、B-树文件管理。这些特点是文件系统具有极高的安全性和稳定性,在使用中不易产生碎片。

微软未公布NTFS细节及实现,只有一些开源文档揭秘,这些资料目前看来是正确的,但其正确性有待验证,所以深入的研究是不得而知的,这对解析NTFS文件系统都有一定的困难,参考了很多资料也解析不了完整的NTFS。国内出版的书只是很浅显地介绍了文件系统的几个基本概念,比如结构、属性、元文件,这些资料遍地都是,泛滥得一塌糊涂。其实NTFS的核心是B-树(很多资料错误地写成B+树),B-树实现文件的动态管理,文件/目录的创建、修改、删除等操作都会引起B-树的变化,极其复杂。研究了很久终不得要领,只简单地理解大概的B-树。以下首先介绍NTFS文件系统的结构,然后具体介绍B-树。

6.1 NTFS结构

虽然NTFS和FAT32有很大区别,但是它们的结构是有共通之处的。NTFS大概的结构如下图6-1所示。$Boot包含了引导扇区。$MFT是主文件表,是NTFS结构的核心。最后的一个扇区是$Boot引导扇区的备份,其实它不是不分区内的结构,是属于分区外的一个扇区备份,它的大小不算入分区大小,从FAT32文件系统转换成NTFS是没有后面的$Boot扇区备份的。理解NTFS文件系统结构的最关键的概念:一切东西都是文件。所以其他的元文件都是文件,不作为特殊的结构列出。和FAT32一样,数据也是以簇为单位来存储。



6.2 NTFS引导扇区
NTFS的引导扇区是元文件$Boot中的一部分。它的结构和FAT32的类似,习惯上称为DBR,大概结构如图6-2所示。其中BPB的参数含义如下表6-1。



表6-1 NTFS文件系统BPB参数含义
偏移
长度(字节)
含义

偏移
长度(字节)
含义

0x0B
2
每扇区字节数

0x0D
1

每簇扇区数

0x0E
2
保留扇区

0x10
3
总是0

0x13
2
未使用

0x15
1
介质描述符

0x16
2
未用

0x18
2
每磁道扇区数

0x1A
2
磁头数

0x1C
4
隐藏扇区

0x20
4
未使用

0x24
4
总为80008000

0x28
8
扇区总数
0x30
8
$MFT起始簇号

0x38
8
$MFTMirr起始簇号
0x40
1
文件记录大小描述

0x41
3
未使用
0x44
1
索引缓冲大小

0x45
3
未用
0x48
8
卷序列号
0x50
4
校验和
 
 
 
 

6.3 NTFS文件记录

在NTFS文件系统中,磁盘上所有数据都是以文件的形式存在的,即使是文件系统的管理信息也是以一组文件的形式存储。每个文件都有一个文件记录,这些记录就是存放在主文件表中,即MFT。MFT是NTFS最重要部分,因为它记录着所有文件的信息。MFT在建立文件系统的时候就创建好了,它的位置是不定的,所以在引导扇区中有指向MFT的记录,这样系统就可以找得到MFT,也就能找到文件了。MFT由很多个文件记录组成,每个记录对应着不同的文件,每个记录大小由BPB参数确定,目前微软操作系统中,每个记录大小都是1KB。每个MFT记录有一定的结构:文件记录头和多个属性,如图6-3所示,文件记录头的具体含义如表6-2。



图6-3 NTFS文件记录结构

表6-2 NTFS文件记录头含义
偏移

长度

含义

0x00

4

MFT标志,“FILE”

0x04

2

更新序列号(USN)的偏移

0x06

2

更新序列号的大小和数组

0x08

8

日志文件序列号

0x10

2

序列号

0x12

2

硬链接数

0x14

2

第一个属性的偏移地址

0x16

2

标志,00H表示文件被删除,01H表示文件正在使用,02H表示目录被删除,03H表示目录正在使用

0x18

4

文件记录的实际长度

0x1C

4

文件记录的分配长度

0x20

8

基本文件记录中的文件索引号

0x28

2

下一个属性ID

0x2A

2

边界

0x2C

4

文件记录参考号

0x30

2

更新序列号

0x32

4

更新数组

其中,文件记录头最重要的是MFT标志,这个标志标识是一个文件记录,没有这个记录不行,后面的数据恢复也使用到这个标志。

6.4 NTFS属性

NTFS属性有多种,不同的属性也有一定的结构。属性一般分为常驻属性和非常驻属性。常驻就是属性的所有数据都存在文件记录内;非常驻属性的一部分数据存储在另外开辟的区域内,存储在文件记录外的数据叫数据流(Data Run)。属性由属性头和属性体构成,其中常驻属性和非常驻属性的属性头和属性体又不一样,属性分为有属性名和没有属性名的,所以综合起来有四种不同的属性结构:常驻没有属性名、常驻有属性名、非常驻没有属性名和非常驻有属性名。忽略属性名,列出常驻和非常驻属性结构,如表6-3、表6-4。

表6-3 常驻属性

偏移
长度
含义
0x00
4
属性类型

0x04
4
属性长度

0x08
1
是否为常驻属性(00表示常驻,01表示非常驻)

0x09
1
属性名长度

0x0A
2
属性名的开始偏移

0x0C
2
压缩、加密、稀疏标志

0x0E
2
属性ID

0x10
4
属性体的长度(L)

0x14
2
属性体的开始偏移

0x16
1
索引标志

0x17
1
无意义

0x18
L
属性体

 

表6-4 非常驻属性
偏移
长度
含义
0x00
4
属性类型

0x04
4
属性长度

0x08
1
是否为常驻属性(00表示常驻,01表示非常驻)

0x09
1
属性名长度

0x0A
2
属性名的开始偏移

0x0C
2
压缩、加密、稀疏标志

0x0E
2
属性ID

0x10
8
属性体的起始虚拟簇号(VCN)

0x18
8
属性体的结束虚拟簇号

0x20
2
Run List偏移地址

0x22
2
压缩单位大小

0x24
4
无意义

0x28
8
属性体的分配大小

0x30
8
属性体的实际大小

0x38
8
属性体的初始大小

0x40
 
属性体的Run List信息

其中,Run List是最难理解,也是最重要的。当属性不能存放完数据,系统就会在NTFS数据区域开辟一个空间存放,这个区域是以簇为单位的。Run List就是记录这个数据区域的起始簇号和大小,一个Run List例子如图6-4所示。这个示例中,Run List的值为“31 40 00 00 04”,因为后面是00H,所以知道已经是结尾。如何解析这个Run List呢?如图6-5所示, 第一个字节是压缩字节,高位和低位相加,3+1=4,表示这个Data Run信息占用四个字节,其中高位表示起始簇号占用多少个字节,低位表示大小占用的字节数。在这里,起始簇号占用3个字节,值为40000H,大小占用1个字节,值为40H。解析后,得到这个数据流起始簇号为262144,大小为64簇。



图6-4 Run List例子



图6-5 Run List结构及含义

系统定义的属性有15个,如表6-5所示。

表6-5 NTFS文件系统属性
编号
名称
作用
10H
$STANDARD_INFORMATION
标准属性,包含文件的基本信息
20H
$ATTRIBUTE_LIST
属性列表
30H
$FILE_NAME
文件名
40H
$OBJECT_ID
对象ID
50H
$SECURITY_DESCRIPTOR
安全描述符
60H
$VOLUME_NAME
简单包含卷名称
70H
$VOLUME_INFORMATION
说明卷的版本和状态
80H
$DATA
数据属性
90H
$INDEX_ROOT
索引根属性
A0H
$INDEX_ALLOCATION
索引分配属性
B0H
$BITMAP
位图属性
C0H
$REPARSE_POINT
重解析点属性
D0H
$EA_INFORMATINO
扩展属性信息属性
E0H
$EA
扩展属性
100H
$LOGGED_UTILITY_STREAM
EFS加密属性
在这些属性中,重要的有10H、30H、80H、90H、A0H和B0H。

10H是包含文件的一些基本信息,如文件的传统属性、文件创建时间和最后修改时间、有多少目录指向该文件等。

30H用来存储文件名,它是常驻属性。

80H就是存储文件的内容,它没有最大最小限制,如果文件内容实在太小,就存在MFT记录中,不过一般都是存储在MFT外的。

90H是根索引属性,实现NTFS的B-索引树的根节点,它是常驻属性,在根目录项比较少的情况下会使用,如果文件项多,则使用到了A0H属性。

A0H是索引分配属性,它是一个索引的基本结构,存储着组成索引的B-树目录所有子节点的定位信息,它是常驻,并且没有最大最小限制。该属性实现B-树的大目录,在后面详细讲解。

B0H是位图属性,它由一系列的位构成的虚拟簇(VCN)使用情况表,没有最大最小。在两个地方使用到该属性:索引和$MFT,索引中,每一位代表索引分配中的一个VCN;在$MFT中,每一位代表一个文件记录使用情况。其中每一位中的0代表未使用,1代表正在使用。

在所有合法属性之后,以“FFFFFFFF”表示结束。

值得一提的是,有时候一个MFT记录中会出现两个一样的属性,这是很正常的。但是特殊的情况是一个结束标志之后还有某个属性,如A0H属性,然后后面还有一个结束标志,这种情况下就以第一个结束标志为准,后面的信息都不要了,只是前面的修改留下来而已,系统并不会清除。

6.5 NTFS元文件
元文件就是一些文件系统的记录,记录卷的基本信息,它在创建文件系统的时候建立,这些元文件和一般的文件记录都是一样的。文件系统已经规定好元文件,每个元文件都有固定顺序,元文件的文件名的第一个字符都是“$”,表示该文件是隐藏的,用户无法访问和修改,元文件如表6-6所示。

表6-6 NTFS文件系统元文件
序号
元文件
功能
0
$MFT

主文件表,是每个文件的索引

1
$MFTMirr

主文件表的镜像(部分)

2
$LogFile

事务型日志文件

3
$Volume

卷文件,记录卷标等信息

4
$AttrDef

属性定义列表文件

5
$Root

根目录文件,管理根目录

6
$Bitmap

位图文件,记录簇使用情况

7
$Boot

引导文件

8
$BadClus

坏簇列表文件

9
$Quota

早期版本使用的磁盘配额信息

10
$Secure

安全文件

11
$Upcase

大小写字符转换表文件

12
$Extend metadata directory

扩展元数据目录

13
$Extend\$Reparse

重解析点文件

14
$Extend\$UsnJrnl

加密日志问文件

15
$Extend\$Quota

配额管理文件

16
$Extend\$ObjId

对象ID文件

其中,主要的元文件有$MFT、$Root、$Bitmap。

$MFT文件就是所有的文件记录,占用整个磁盘大小的12%。

$Root是根目录,和FAT32一样,文件系统都需要一个入口,这个元文件就是入口,说白了,查找B-就是从这里开始的。
$Bitmap元文件来用管理卷上簇的使用情况。它的数据流由一系列位构成,每一位代表一个VCN。低位代表了前面的簇,高位代表后面的簇。该属性的数据流大小由卷大小决定的,并且在一开始就创建好数据流,并且标志好哪些簇已经使用,哪些簇没使用。

还有哦,继续加油~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据恢复