Qt/C++ 了解NTFS文件系统,解析0x80 $Data属性,获取Run Lists数据列表

系列文章目录

整个专栏系列是根据GitHub开源项目NTFS-File-Search获取分区所有文件/目录列表的思路。
具体的如下:

  1. Qt/C++ 了解NTFS文件系统,了解MFT(Master File Table)主文件表(一)
    介绍NTFS文件系统,对比通过MFT(Master File Table)主文件表获取数据的优劣,简单介绍开源项目NTFS-File-Search,以及了解借鉴NTFS系统中所参考的所有文章。
  2. Qt/C++ 了解NTFS文件系统,解析盘符引导扇区数据获取MFT(Master File Table)主文件表偏移地址
    读取$Boot引导分区扇区数据,获取单个簇大小(4096字节),$MFT元数据大小(1024字节)和$MFT元数据的起始簇号,计算出$MFT元数据在磁盘的偏移地址。
  3. Qt/C++ 了解NTFS文件系统,获取首张MFT表数据,解析文件记录头内容找到第一个属性偏移地址
    解析$MFT元数据结构,根据$MFT元数据文件记录头获取属性的偏移地址,用于后面解析0x80 $Data属性,获取Run List数据列表
  4. Qt/C++ 了解NTFS文件系统,解析MFT主文件表中的常驻属性与非常驻属性
    简单介绍$MFT元数据中的常驻属性与非常驻属性结构.
  5. Qt/C++ 了解NTFS文件系统,解析0x80 $Data属性,获取Run List数据列表
    根据0x80 $Data属性,找到存放所有$MFT元数据的区间列表(Run List数据列表)
  6. Qt/C++ 了解NTFS文件系统,遍历Run Lists数据列表,读取0x30 $FILE_NAME属性,获取所有文件/目录数据
    根据前面获取的 获取Run List数据列表,
    遍历所有Run List数据列表读取所有$MFT元数据,并解析 $FILE_NAME属性和$STANDARD_INFORMATION属性获取文件或目录的实际大小,名称,磁盘分配大小,记录号 ,文件属性等信息

目录导读

  • 系列文章目录
  • MFT元数据常见属性类型介绍
  • 前言
  • 了解Run List数据
  • 解析0x80 $Data属性获取 Run List数据
  • 代码示例:


MFT元数据常见属性类型介绍

MFT元数据属性类型很多,这里以表格的形式简单介绍常见的数据类型。

MFT元数据常见属性类型介绍,参考:
NTFS - Attributes
File - $AttrDef (4)

NTFS文件系统详解->NTFS文件系统中的所有属性体的简介
关于NTFS-MFT

