mft文件记录属性头包括_关于NTFS-MFT
一、Ntfs文件系统在磁盘上的分布
一个ntfs文件系统由引导扇区、MFT(包含MFT元数据)和数据区组成。
NTFS中存储了两份MFT备份以防MFT文件损坏,两个MFT备份的具体起始位置都存储在引导扇区中。
image.png
二、引导扇区($Boot)
引导扇区是从NTFS文件系统的第一个扇区开始,以55 AA结尾。我们主要关注前88字节的信息,其中重要的就是“NTFS”标识、扇区大小、每簇扇区数、MFT起始簇以及MFT备份MFTMirr位置这些信息。我们可以根据MFT起始簇信息找到MFT,或者根据MFT备份MFTMirr位置找到MFT的另外一个MFT备份。如下图所示:
image.png
1 typedef struct NTFS_BPB{ // 在cmd 输入 fsutil fsinfo ntfsinfo d: 查询 NTFS 信息
2 UCHAR jmpCmd[3];
3 UCHAR s_ntfs[8]; // "NTFS " 标志
4 // 0x0B
5 UCHAR bytesPerSec[2]; // 0x0200 扇区大小,512B
6 UCHAR SecsPerClu; // 0x08 每簇扇区数,4KB
7 UCHAR rsvSecs[2]; // 保留扇区
8 UCHAR noUse01[5]; //
9 // 0x15
10 UCHAR driveDscrp; // 0xF8 磁盘介质 -- 硬盘
11 UCHAR noUse02[2]; //
12 // 0x18
13 UCHAR SecsPerTrack[2]; // 0x003F 每道扇区数 63
14 UCHAR Headers[2]; // 0x00FF 磁头数
15 UCHAR secsHide[4]; // 0x3F 隐藏扇区
16 UCHAR noUse03[8]; //
17 // 0x28
18 UCHAR allSecsNum[8]; // 卷总扇区数, 高位在前, 低位在后
19 // 0x30
20 UCHAR MFT_startClu[8]; // MFT 起始簇
21 UCHAR MFTMirr_startClu[8]; // MTF 备份 MFTMirr 位置
22 //0x40
23 UCHAR cluPerMFT[4]; // 每记录簇数 0xF6
24 UCHAR cluPerIdx[4]; // 每索引簇数
25 //0x48
26 UCHAR SerialNum[8]; // 卷序列号
27 UCHAR checkSum[8]; // 校验和
28 }Ntfs_Bpb,*pNtfs_Bpb;
三、主文件表 (Master File Table, MFT)
MFT是什么,什么作用?
在NTFS中,整个卷的所有文件信息(包括MFT本身、数据文件、文件夹等等)都存储在MFT。每一个文件在 MFT 中都有一个或多个 MFT 项记录文件属性信息。而且每项大小是固定的(一般为1KB),MFT保留了前16项用于特殊文件记录,称为元数据。
可以根据MFT快速的找到文件的详细信息和具体位置等。
image.png
1、MFT项
一个MFT项包括MFT头和关于文件的4条属性,以FF FF FF FF结尾。
image.png
(一)MFT头部
在一个MFT项中前56字节是MFT头部信息,其中比较重要的是FILE标识、第一个属性的偏移和flags。
flags显示了此文件是否是正常文件,或者是删除文件等。
image.png
1 typedef struct MFT_HEADER{
2 UCHAR mark[4]; // "FILE" 标志
3 UCHAR UsnOffset[2]; // 更新序列号偏移 30 00
4 UCHAR usnSize[2]; // 更新序列数组大小+1 03 00
5 UCHAR LSN[8]; // 日志文件序列号(每次记录修改后改变) 58 8E 0F 34 00 00 00 00
6 // 0x10
7 UCHAR SN[2]; // 序列号 随主文件表记录重用次数而增加
8 UCHAR linkNum[2]; // 硬连接数 (多少目录指向该文件) 01 00
9 UCHAR firstAttr[2]; // 第一个属性的偏移 38 00
10 UCHAR flags[2]; // 0已删除 1正常文件 2已删除目录 3目录正使用
11 // 0x18
12 UCHAR MftUseLen[4]; // 记录有效长度 A8 01 00 00
13 UCHAR maxLen[4]; // 记录占用长度 00 04 00 00
14 // 0x20
15 UCHAR baseRecordNum[8]; // 索引基本记录, 如果是基本记录则为0
16 UCHAR nextAttrId[2]; // 下一属性Id 07 00
17 UCHAR border[2]; //
18 UCHAR xpRecordNum[4]; // 用于xp, 记录号
19 // 0x30
20 UCHAR USN[8]; // 更新序列号(2B) 和 更新序列数组
21 }Mft_Header, *pMft_Header;
(二)MFT项的4个属性
每条属性都包含属性头和属性结构。每条属性的前4字节显示该属性的类型,不同类型的属性有不同的属性结构。
image.png
属性头
1 //------------------ 属性头通用结构 ----
2 typedef struct NTFSAttribute //所有偏移量均为相对于属性类型 Type 的偏移量
3 {
4 UCHAR Type[4]; // 属性类型 0x10, 0x20, 0x30, 0x40,...,0xF0,0x100
5 UCHAR Length[4]; // 属性的长度
6 UCHAR NonResidentFiag; // 是否是非常驻属性,l 为非常驻属性,0 为常驻属性 00
7 UCHAR NameLength; // 属性名称长度,如果无属性名称,该值为 00
8 UCHAR ContentOffset[2]; // 属性内容的偏移量 18 00
9 UCHAR CompressedFiag[2]; // 该文件记录表示的文件数据是否被压缩过 00 00
10 UCHAR Identify[2]; // 识别标志 00 00
11 //--- 0ffset: 0x10 ---
12 //-------- 常驻属性和非常驻属性的公共部分 ----
13 union CCommon
14 {
15 //---- 如果该属性为 常驻 属性时使用该结构 ----
16 struct CResident
17 {
18 UCHAR StreamLength[4]; // 属性值的长度, 即属性具体内容的长度。"48 00 00 00"
19 UCHAR StreamOffset[2]; // 属性值起始偏移量 "18 00"
20 UCHAR IndexFiag[2]; // 属性是否被索引项所索引,索引项是一个索引(如目录)的基本组成 00 00
21 };
22 //------- 如果该属性为 非常驻 属性时使用该结构 ----
23 struct CNonResident
24 {
25 UCHAR StartVCN[8]; // 起始的 VCN 值(虚拟簇号:在一个文件中的内部簇编号,0起)
26 UCHAR LastVCN[8]; // 最后的 VCN 值
27 UCHAR RunListOffset[2]; // 运行列表的偏移量
28 UCHAR CompressEngineIndex[2]; // 压缩引擎的索引值,指压缩时使用的具体引擎。
29 UCHAR Reserved[4];
30 UCHAR StreamAiiocSize[8]; // 为属性值分配的空间 ,单位为B,压缩文件分配值小于实际值
31 UCHAR StreamRealSize[8]; // 属性值实际使用的空间,单位为B
32 UCHAR StreamCompressedSize[8]; // 属性值经过压缩后的大小, 如未压缩, 其值为实际值
33 };
34 };
35 };
具体属性头的大小根据是否是常驻属性来进行计算。
是否是常驻属性根据属性头的第9个字节判断,1为非常驻,0为常驻。
如果是非常驻属性,属性头大小为64;如果是常驻属性,属性头大小为24字节。
常驻和非常驻的区别:
常驻属性是直接保存再MFT中,非常驻属性保存再MFT之外的其他地方。如果文件或文件夹小于1500字节,那么它们的所有属性,包括内容都会常驻在MFT中。
属性结构
不同类型的属性有不同的属性结构,这里主要介绍10H属性、30H属性和80H属性。
(1)10H属性 $STANDART_INFORMATION
image.png
1 struct Value0x10
2 {
3 UCHAR fileCreateTime[8]; // 文件创建时间
4 UCHAR fileChangeTime[8]; // 文件修改时间
5 UCHAR MFTChangeTime[8]; // MFT修改时间
6 UCHAR fileLatVisited[8]; // 文件最后访问时间
7 UCHAR tranAtrribute[4]; // 文件传统属性
8 UCHAR otherInfo[28]; // 版本,所有者,配额,安全等等信息(详细略)
9 UCHAR updataNum[8]; // 文件更新序列号
10 };
关于文件传统属性,对照下表:
image.png
(2)30H属性 $FILE_NAME
这个属性比较重要,包含了文件的详细资料和父目录的参考号等。根据父目录参考号可以知道文件之间的父子关系,从而构建文件的子父关系。
其实在10H属性中已经描述了文件的部分信息(时间、标志等),30H属性主要关注父目录的参考号、文件名命名空间和文件名。
image.png
1 struct Value0x30
2 {
3 UCHAR parentFileNum[8]; // 父目录的文件参考号,前 6B 的文件记录号,后 2B 的文件引用计数;当文件记录号为0x05时,是根目录。
4 UCHAR createTime[8]; // 文件创建时间
5 UCHAR changeTime[8]; // 文件修改时间
6 UCHAR MFTchangeTime[8]; // MFT 修改时间
7 UCHAR lastVisitTime[8] // 最后一次访问时间
8 UCHAR AllocSize[8]; // 文件分配大小
9 UCHAR realSize[8]; // 实际大小
10 UCHAR fileFlag[4]; // 文件标志,系统 隐藏 压缩等等
11 UCHAR EAflags[4] // EA扩展属性和重解析点
12 UCHAR nameLength; // 文件名长
13 UCHAR nameSpace; // 文件命名空间:0 --- POSIX, 1 -- Win32, 2 --- DOS, 3 --- Win32 & DOS
14 //----- Name (Unicode编码) 长度为 2 * nameLength ----
15 }
NTFS通过为一个文件创建多个30H属性实现POSIX (Portable Operating System Interface, 可移植操作系统接口) 式硬连接,每个30H属性都有自己的详细资料和父目录;一个硬连接删除时,就从MFT中删除这个文件名,最后一个硬连接被删除时,这个文件就算是真正被删除了。
(3)80H属性$DATA
LCN(logical cluster number):整个文件卷的相对位置,单位(簇)。
VCN(virtual cluster number):文件内部的相对位置,单位(簇)。
1 struct Value0x80
2 {
3 UCHAR len; // 低4位表示运行簇大小的len,高4位表示起始簇的len
4 UCHAR *filesize; // 运行簇大小
5 UCHAR *start; // 起始簇 LCN/VCN
6 }
每个运行列表中第一个字节的低4位表示运行簇大小(filesize)的len,高4位表示起始簇(start)的len。如果一个运行列表后面的第一个字节是00,说明运行列表结束,后面的数值暂时不用管;如果不是00,则是下一个运行列表开始。
①非常驻-->一个运行列表
image.png
0x00~0x3F 是属性头;运行列表在橘黄色框中,0x40开始,可以得到运行列表 33 40 BC 00 00 00 0C。
分析如下:
首先0x33,低4位是3,表示紧随其后的3Byte 0xBC40作为运行簇大小(簇个数),即文件所占总大小;高4位是3,表示簇大小之后的3个Byte 0x0C0000 是起始簇,即文件起始,这里是说的是LCN。
②非常驻-->多个运行列表
image.png
分析如下:
第一个运行列表,首先是0x31,低4位是1,表示紧接着的1Byte(03)是运行簇大小;高4位是3,表示紧接着3Byte(65 9A 00)是起始簇,这里说的是LCN;
第二个运行列表,首先是0x11,低4位是1,表示紧接着的1Byte(01)是运行簇大小;高4位是1,表示紧接着3Byte(13)是起始簇,这里说的是VCN。
注意,只有第一个运行列表的起始簇说的是LCN,从第二个运行列表开始每个运行列表的起始簇都说的是VCN。想要得到LCN需要按下面的公式计算:
第n个运行列表的LCN = 第一个运行列表的起始簇(LCN) + 第二个运行列表的起始簇(VCN) +...+第n个运行列表的起始簇(VCN)
③常驻
image.png
四、常见问题
(一)如何从NTFS文件系统中找到$MFT文件的起始和总大小
1、从引导扇区找到“MFT起始簇”或者”MFT备份MFTMirr位置“;
2、根据“MFT起始簇”或者”MFT备份MFTMirr位置“找到第一个MFT项(1KB),第一个MFT项就是$MFT的属性内容;
3、在第一个MFT项中找到80H属性,根据80H属性的属性结构找到文件起始和总大小;
4、上面3找到的就是MFT文件的起始和总大小了。
(二)MFT文件和MFTMirr文件的区别
MFT文件是对NTFS中全部MFT(卷上的所有文件,包括文件名、时间戳、流名和数据流所在的群集号列表、索引、安全标识符以及诸如“只读”、“压缩”、“加密”之类的文件属性)的存储,可以根据MFT文件快速的查找卷上的所有文件;而MFTMirr文件是对MFT文件中比较重要项的复制,一般是4KB。
mft文件记录属性头包括_关于NTFS-MFT相关推荐
- mft文件记录属性头包括_学懂主流NTFS分区文件系统,你也可以成为MM眼中的大神!...
主要NTFS文件系统小讲第一课,学会了你也可以使用WINHEX进行底层数据分析,误删,误格式化,分区出错等一些故障在数据恢复软件处理不了时,你也可以通过这些知识来提高恢复几率. 由于篇幅有限不太可能一 ...
- mft文件记录属性头包括_NTFS 文件系统基础知识
1. NTFS 中所有都是文件,包括无数据,都是以文件形式进行访问. 元数据文件包括: $Mft $MftMirr $LogFile $Volume $AttrDef $BitMap ...
- pdf文件转换ppt可编辑_创建,转换和编辑PDF文件的免费工具
PDF可靠且通用,是当今使用最广泛的电子文档格式之一. 但是,有时您想将PDF文件的数据转换为其他格式或编辑其中的信息 . 在这种情况下,您将根据需要寻找PDF编辑器或转换器. 好吧,像所有其他在线工 ...
- 【linux】linux命令如何查看文件、文件夹的属性,包括大小、修改时间、谁修改的...
[linux命令如何查看文件.文件夹的属性,包括大小.修改时间.谁修改的] 1.查看文件大小: #du -sh filename 2.查看文件,文件夹属性: #ls -l filename #ls - ...
- pythoncsv表格对比_对比两个csv文件记录差异
搜索热词 下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. # -*- coding:utf-8 -*- import csv import ...
- python 示例_带有示例的Python文件关闭属性
python 示例 文件关闭属性 (File closed Property) closed Property is an inbuilt property of File object (IO ob ...
- layui实现文件压缩上传_基于SSM框架、Layui的多文件上传、包括图片,压缩包,音频等文件(与数据库挂钩) - 爱秧博客...
写在前面:当初为了实现一个多文件上传可是费了一番功夫,经过我日日夜夜的百度咨询,写了好几种方法,最终还是没能解决问题.我可以很负责任的告诉你,你去百度上不管你形容有多好,只要是涉及多文件,就会查到Mu ...
- Linux 文件的属性
Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件或目录的属性主要包括:索引节点(inode),文件类型,权限属性,链接数,所归属的用户和用户组 ...
- C++声明、定义、类的定义、头文件作用、头文件重复引用
转载至:点击打开链接 C++声明.定义.类的定义.头文件作用.头文件重复引用,不具名空间 转自:http://www.cnblogs.com/rocketfan/archive/2009/10/02/ ...
最新文章
- matplotlib如何把坐标轴一横一竖给绘制出来
- 全球及中国聚酰胺市场总体规模与供需现状分析报告2022年
- 原始dao和Mapper动态代理的开放方式---Mybatis学习笔记(六)
- 使用JPA和@NamedQueries的Spring数据
- Java 字符串与整数之间的互相转换
- java 查找链表中间元素_java查找链表中间元素_如何通过Java单次查找链表的中间元素...
- C++之类和对象的关系
- Windows 10 归档、对于一些问题的解决与软件推荐
- python def main好处_python中 __name__及__main()__的妙处
- springboot之idea无法添加包
- MySQL 6.子查询
- 0可用,0已用 U盘问题 重解~
- 大数据量JSONObject.fromObject性能问题(大数据传给前台)
- 斐波那契数列(C语言实现)
- MFC小游戏之坦克大战
- 饿了么分布式服务治理及优化经验
- RxJava3.x入门(七)——背压策略
- Method threw ‘java.lang.UnsupportedOperationException‘ exception.
- Service Mesh架构下的认证与授权
- 第四届高教杯计算机绘图教程,第三届“高教杯”机械类计算机绘图试卷(三维).pdf...
热门文章
- 引入Jaeger——使用
- 使用Azure DevOps Pipeline实现.Net Core程序的CD
- 抱歉,请不要把 “业务逻辑层” 理解为 “业务中台”
- Mobius 一个运行在 .NET Core 上的 .NET 运行时
- 用asp.net core结合fastdfs打造分布式文件存储系统
- 基于Jenkins的持续交付全流程设计与实践
- Docker最全教程——MongoDB容器化(十三)
- MEDIATR 一个低调的中介者类库
- 编写高性能 .NET 代码 第二章:垃圾回收 基本操作
- 学习ASP.NET Core,你必须知道“中间件”是什么?中间件如何注册?请求处理管道是如何通过中间件构建的?