一、分析NTFS文件系统的结构

当用户将硬盘的一个分区格式化为NTFS分区时,就建立了一个NTFS文件系统。NTFS文件系统同FAT32文件系统一样,也是用“簇”为存储单位,一个文件总是占用一个或多个簇。

NTFS文件系统使用逻辑簇号(LCN)和虚拟簇号(VCN)对分区进行管理。

逻辑簇号:既对分区内的第一个簇到最后一个簇进行编号,NTFS使用逻辑簇号对簇进行定位。

虚拟簇号:既将文件所占用的簇从开头到尾进行编号的,虚拟簇号不要求在物理上是连续的。

NTFS文件系统一共由16个“元文件”构成,它们是在分区格式化时写入到硬盘的隐藏文件(以”$”开头),也是NTFS文件系统的系统信息。

NTFS的16个元文件介绍:

首先找到该分区的起始扇区,具体可以参考MBR分区结构、DPT分区表、EBR扩展引导这篇文章。

二、分析$Boot文件

$Boot元文件由分区的第一个扇区(既DBR)和后面的15个扇区(既NTLDR区域)组成,其中DBR由“跳转指令”、“OEM代号”、“BPB”、“引导程序”和“结束标志”组成,这里和FAT32文件系统的DBR一样。下图是一个NTFS文件系统完整的DBR。

下面我们分析一下DBR中的各参数

EB 58 90:(跳转指令)本身占2字节它将程序执行流程跳转到引导程序处。

“EB 58 90″清楚地指明了OS引导代码的偏移位置。jump 52H加上跳转指令所需的位移量,即开始于0×55。

4E 54 46 53 20 20 20 20:(OEM代号)这部分占8字节,其内容由创建该文件系统的OEM厂商具体安排。为“NTFS”。

BPB:NTFS文件系统的BPB从DBR的第12个字节开始,占用73字节,记录了有关该文件系统的重要信息,下表中的内容包含了“跳转指令”、“OEM代号”以及“BPB”的参数。

对照上面的BPB分析如下:

02 00:每个扇区512个字节

08:每个簇8个扇区

00 00:保留扇区为0

00 00 00:为0

00:不使用

F8:为硬盘

00 00:为0

00 3F:每磁道63个扇区

00 FF:每柱面255个磁头

00 00 00 3F:隐藏扇区数(MBR到DBR)

00 00 00 00:不使用

80 00 80 00:不使用

00 00 00 00 0C 80 33 FF:扇区总数209728511

00 00 00 00 00 00 00 03:$MFT的开始簇号

00 00 00 00 00 85 57  80:$MFTmirr的开始簇号

00 00 00 F6:每个MFT记录的簇数

00 00 00 01:每索引的簇数

B8 11 2A 0C B8 11 2A 0C:分区的逻辑序列号

引导程序:DBR的引导程序占用426字节,其负责完成将系统文件NTLDR装入,对于没有安装系统的分区是无效的。

结束标志:DBR的结束标志与MBR,EBR的结束标志相同,为“55 AA”。

三、分析$MFT元文件

在NTFS文件系统中,磁盘上的所有数据都是以文件的形式存储,其中包括元文件。每个文件都有一个或多个文件记录,每个文件记录占用两个扇区,而$MFT 元文件就是专门记录每个文件的文件记录。由于NTFS文件系统是通过$MFT来确定文件在磁盘上的位置以及文件的属性,所以$MFT是非常重要 的,$MFT的起始位置在DBR中有描述。$MFT的文件记录在物理上是连续的,并且从0开始编号。$MFT的前16个文件记录总是元文件的,并且顺序是 固定不变的。

四、分析文件记录

1、文件记录的结构

文件记录由两部分构成,一部分是文件记录头,另一部分是属性列表,最后结尾是四个“FF”。如下是一个完整的文件记录:

在同一系统中,文件记录头的长度和具体偏移位置的数据含义是不变的,而属性列表是可变的,其不同的属性有着不同的含义。后文将对属性进行具体分析,先来看看文件记录头的信息。

在NTFS文件系统中所有与文件相关的数据结构均被认为是属性,包括文件的内容。文件记录是一个与文件相对应的文件属性数据库,它记录了文 件的所有属性。每个文件记录中都有多个属性,他们相对独立,有各自的类型和名称。每个属性都由两部分组成,既属性头和属性体。属性头的前四个字节为属性的 类型。如下是以10H属性为例的属性结构。