TypeOSName名称描述
0x10$STANDARD_INFORMATION标准信息在旧版本的NTFS中,此属性仅包含DOS文件权限和文件时间。Windows 2000引入了四个新字段,用于引用配额、安全、文件大小和日志信息。正如在$AttrDef中定义的那样,这个属性的大小最小为48字节,最大为72字节。
0x20$ATTRIBUTE_LIST属性列表当属性很多且MFT记录中的空间很短时,可以将所有非常驻属性移出MFT。如果仍然没有足够的空间,则需要使用 $ATTRIBUTE_LIST 属性。其余的属性放在一个新的MFT记录中,$ATTRIBUTE_LIST 描述在哪里可以找到它们。看到这个属性是非常不寻常的。
0x30$FILE_NAME文件名此属性存储文件属性的名称,并且始终是常驻属性。正如在$AttrDef中定义的那样,这个属性的最小大小为68字节,最大大小为578字节。这相当于文件名的最大长度为255个Unicode字符。
0x40NT$VOLUME_VERSION在早期的NTFS c1.2中为卷版本
0x402K$OBJECT_ID对象ID对象Id是在Windows 2000中引入的。每个MFT记录被分配一个唯一的GUID。此外,一条记录可能有一个Birth Volume Id、一个Birth Object Id和一个Domain Id,它们都是guid。正如在$AttrDef中定义的那样,这个属性没有最小大小,但最大256字节。
0x50$SECURITY_DESCRIPTOR安全描述符安全描述符
0x60$VOLUME_NAME卷名(卷标识)该属性仅包含卷的名称。正如在$AttrDef中定义的那样,这个属性的大小最小为2字节,最大为256字节。这相当于卷名的最大长度为127个Unicode字符。
0x70$VOLUME_INFORMATION卷信息卷的版本和状态。正如在$AttrDef中定义的那样,这个属性的最小和最大大小为12字节。
0x80$DATA文件数据此属性包含文件的数据。文件的大小是其未命名数据流的大小。正如在$AttrDef中定义的那样,这个属性没有最小或最大大小。
0x90$INDEX_ROOT索引根这是实现索引(例如目录)的B+树的根节点。这个文件属性始终是常驻的。
0xA0$INDEX_ALLOCATION索引分配这是实现索引(例如目录)的B+树的所有子节点的存储位置。此文件属性始终是非常驻的。
0xB0$BITMAP位图这个文件属性是一个比特序列,每个比特代表一个实体的状态。正如在$AttrDef中定义的那样,这个属性没有最小或最大大小。
0xC0NT$SYMBOLIC_LINK符号链接符号链接
0xC02K$REPARSE_POINT重解析点正如在$AttrDef中定义的那样,这个属性没有最小大小,但最大为16384字节。
0xD0$EA_INFORMATION扩充属性信息用于在NTFS下实现Windows NT服务器的OS/2信息子系统和OS/2客户端所使用的HPFS扩展属性。此文件属性可能是非常驻的,因为它的流可能会增长。正如在$AttrDef中定义的那样,这个属性的最小和最大大小为8字节。
0xE0$EA扩充属性用于在NTFS下实现HPFS扩展属性。此文件属性可能是非常驻的,因为它的流可能会增长。正如在$AttrDef中定义的那样,这个属性没有最小大小,但最大为65536字节。
0xF0NT$PROPERTY_SET早期的NFT v1.2中才有
0x1002K$LOGGED_UTILITY_STREAMEFS加密属性正如在$AttrDef中定义的那样,这个属性没有最小大小,但最大为65536字节。

文件记录属性类型 宏定义示例:
#define MFT_FILERECORD_ATTR_STANDARD_INFO 0x10
#define MFT_FILERECORD_ATTR_ATTRIBUTE_LIST 0x20
#define MFT_FILERECORD_ATTR_FILENAME 0x30
#define MFT_FILERECORD_ATTR_OBJECT_ID 0x40
#define MFT_FILERECORD_ATTR_SECURITY_DESCRIPTOR 0x50
#define MFT_FILERECORD_ATTR_VOLUME_NAME 0x60
#define MFT_FILERECORD_ATTR_VOLUME_INFORMATION 0x70
#define MFT_FILERECORD_ATTR_DATA 0x80
#define MFT_FILERECORD_ATTR_INDEX_ROOT 0x90
#define MFT_FILERECORD_ATTR_INDEX_ALLOCATION 0xA0
#define MFT_FILERECORD_ATTR_BITMAP 0xB0
#define MFT_FILERECORD_ATTR_REPARSE_POINT 0xC0
#define MFT_FILERECORD_ATTR_EA_INFORMATION 0xD0
#define MFT_FILERECORD_ATTR_EA 0xE0
#define MFT_FILERECORD_ATTR_LOGGED_UTILITY_STREAM 0x100
#define MFT_FILERECORD_ATTR_STOP_TAG 0xFFFFFFFF

前言

根据获取的第一个MFT元数据的属性列表,获取到0x80 $Data属性数据。
解析数据获取到Run List数据
有了Run List数据才能找到具体的文件MFT元数据。

了解Run List数据

当MFT元数据属性不能存放完数据,系统就会在NTFS数据区域开辟一个空间存放,这个区域是以簇为单位的。Run List就是记录这个数据区域的起始簇号和大小。

