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

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。低位代表了前面的簇,高位代表后面的簇。该属性的数据流大小由卷大小决定的,并且在一开始就创建好数据流,并且标志好哪些簇已经使用,哪些簇没使用。



还有哦,继续加油~

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值