另外属性还有常驻与非常驻之分。当一个文件很小时,其所有属性体都可以存放在文件记录中,该属性就称为常驻属性。如果某个文件很大,1KB的文件记 录无法记录所有属性时,则文件系统会在$MFT元文件之外的区域(也称数据流)存放该文件的其他文件记录属性,这些存放在非$MFT元文件内的记录就称为 非常驻属性。

分析属性的属性头

每个属性都有一个属性头,这个属性头包含了一些该属性的重要信息,如属性类型,属性大小,名字(并非都有)及是否为常驻属性等。

常驻属性的属性头分析表:

如下是非常驻属性的属性头分析表:

前面说过了,属性的种类有很多,因此各属性体的含义也不同。下表是NTFS文件系统中的所有属性体的简介。

接下来来看几个重要的属性:

分析10H属性:

10H类型属性它包含文件的一些基本信息,如文件的传统属性,文件的创建时间和最后修改时间和日期,文件的硬链接数等等。如下:是一个10H类型的属性。

其中偏移0×20处的文件属性解释如下:

分析20H属性

20H类型属性既属性列表,当一个文件需要好几个文件记录时,才会用到20H属性。20H属性记录了一个文件的下一个文件记录的位置。如下:是20H属性的解释。

分析30H属性

30H类型属,该属性用于存储文件名 ,它总是常驻属性。最少68字节,最大578字节,可容纳最大Unicode字符的文件名长度。

分析80H属性

80H属性是文件数据属性,该属性容纳着文件的内容,文件的大小一般指的就是未命名数据流的大小。该属性没有最大最小限制,最小情况是该属性为常驻属性。常驻属性就不做多的解释了,上面我标记的是一个非常驻的80H属性。

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

虽然数据不一样,但是表达的意思是一样的。

分析90H属性

90H属性是索引根属性,该属性是实现NTFS的B+树索引的根节点,它总是常驻属性。该属性的结构如下图:

索引根的结构如表:

索引头的结构如表:

索引项结构如表:

分析A0H属性

A0属性是索引分配属性,也是一个索引的基本结构,存储着组成索引的B+树目录索引子节点的定位信息。它总是常驻属性。如下:是一个A0H属性的实例。

根据上图A0H属性的“Run List”可以找到索引区域,偏移到索引区域所在的簇,如下图:

起始簇:18265

簇大小:3

起始扇区号 = 该分区的其实扇区 + 簇号 * 每个簇的扇区数     也就是

64 + 18265 * 8 = 146124

对了,上面的偏移0×28还要加上0×18 = 0×40.

标准索引头的解释如下:

索引项的解释如下:

到此一些常用属性基本介绍的差不多了。

下面来说下遍历一个分区下面文件列表的思路:

1、定位DBR,通过DBR可以得知“$MFT”的起始簇号及簇的大小。

2、定位“$MFT”,找到“$MFT”后,在其中寻找根目录的文件记录,一般在5号文件记录。

3、在90H属性中得到B+树索引的根节点文件信息,重点在A0属性上。通过属性中的“Run List”定位到其数据流。

4、从“Run List”定位到起始簇后,再分析索引项可以得到文件名等信息。

5、从索引项中可以获取“$MFT”的参考号,然后进入到“$MFT”找到对应的文件记录。

6、然后再根据80H属性中的数据流就可以找到文件真正的数据了。

原文链接:http://www.blogfshare.com/detail-ntfs-filesys.html

原著:alone monkey的博客