NTFS系统中的Run List数据是什么:
在NTFS(New Technology File System)系统中,Run List数据是一个重要的概念,它用于描述文件或数据属性在磁盘上的存储位置和大小。具体来说,Run List记录了一个或多个数据流的起始簇号(Starting Cluster Number,SCN)和每个数据流的长度(即占用的簇数),这些信息对于定位和访问文件或数据属性的实际存储位置至关重要。

  • Run List通常由一个或多个Run组成,每个Run包含以下信息:
  • 起始簇号(SCN): 表示数据流在磁盘上的起始位置。这是一个簇的编号,用于定位数据流的第一个簇。
  • 长度: 表示数据流占用的簇数。这是一个整数,用于指定从起始簇号开始连续占用的簇的数量。

摘要出自:文言一心

  • 定义Run Lists数据结构

开源项目NTFS-File-Search中Run List的数据结构:

/* Cluster info of Non-Residental Attributes (Data runs)-- 非居住属性聚类信息(数据运行) */
typedef struct MFT_DATARUN
{//! 长度(以簇为单位)UINT64	Length;//! 起始簇号INT64	Offset;
}*PMFT_DATARUN;

解析0x80 $Data属性获取 Run List数据

以获取的第一个MFT元数据为例,获取到的0x80属性数据:
在这里插入图片描述
按照前文定义的 PMFT_ATTRIBUTE_HEADER 结构可以判断为非常驻属性,获取 MFT_NONRESIDENT_ATTRIBUTE_HDR 结构中的 DataRunOffset 字段值即可或得Run Lists 数据偏移地址。
按字节计算,也就是从第32字节开始,占2字节数据为 40 00H 换算成十进制为64,即从64为开始到 00 为Run Lists数据偏移地址。即【33 20 C8 00 00 00 0C … … … … 5C 72 00 00 00】都为Run Lists数据,以 00 结束。

  • 解析Run Lists数据 :

第一个字节 33 是压缩字节,高位和低位相加,3 + 3 = 6,
表示这个Data Run信息占用6个字节,即
20 C8 00 00 00 0C
其中高位表示起始簇号占用多少个字节,低位表示大小占用的字节数。在这里,起始簇号占用3个字节,为00 00 0C,大小占用3个字节,为 20 C8 00。
解析后,得到这个数据流起始簇号为786432,大小为51232簇。(小端序计算(little endian))

  • 如图示 :

请添加图片描述
包含获取到五个Run List数据;

解析runlist数据参考:
NTFS文件系统详解(三)之NTFS元文件解析 : 分析80H属性
关于NTFS-MFT : (3)80H属性$DATA

代码示例:

参考开源项目NTFS-File-Search中获取Run list数据的示例:

