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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ffmpeg avformat_open_input返回失败的解决办法

用ffmpeg做的第一个程序,参考网上的代码,就出现了一些问题,其中avformat_open_input返回失败。 下面是我在网上收集到的失败信息的相关解决: 很多朋友在使用新版本的ffmpeg时,都遇到了avformat_open_input返回失败的问…

客户端禁用Keep-Alive, 服务端开启Keep-Alive,会怎么样?

最近部署的web程序,服务器上出现不少time_wait的tcp连接状态,占用了tcp端口,花费几天时间排查。之前我有结论:HTTP keep-alive 是在应用层对TCP连接的滑动续约复用,如果客户端、服务器稳定续约,就成了名副其…

linux网络编程之一般应用采用的协议和不同套接字的地址结构以及用户进程和内核通过哪些函数传递套接字的地址结构

1、一般应用采用的协议 2、不同套接字的地址结构 3、用户进程和内核通过哪些函数传递套接字的地址结构 从进程到内核传递套接字的地址结构函数有3个 bind、connect、sendto函数 从内核到进程传递套接字的地址结构函数有4个函数 accept、recvfrom 、getsockname 、getpeername…

四则运算2测试

这是测试程序在输入任意字符时能否正常运行 1)按程序提示正确输入 结果无错 2)当输入错误的字符,如字母等,程序出错(错误提示无限循环) 这一错误我经过长时间反正为解决,于是请教了其他同学,发现…

2020-11-04关于出现tomcat启动失败的一种原因

点击run on server后出现了如下所示: 本来是运行正常的,后来因为我将exp5里面所有的文件都复制了一遍,放到了exp5_2里面后,如下所示: 此时(复制文件夹之前)若tomcat已经启动,则不会出…

HTTP协议快速入门

一、定义 The Hypertext Transfer Protocol (HTTP) is an application protocol for distributed, collaborative, hypermedia information systems. HTTP is the foundation of data communication for the World Wide Web. Hypertext is structured text that uses logical l…

删除含有关键词的文件_AweEraser——macOS Catalina最佳的文件粉碎机

您是否正在寻找适用于macOS Catalina的好的文件粉碎机?今天macdown为大家推荐一种永久删除数据的软件——AweEraser。有时,你要销毁或擦除计算机上的所有私人文件,这意味着这些数据必须受到保护,免受他人的侵害。本地硬盘或外部硬…

Cocos2d-JS v3.0 alpha

Cocos2d-JS是整合了Cocos2d-html5 v3.0 alpha和Cocos2d-x JSBinding的新JS引擎仓库。整合之后的核心优势在于Html5和JSB的开发流程及API现在变得高度统一,在使用同一套JS游戏代码的基础上,我们的工具也极大的简化了对于不同目标平台的编译发布流程 核心特…

linux网络编程之用一张图片说明函数inet_ntop、inet_pton、inet_addr、inet_ntoa 、inet_aton函数之间的关系

1、inet_ntop、inet_pton、inet_addr、inet_ntoa 、inet_aton函数之间的关系 2、inet_ntop、inet_pton函数的源代码 1、inet_pton函数源码 int inet_pton(int family, const char *strptr, void *addrptr) {if (family == AF_INET) {struct in_addr in_val;if (inet_aton(s…

聊一聊如何用C#轻松完成一个TCC分布式事务

背景 银行跨行转账业务是一个典型分布式事务场景,假设 A 需要跨行转账给 B,那么就涉及两个银行的数据,无法通过一个数据库的本地事务保证转账的 ACID ,只能够通过分布式事务来解决。在 聊一聊如何用C#轻松完成一个SAGA分布式事务…

Xcode6.1 模拟器路径

Xcode 5的iOS模拟器的应用的目录是在~/Library/Application Support/iPhone Simulator/<iOS_Version>/Applications/{Application_ID} Xcode 6的目录改为~/Library/Developer/CoreSimulator/Devices/{Device_ID}/data/Containers/Bundle/Application/{Application_ID}/这…

安卓效率微商_微商人脉通app下载-微商人脉通 安卓版v2.5.5-PC6安卓网

微商人脉通app是一款很好用的微商营销软件&#xff0c;微商人脉通app可以帮你高效获取客源&#xff0c;微商人脉通app还具有丰富微商各类工具&#xff0c;微商人脉通app是做微商生意第一选择的工具&#xff01;软件介绍微商人脉通app致力于打造微商营销推广行业优秀产品&#x…

linux之如何快速查看文件的大小

1、linux之如何快速查看文件的大小 命令如下&#xff0c;每次都容易忘记&#xff0c;希望下次记住 du -h

新年伊始 .Net7 preview1 发布!

虎年伊始&#xff0c;.NET 7.0就要来了&#xff0c;还学的动吗&#xff1f;从github能看到&#xff0c;截止到2月8号&#xff0c;.NET 7.0 Preview1已经全部开发完成&#xff0c;连Preview2也完成了85%&#xff0c;这进度杠杠的&#xff01;微软这几年大力推进.NET稳定更新&…

DDD:如何更好的使用值对象

背景 大师们让我们多使用“值语义”的对象&#xff08;并非一定是是值对象&#xff09;&#xff0c;我们工作中也没有少使用&#xff08;int、bool、date等等&#xff09;&#xff0c;只是大多数人都没有多的自定义“值语义”的类型&#xff08;我也其中之一&#xff09;&#…

数据挖掘课程实验(8个实验报告)

是从实验一到实验八的 链接&#xff1a;https://download.csdn.net/download/qq_44872173/15558967

hutol json null值没了_JSON数据处理框架Jackson精解第一篇-序列化与反序列化核心用法...

Jackson是Spring Boot默认的JSON数据处理框架&#xff0c;但是其并不依赖于任何的Spring 库。有的小伙伴以为Jackson只能在Spring框架内使用&#xff0c;其实不是的&#xff0c;没有这种限制。它提供了很多的JSON数据处理方法、注解&#xff0c;也包括流式API、树模型、数据绑定…

linux之解决在ubuntu上面打开window文件乱码问题总结

1、问题&#xff1a;比如我们在linux系统里面&#xff0c;通过远程桌面打开Windows的txt文件会出现乱码 2、原因&#xff1a; Linux显示在Windows编辑过的中文就会显示乱码是由于两个操作系统使用的编码不同所致。Linux下使用的编码是utf8&#xff0c;而Windows使用的是gb1803…

什么是异构数据库

异构数据库&#xff08;HDB Heterogeneous DataBase&#xff09;是多个数据库系统的集合&#xff0c;可以实现不同数据库之间数据的共享和透明访问。异构数据库中的每个数据库都拥有自己的DMBS&#xff0c;在实现数据共享的同时&#xff0c;仍保有自己的应用特性、完整性控制和…