C++如何解析MFT中的常驻属性

胖明大大_8569

胖明大大_8569

2026-09-11

497人浏览

原创

mft常驻属性是直接存储在mft记录体内的小字段(如文件名、时间戳),其nonresident标志为0,数据紧随attribute_header之后;非常驻属性则仅存指针。用户态程序无法直接读取运行中卷的mft,因ntfs驱动内核层硬拦截所有对$mft等元数据的i/o请求,返回status_access_denied。

c++如何解析mft中的常驻属性

什么是MFT常驻属性,为什么不能直接读

NTFS的MFT记录里,小字段(比如文件名、时间戳、标准信息)会直接存进记录体内部,叫「常驻属性」;大字段(比如文件数据、大索引)则只存指针,数据另放别处,叫「非常驻属性」。但用户态程序根本没法直接读MFT——\.C:打开物理卷后调用ReadFile去读MFT起始扇区,系统会立刻返回STATUS_ACCESS_DENIED(错误码5)。这不是权限不够,是NTFS驱动在内核层硬拦截所有对元数据区域(包括$MFT、$Bitmap)的I/O请求。

想解析常驻属性,得先拿到合法MFT镜像

真实开发中能走的路只有一条:不碰实时卷,改用离线MFT镜像。比如用dd或WinHex从已卸载的NTFS卷上完整复制出MFT原始扇区数据(通常前几个扇区+连续几百KB),保存为mft.raw。之后才能在用户态安全解析:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 确认镜像开头是MFT记录签名FILE0(ASCII,偏移0x00)
  • 每条MFT记录固定大小(通常是1024字节),从偏移0开始逐条解析
  • 记录头后紧跟属性列表,每个属性以ATTRIBUTE_HEADER结构开头,含类型(如0x30为$FILE_NAME)、长度、是否常驻等标志
  • 常驻属性的Nonresident字段为0,数据紧接在header之后,ValueOffset和ValueLength告诉你从哪开始读、读多少字节

解析$STANDARD_INFORMATION和$FILE_NAME的关键点

这两个是最常用的常驻属性,但字段布局依赖NTFS版本和记录是否被重用:

  • $STANDARD_INFORMATION(类型0x10)含创建/修改时间、文件属性(只读、隐藏等)、硬链接数。注意:其Flags字段低4位才是真实属性,高位可能被系统复用
  • $FILE_NAME(类型0x30)含文件名、父目录MFT引用号、名字长度(Unicode字符数,不是字节数)。名字编码是UTF-16LE,末尾无,必须按NameLength截取
  • 同一MFT记录里可能有多个$FILE_NAME属性(长名+短名),需遍历属性列表全扫一遍,不能只取第一个
  • 若属性Resident为0但ValueLength非0,说明解析逻辑错——常驻属性值必须紧贴header存放

容易被忽略的边界情况

实际解析时最常栽在这些细节上:

  • MFT记录可能被标记为“已删除”(header中Flags第0位为0),此时$FILE_NAME里的名字可能是脏数据,得结合$STANDARD_INFORMATION的CreationTime是否为0来交叉验证
  • 某些系统(如Windows 10 20H1后)会在MFT记录末尾填充0x00或0xFF用于对齐,别把填充字节误判成下一个属性的header
  • $FILE_NAME中的ParentReference是8字节:低6字节为父目录MFT记录号,高2字节为序列号,提取时务必用le64toh()或手动拼接,别直接reinterpret_cast
  • 没有公开的Windows API能帮你解析MFT二进制结构——FSCTL_READ_MFT_RECORD这个IOCTL根本不存在于winioctl.h,任何声称“调用系统API直接解析”的代码都是错的

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2248

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1019

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

427

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

406

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1409

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1217

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习