详解NTFS文件系统的更多相关文章

  1. 详解ios文件系统文件目录读写操作-备用

    iPhone文件读写系统操作教程是本文要介绍的内容,对于一个运行在iPhone得app,它只能访问自己根目录下得一些文件(所谓sandbox).一个app发布到iPhone上后,它得目录结构如下:  ...

  2. 使用 /proc 文件系统来访问 linux操作系统 内核的内容 && 虚拟文件系统vfs及proc详解

    http://blog.163.com/he_junwei/blog/static/19793764620152743325659/ http://www.01yun.com/other/201304 ...

  3. [转帖]Linux文件系统详解

    Linux文件系统详解 https://www.cnblogs.com/alantu2018/p/8461749.html 贼复杂.. 从操作系统的角度详解Linux文件系统层次.文件系统分类.文件系 ...

  4. Linux下的文件目录结构详解

    Linux下的文件目录结构详解 / Linux文件系统的上层根目录 /bin 存放用户可执行的程序 /boot 操作系统启动时所需要的文件 /dev 接口设备文件目录,例如:had表示硬盘 /etc ...

  5. hdfs文件系统架构详解

    hdfs文件系统架构详解 官方hdfs分布式介绍 NameNode *Namenode负责文件系统的namespace以及客户端文件访问 *NameNode负责文件元数据操作,DataNode负责文件 ...

  6. [自制操作系统] JOS文件系统详解&支持工作路径&MSH

    本文分为两部分: 第一部分将详细分析JOS的文件系统及文件描述符的实现方法. 第二部分将实现工作路径,提供新的系统调用,完善用户空间工具. 本文中支持的新特性: 支持进程工作目录 提供getcwd与c ...

  7. Linux文件系统的目录结构详解

    Linux文件系统的目录结构详解   一.前 言 文章对Linux下所有目录一一说明,对比较重要的目录加以重点解说,以帮助初学者熟练掌握Linux的目录结构. 二.目 录 1.什么是文件系统 2.文件 ...

  8. proc文件系统详解(原创)

    Linux系统上的/proc目录是一种文件系统,即proc文件系统.与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过 ...

  9. 转载]OK6410之tftp下载内核,nfs挂载文件系统全过程详解[转]

    原文地址:OK6410之tftp下载内核,nfs挂载文件系统全过程详解[转]作者:千山我独行 由于工作的平台也是嵌入式,差不多的平台,所以一直就没有把自己买过来的ok6410板子好好玩玩.以前一直都是 ...

随机推荐

  1. ++i与i++的区别

    1. ++i 和 i++,在单独使用时,就是 i=i+1. 2. a = ++i,相当于 i=i+1; a = i; (先i = i + 1,再使用i的值).也可以写成 i++; a=i 3. a = ...

  2. Uva10635 LCS

    题目链接:http://vjudge.net/contest/137498#problem/G 题意:有两个长度为p+1和q+1的序列,每个序列的中的各个元素互不相同,且都是1~n^2之间的整.两个序 ...

  3. 关于JSP页面字段属性设为disabled或者readonly所带来的问题总结

    最近需要将页面一些自动求和的字段设为不可操作,当然disabled和readonly都可以实现,但是我的页面需求是来录入数据的,当用disabled时,该字段值是无法被获取并传到后台的,这时如果使用r ...

  4. Hadoop中几个基本命令行命令

    对HDFS操作的几个命令(必须是Hadoop命令,否则只是对本地操作) 1. 查看HDFS中某个目录或文件的包含哪些文件和文件夹: bin/hadoop dfs/fs -ls 文件(夹)路径 若是非空 ...

  5. myeclipse操作记录

    myeclipse里面jsp页面里面js注释快捷键 ctrl + shift +cctrl + / MyEclipse 每次保存都要building workspace的解决方法 方法一:菜单栏-&g ...

  6. ural 1341. Device

    1341. Device Time limit: 1.0 secondMemory limit: 64 MB Major (M): You claimed that your device would ...

  7. Word: How to Temporarily Disable Spell Check in Word

    link: http://johnlamansky.com/tech/disable-word-spell-check/ 引用: Word 2010 Click the “File” button C ...

  8. So you want to be a 2n-aire?[HDU1145]

    So you want to be a 2n-aire?Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...

  9. BZOJ1950 : [Ceoi2006]Link

    显然在最优解中,添加的边都是从$1$出发的. 这个图是一个环套树的结构,对于树的部分,显然叶子节点必须加边. 因此可以自底向上确定树中哪些节点需要加边,同时得到$1$到环上每个点的距离. 对于每个环, ...

  10. BZOJ4384 : [POI2015]Trzy wieże

    首先只有一种字符的情况可以通过双指针在$O(n)$的时间内处理完毕. 设$cnt[i][j]$表示前$i$个字符中$j$字符出现的次数,那么对于两个位置$j<i$: 如果 $cnt[i][0]- ...