UINT64 GetDataRuns(PMFT_ATTRIBUTE_HEADER pAttribute, MFTDataRunList *prgDataRuns){if (!pAttribute || !prgDataRuns){return 0;}prgDataRuns->clear();VCN_t nStartVCN	= MFT_NONRESIDENT_ATTR(pAttribute).StartVCN;VCN_t nLastVCN		= MFT_NONRESIDENT_ATTR(pAttribute).LastVCN;VCN_t nCurrentVCN	= 0;qDebug()<<"[DataRunOffset] :" <<QString::number(MFT_NONRESIDENT_ATTR(pAttribute).DataRunOffset,10);PBYTE pbCurrent = POINTER_ADD(PBYTE, pAttribute, MFT_NONRESIDENT_ATTR(pAttribute).DataRunOffset);do{MFT_DATARUN DataRun = { 0 };/*!* 在C或C++中,表达式 *pbCurrent & 0xF 执行了位与(bitwise AND)操作。这里,*pbCurrent 是解引用指针 pbCurrent,即获取该指针指向的 BYTE(或等效的8位无符号整数)值。& 是位与操作符,而 0xF 是一个十六进制数,等价于二进制的 00001111。* 位与操作符 & 对其两边的操作数进行逐位比较,只有在两个相应的位都为1时,结果的该位才为1,否则为0。因此,*pbCurrent & 0xF 的作用是将 *pbCurrent 的低4位保留下来,而将高4位清零。* 例如:* 如果 *pbCurrent 的值是 0xF3(二进制 11110011),* 那么 *pbCurrent & 0xF 的结果是 0x3(二进制 00000011),* 因为只有低4位(0011)与 0xF(00001111)的对应位都为1,所以结果保留了这些位,而高4位被清零。* 这种操作通常用于提取或掩码特定的位字段。在这个例子中,它用于提取 *pbCurrent 值的低4位。*/int LengthSize = *pbCurrent & 0xF;/*!* 在C或C++中,PBYTE是一个指向BYTE类型的指针,其中BYTE通常是一个无符号字符类型,用于表示8位(1字节)的数据。表达式*pbCurrent >> 4执行了两个操作:* pbCurrent:这是解引用操作,它获取指针pbCurrent指向的值。换句话说,它获取了pbCurrent指向的内存地址中存储的BYTE值。* >> 4:这是一个位右移操作,它将*pbCurrent的值向右移动4位。位右移操作通常用于从位字段中提取值或将数值除以2的幂。在这个上下文中,它将BYTE值的高4位移动到低4位的位置,同时丢弃原始的低4位。* 例如,如果*pbCurrent的值是0xF3(二进制11110011),那么*pbCurrent >> 4的结果是0xF(二进制1111),因为原始值向右移动了4位,丢弃了最低的4位(0011),保留了最高的4位(1111)。* 这种操作通常用于处理位字段或执行特定的位操作任务,如提取、修改或组合数据。*/int OffsetSize = *pbCurrent >> 4;if ((LengthSize < 1 || LengthSize > 8) || (OffsetSize < 1 || OffsetSize > 8)){prgDataRuns->clear();return 0;}++pbCurrent;//打印 长度QString Lengsizestr="";for(int i=0;i<LengthSize;i++)Lengsizestr+=QString(" %1").arg(pbCurrent[i],2,16,QLatin1Char('0')).toUpper();qDebug()<<"LengthSize: "<<Lengsizestr;CopyMemory(&DataRun.Length, pbCurrent, LengthSize);pbCurrent += LengthSize;if (pbCurrent[OffsetSize - 1] & 0x80) {DataRun.Offset = -1;}//打印 偏移量QString OffsetSizestr="";for(int i=0;i<OffsetSize;i++)OffsetSizestr+=QString(" %1").arg(pbCurrent[i],2,16,QLatin1Char('0')).toUpper();qDebug()<<"OffsetSize: "<<OffsetSizestr;CopyMemory(&DataRun.Offset, pbCurrent, OffsetSize);prgDataRuns->push_back(DataRun);nCurrentVCN += DataRun.Length;pbCurrent	+= OffsetSize;} while (nCurrentVCN <= nLastVCN);return prgDataRuns->size();}
/* 输出的数据
[DataRunOffset] : "64"
LengthSize:  " 20 C8 00"
OffsetSize:  " 00 00 0C"
LengthSize:  " B3 C8 00"
OffsetSize:  " 8D 90 98 00"
LengthSize:  " 4E D8 00"
OffsetSize:  " E8 72 97 00"
LengthSize:  " 0A C8 00"
OffsetSize:  " 01 87 1C FF"
LengthSize:  " D5 78"
OffsetSize:  " B8 5C 72"
*/

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

springboot中小学数字化教学资源管理平台

基于springbootvue实现的中小学数字化教学资源管理平台 &#xff08;源码L文ppt&#xff09;4-078 第4章 系统设计 4.1 功能模块设计 系统整体模块分为管理员、教师和学生三大用户角色,整体功能设计图如下所示: 图4-1 系统整体功能图 4.2 数据库设计 4.2.1 E-R模…

工业交换机故障快速排查的方法有哪些

在现代工业自动化的环境中&#xff0c;工业交换机作为网络连接的重要设备&#xff0c;其稳定性和可靠性至关重要。然而&#xff0c;实际使用过程中难免会遇到各种故障&#xff0c;这对生产线和系统的正常运作造成了影响。为了有效应对这些问题&#xff0c;下面将介绍一些工业交…

CSRF高级防御绕过

1&#xff09;回顾low级别做过csrf页面的密码重置&#xff0c;重复之前的操作&#xff0c;我们发现级别调整中级之后&#xff0c;报错如下 2&#xff09;检查源码 进入dvwa源码&#xff0c;查找到checktoken&#xff1a; 3&#xff09;在dvwa-csrf页面上&#xff0c;抓包 http…

前端开发者有福啦,循序渐进Vue.js 3.x前端开发实践已上线

目录 写在前面 推荐图书 推荐理由 写在最后 写在前面 好书推荐&#xff01;前端开发者的福利来喽&#xff0c;《循序渐进Vue.js 3.x前端开发实践》&#xff0c;你值得拥有。 推荐图书 《循序渐进Vue.js 3.x前端开发实践》 推荐理由 《循序渐进Vue.js 3.x前端开发实践》…

介绍GPT-o1:一系列解决困难问题( science, coding, and math )的推理模型

openai o1介绍 一、官方技术报告要点剖析实验1 benchmark分析实验2:和phd比赛技术细节&#xff1a;Chain of Thought的使用人类偏好评估Human preference evaluationsatety技术细节&#xff1a;隐藏思维链为监控模型提供了机会:)openai的几点conclusion 二、官方介绍剖析 Intro…

【C语言进阶】第四节:自定义类型详解

1、结构体 1.1 结构体变量的定义和初始化 struct Point//类型声明 {int x;int y; }p1;//声明类型的同时定义变量p1struct Point p2;//定义结构体变量p2//初始化&#xff1a;定义变量的同时赋初值。 struct Point p3 { x, y };struct Node {int data;struct Point p;struct N…

端侧 AI 的新突破:面壁智能 MiniCPM 3.0

在人工智能领域&#xff0c;每一次技术的革新都可能引发一场小小的革命。 ChatGPT-3.5 曾经凭借其惊人的表现赢得了大众的关注&#xff0c;但如今&#xff0c;随着国内AI公司面壁智能推出的新端侧基座模型&#xff0c;人们开始重新审视端侧AI的潜力和未来。 这款名为MiniCPM …

Dockerfile全面指南:从基础到进阶,掌握容器化构建的核心工具

目录 Dockerfile全面指南&#xff1a;从基础到进阶&#xff0c;掌握容器化构建的核心工具 引言 一、什么是 Dockerfile 二、Dockerfile 的基本结构 三、Dockerfile 的常见配置项 1、多阶段构建 (Multi-stage Builds) 2、缓存优化 3、合并 RUN 命令 四、Dockerfile 使用…

C盘太臃肿了用这招一键给C盘瘦身 快速释放C盘空间

C盘太臃肿了用这招一键给C盘瘦身 快速释放C盘空间。我们的电脑不知不觉的就爆满了&#xff0c;这个主要的原因就是各种垃圾文件堆积&#xff0c;时间用得越久&#xff0c;垃圾堆积得越多&#xff0c;这样我们的C盘空间就被蚕食了&#xff0c;空间越来越小&#xff0c;变得越来越…

干货分享:为什么stable diffusion训练用ddpm, 采样用ddim呢?

前言 回忆一下DDPM&#xff0c;实质上它的推导过程应是如下的&#xff1a; 其中&#xff0c; 是单纯的高斯分布的推导&#xff0c;相当于一个序列过程的归纳法推导。 在DDPM中采用的是[贝叶斯公式]。 而过程则是用对进行一个估测&#xff0c;也就是用前向过程反过来对进行一个…

sql语法学习:关键点和详细解释

学习SQL语法是掌握数据库操作的基础。以下是SQL语法的一些关键点和详细解释&#xff1a; 1. SQL基础 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理和操作关系型数据库的标准语言。它主要包括以下几个部分&#xff1a; 数据定义语言&#xff08;DDL&…

探索Mem0:AI的智能记忆层

文章目录 探索Mem0&#xff1a;AI的智能记忆层背景介绍Mem0是什么&#xff1f;如何安装Mem0&#xff1f;简单使用方法应用场景常见问题及解决方案总结 ![ 探索Mem0&#xff1a;AI的智能记忆层 背景介绍 在人工智能的世界里&#xff0c;记忆是个性化体验的关键。想象一下&…

结构设计模式 -装饰器设计模式 - JAVA

装饰器设计模式 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一. 介绍 百度百科&#xff1a;装饰模式指的是在不必改变原类文件和使用继承的情况下&#xff0c;动态地扩展一个对…

只需5分钟!掌握学术写作的核心逻辑!

人工智能的广泛应用中&#xff0c;ChatGPT 已被证明是一种极具潜力的语言模型&#xff0c;其功能涵盖多个领域&#xff0c;显示出强大的适应性。在 GPT-4 架构的推动下&#xff0c;ChatGPT 正在彻底改变我们与文本驱动的人工智能的交互模式。 在学术界&#xff0c;学术写作至关…

【测试】——Selenium API (万字详解)

&#x1f4d6; 前言&#xff1a;本文详细介绍了如何利用Selenium进行Web自动化测试&#xff0c;包括定位元素&#xff08;如cssSelector和xpath&#xff09;、常用操作函数&#xff08;如点击、输入等&#xff09;、窗口管理、键盘鼠标事件和浏览器导航&#xff0c;以及处理弹窗…

实用小工具——多标签页插件Office Tab介绍

Office Tab引入选项卡式用户界面&#xff0c;增强了Microsoft Office使用体验。软件界面&#xff0c;可以设置你喜欢的标签类型。 安装后office界面会新增一个办公标签栏&#xff0c;立面有各功能说明。 最常用的是这个标签切换功能。 安装也很简单&#xff0c;选择对应位数安装…

知识产权实缴出资是否合法

知识产权实缴出资是否合法 近年来&#xff0c;随着知识产权在企业价值中的重要性日益凸显&#xff0c;知识产权实缴出资作为一种新兴的出资方式&#xff0c;逐渐受到社会各界的关注。然而&#xff0c;关于知识产权实缴出资是否合法的问题&#xff0c;一直是企业和投资者关注的焦…

vulnhub(13):LordOfTheRoot(sql时间盲注、mysql udf提权)

端口 nmap主机发现 nmap -sn 192.168.72.0/24 ​ Nmap scan report for 192.168.72.170 Host is up (0.00020s latency). ​ 170是新出现的机器&#xff0c;他就是靶机 nmap端口扫描 nmap -Pn 192.168.72.170 -p- --min-rate 10000 -oA nmap/scan 扫描开放端口保存到 nmap/sca…

Sony IMX334LQR-C 1/1.8寸 8.42 M像素

索尼IMX334LQR宽动态超星光级交通监测CMOS 封装&#xff1a;LGA 对⾓线&#xff1a;8.86 mm&#xff08;类型1/1.8&#xff09; 索尼IMX334LQR宽动态超星光级交通监测CMOS的参数及规格书资料&#xff1a; IMX334LQR-C是⼀个对⾓线8.86 mm&#xff08;类型1/1.8&#xff09;的…

帕金森病:这五大幕后推手,你了解多少?

在快节奏的现代生活中&#xff0c;健康问题日益受到公众的关注&#xff0c;而帕金森病作为一种常见的神经系统退行性疾病&#xff0c;更是牵动着无数家庭的心弦。今天&#xff0c;就让我们一起揭开帕金森病的神秘面纱&#xff0c;探讨其背后的五大主要原因&#xff0c;让更多人…