NTFS文件系统解析(三)

1、引言

对于NTFS文件系统而言,无论文件内容本身,抑或真实的文件属性,都被称之为属性。
而正如前文说到的,NTFS预定义了16种属性用于文件系统的管理。
而通常情况下,往往只需要关注其中的某些属性即可。

2、属性头

为了便于管理,NTFS文件系统为所有的属性定义了统一的头部结构,可以称之为属性头。
而由于每种属性的长度不一,因此又额外定义了常驻属性和非常驻属性。

// 长度:0x10
typedef struct {b32 attr_type;  // 当前属性类型b32 length;     // 属性长度b8 non_resident;  // 常驻属性标识:0 - 常驻属性, 1 - 非常驻属性b8 name_length;   // 属性名长度:0 - 无名属性ub16 name_offset; // 属性名偏移:0x18ub16 flags;    //  ub16 attr_id;  // 
} AttributeHeader;// 长度:0x8 + 0x10
typedef struct {AttributeHeader header;  // 属性头b32 length;              // 属性体长度ub16 offset;             // 属性偏移b8 index_flag;           // Indexed flagb8 padding;              // Padding
} ResidentAttrHeader;// 长度:0x30 + 0x10
typedef struct {AttributeHeader header;  // 属性头b64 vcn_begin;           // 起始VCN号b64 vcn_end;             // 结束VCN号ub16 data_run_offset;    // Data Runs偏移ub16 compression_size;   // Compression unit sizeb32 padding;             // Paddingb64 byte_alloc;          // 分配大小b64 byte_use;            // 实际使用大小b64 init_size;           // Initialized data size of the stream
} NonResidentAttrHeader;

3、$STANDARD_INFORMATION

$STANDARD_INFORMATION
常驻属性。通常情况下我们可以通过本属性获取文件时间和文件访问属性。

// 文件属性
typedef enum {READONLY = 0x0001,HIDDEN = 0x0002,SYSTEM = 0x0004,ARCHIVE = 0x0020,DEVICE = 0x0040,NORMAL = 0x0080,TEMPORARY = 0x0100,SPARSEFILE = 0x0200,REPARES_Point = 0x0400,COMPRESSED = 0x0800,OFFLINE = 0x1000,NOT_CONTENT_INDEXED = 0x2000,ENCRYPTED = 0x4000,DIRECTORY = 0x10000000,   //(copy from corresponding bit in MFT record)INDEX_VIEW = 0x20000000,  //(copy from corresponding bit in MFT record)
} FileAttrFlags;// STANDARD_INFORMATION = 0x10,
typedef struct {b64 time_create;      // 文件创建时间b64 time_update;      // 文件修改时间b64 time_mft_change;  // 文件记录修改时间b64 time_access;      // 文件访问时间b32 file_attribute;   // 文件属性b32 max_version;      // 文件最大版本b32 version;          // 当前文件版本b32 class_id;         // Class Idb32 owner_id;         // Owner Idb32 security_id;      // Security Idb64 quota_charged;    // Quota chargedb64 usn;              // USN Journel
} StdInformation;

4、$ATTRIBUTE_LIST

常驻/非常驻属性。

当一个文件或者文件夹存在多个文件记录时,主文件记录中会生成一个或多个ATTRIBUTE_LIST属性。在这种情况下,需要通过遍历ATTRIBUTE_LIST属性读取base_record_ref对应的文件记录。

// ATTRIBUTE_LIST = 0x20,
typedef struct {b32 attr_type;  // Attribute Typeub16 record_length;b8 name_length;b8 name_offset;b64 start_vcn;b64 base_record_ref;  // 文件记录号ub16 attr_id;
} AttrList;

5、$FILE_NAME

$FILE_NAME

常驻属性。通常情况下,一个文件只存在一个FILE_NAME属性,这种情况下,文件的基本属性与STANDARD_INFORMATION是保持一致的。

但是当文件系统结构变化时,如上图所示。或者当文件产生硬链接时,FILE_NAME属性都会增加。这种情况下,就需要对本属性做特殊处理。

// 文件名命名空间
typedef enum {POSIX_STYLE = 0,WIN32_STYLE,DOS_STYLE,WIN_DOS_STYLE,
} FileNameSpace;// FILE_NAME = 0x30,
typedef struct {b64 parent_ref;       // 低6位存储当前文件记录号b64 time_create;      // 文件创建时间b64 time_update;      // 文件修改时间b64 time_mft_change;  // 文件记录修改时间b64 time_access;      // 文件访问时间b64 byte_alloc;       // 分配大小b64 byte_use;         // 实际使用大小b32 flags;            // 文件属性b32 ea_flags;         // 文件EA属性ub8 filename_length;  // 文件名长度(单位):字符 b8 name_space;        // 命名空间
} FileName;

6、$VOLUME_INFORMATION

常驻属性。通常情况下,卷信息属性只存储在Volume中。不需要特殊处理

// VOLUME_INFORMATION = 0x70,
typedef struct {b8 resv1[8];   // 00b8 major_ver;  // major version 1--winNT, 3--Win2000/XPb8 minor_ver;  // minor version 0--win2000, 1--WinXP/7ub16 flag;     // markb8 resv2[4];   // 00
} VolumeInformation;

7、$DATA

常驻/非常驻属性。DATA属性用于存储文件本身的数据。当文件内容较少时,数据直接存储在DATA中。
当数据长度超过一定时,DATA中存储Data Runs,数据本身则异地存储。
注意:文件内容数据只存储在有名DATA属性中,因此通过DATA读取文件内容时需要对name_length进行判断。

8、$INDEX_ROOT

$INDEX_ROOT
常驻属性。索引根节点通常由标准属性头,索引根属性头,索引属性头和索引属性组成。
索引根属性头决定当前块存储的索引类型。通常情况下,索引中存储的都是0x30文件名属性。
正如上图所示,绿色部分代表IndexEntry的头部,紧接着的红色部分和黄色部分就是去除了标准属性头之后的0x30属性,而最后的紫色部分则存储着子节点的VCN号。

typedef enum {ENTRY_SUBNODE = 1,  // 存在子节点ENTRY_LAST = 2,     // 叶子节点
} IdxEntryTypes;// INDEX_ROOT = 0x90,
typedef struct {// Index Root Headerb32 attr_type;          // 属性类型b32 collation_rule;b32 index_size;         // 索引块大小b8 clusters_per_index;  // Clusters per index block (same as Bpb?)b8 padding[3];          // Padding// Index Headerb32 entry_offset;  // 第一个索引的偏移b32 total_size;    // 索引数据的总大小b32 alloc_size;    // Allocated size of the index entriesb8 flags;          // 索引标志b8 padding2[3];    // Padding
} IndexRoot;typedef struct {b64 mft_ref;ub16 size;         // 索引大小ub16 stream_size;  // 数据流长度b8 flags;          // 索引标志b8 padding[3];     // Padding// copy of body(without header) of attribute/* Name | Index Of              | Used By* --------------------------------------* $I30 | Filenames	            | 目录* $SDH | Security Descriptors  | $Secure* $SII | Security Ids	        | $Secure* $O   | Object Ids	          | $ObjId* $O   | Owner Ids	            | $Quota* $Q   | Quotas	              | $Quota* $R   | Reparse Points	      | $Reparse*/b8 stream[1];  // align to 8// VCN of the sub-node in the Index Allocation
} IndexEntry;

9、$INDEX_ALLOCATION

$INDEX_ALLOCATION

非常驻属性。INDEX_ALLOCATION的结构与INDEX_ROOT基本一致。唯一的差别在于一个是常驻属性,另一个是非常驻属性。

typedef struct {// Index Record Headerb32 magic;        // "INDX"ub16 usn_offset;  // offset of update sequence numberub16 usn_size;    // size of update sequence number and array, by wordsb64 lsn;          // $LogFile sequence numberb64 vcn;          // vcn of this index block in the index allocation// Index Headerb32 entry_offset;  // Offset to the first index entryb32 total_size;    // Total size of the index entriesb32 alloc_size;    // Allocated size of the index entriesb8 flags;          // Non-leaf node Flagb8 padding[3];     // Padding
} IndexBlock;typedef struct {b64 mft_ref;ub16 size;         // 索引大小ub16 stream_size;  // 数据流长度b8 flags;          // 索引标志b8 padding[3];     // Padding// copy of body(without header) of attribute/* Name | Index Of              | Used By* --------------------------------------* $I30 | Filenames	            | 目录* $SDH | Security Descriptors  | $Secure* $SII | Security Ids	        | $Secure* $O   | Object Ids	          | $ObjId* $O   | Owner Ids	            | $Quota* $Q   | Quotas	              | $Quota* $R   | Reparse Points	      | $Reparse*/b8 stream[1];  // align to 8// VCN of the sub-node in the Index Allocation
} IndexEntry;

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

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

相关文章

云智慧联合北航提出智能运维(AIOps)大语言模型及评测基准

随着各行业数字化转型需求的不断提高,人工智能、云计算、大数据等新技术的应用已不仅仅是一个趋势。各行业企业和组织纷纷投入大量资源,以满足日益挑剔的市场需求,追求可持续性和竞争力,这也让运维行业迎来了前所未有的挑战和机遇…

数据结构-二叉树·堆(顺序结构的实现)

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🐻‍❄个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE🐼本文由GOTXX原创,首发CSDN&…

【wp】2023鹏城杯初赛 Web web1(反序列化漏洞)

考点&#xff1a; 常规的PHP反序列化漏洞双写绕过waf 签到题 源码&#xff1a; <?php show_source(__FILE__); error_reporting(0); class Hacker{private $exp;private $cmd;public function __toString(){call_user_func(system, "cat /flag");} }class A {p…

Ansible中的角色使用

Ansible中的角色使用&#xff1a; 目录 一、ansible角色简介 二、roles目录结构 三、roles的创建 四、roles的使用 1、书写task主任务 2、触发器模块 3、变量模块 4、j2模块 5、files模块 6、启用模块 7、执行playbook 五、控制任务执行顺序 六、多重角色的使用 一…

数据结构(超详细讲解!!)第二十一节 特殊矩阵的压缩存储

1.压缩存储的目标 值相同的元素只存储一次 压缩掉对零元的存储&#xff0c;只存储非零元 特殊形状矩阵&#xff1a; 是指非零元&#xff08;如值相同的元素&#xff09;或零元素分布具有一定规律性的矩阵。 如&#xff1a; 对称矩阵 上三角矩阵 下三角矩阵 对角矩阵 准…

redis教程 二 redis客户端Jedis使用

文章目录 Redis的Java客户端-JedisJedis快速入门创建工程&#xff1a;引入依赖&#xff1a;建立连接测试&#xff1a;释放资源Jedis连接池创建Jedis的连接池改造原始代码 Redis的Java客户端-SpringDataRedis快速入门导入pom坐标配置文件测试代码 数据序列化器StringRedisTempla…

【unity实战】Unity实现2D人物双击疾跑

最终效果 前言 我们要实现的功能是双击疾跑&#xff0c;当玩家快速地按下同一个移动键两次时能进入跑步状态 我假设快速按下的定义为0.2秒内&#xff0c;按下同一按键两次 简单的分析一下需求&#xff0c;实现它的关键在于获得按键按下的时间&#xff0c;我们需要知道第一次…

STM32G030F6P6 芯片实验 (二)

STM32G030F6P6 芯片实验 (二) Hello World - GPIO LED 尝试了下, 从 0 开始建 MDK HAL M0plus Project, 成功点亮 LED了。 但是 ST-LINK跑着跑着, 码飞了! 不知飞哪去了。 只好拿 MX 建了个 MDK Base。 呼叫 SysTick HAL_Delay(), 切换 LED。 基本上都是一样的用法, 只是换…

MapReduce WordCount程序实践(IDEA版)

环境 Linux&#xff1a;Hadoop2.x Windows&#xff1a;jdk1.8、Maven3、IDEA2021 步骤 编程分析 编程分析包括&#xff1a; 1.数据过程分析&#xff1a;数据从输入到输出的过程分析。 2.数据类型分析&#xff1a;Map的输入输出类型&#xff0c;Reduce的输入输出类型&#x…

蓝桥杯每日一题2023.11.2

题目描述 等差素数列 - 蓝桥云课 (lanqiao.cn) 题目分析 对于此题我们需要求出最小的公差并且长度为10&#xff0c; 1.确保序列开始为素数 2.确定枚举的个数 注意&#xff1a;序列中数只是d的变化&#xff0c;可以通过此计算将开始数字后9个数字都计算出来&#xff0c;d是…

【Qt之QtXlsx模块】安装及使用

1. 安装Perl&#xff0c;编译QtXlsx源码用 可以通过命令行进行查看是否已安装Perl。 下载及安装传送门&#xff1a;链接: https://blog.csdn.net/MrHHHHHH/article/details/134233707?spm1001.2014.3001.5502 1.1 未安装 命令&#xff1a;perl --version 显示以上是未安装…

C#中LINQtoSQL只能在.NetFramework下使用,不能在.net 下使用

目录 一、在net7.0下无法实现LINQtoSQL 1.VS上建立数据库连接 2.VS上创建LINQtoSQL 二、在.NetFramework4.8下成功实现LINQtoSQL 1.VS上建立数据库连接 2.VS上创建LINQtoSQL 三、结论 四、理由 本文是个人观点&#xff0c;因为我百般努力在.net7.0下无法实现LINQtoSQL的…

海康Visionmaster-全局脚本:方案加载完成信号发给通 信设备的方法

需要在方案加载完成后&#xff0c;发送加载完成信号到全局变量&#xff0c;发送给通信设备。 全局脚本的使用可以通过打开示例&#xff0c;完成常用的基本功能开发。 打开全局通信代码后&#xff0c;在脚本中添加代码

springboot前后端时间类型传输

springboot前后端时间类型传输 前言1.java使用时间类型java.util.Date2.java使用localDateTime 前言 springboot前后端分离项目总是需要进行时间数据类型的接受和转换,针对打代码过程中不同的类型转化做个总结 1.java使用时间类型java.util.Date springboot的项目中使用了new …

Proteus仿真--1602LCD显示电话拨号键盘按键实验(仿真文件+程序)

本文主要介绍基于51单片机的LCD1602显示电话拨号键盘按键实验&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中右下方12个按键模拟仿真手机键盘&#xff0c;使用方法同手机键一样&#xff0c;拨打手机号码则在液晶显示屏上显示对应的号码 仿真运行…

DDoS类型攻击对企业造成的危害

超级科技实验室的一项研究发现&#xff0c;每十家企业中&#xff0c;有四家(39%)企业没有做好准备应对DDoS攻击&#xff0c;保护自身安全。且不了解应对这类攻击最有效的保护手段是什么。 由于缺乏相关安全知识和保护&#xff0c;使得企业面临巨大的风险。 当黑客发动DDoS攻击…

译文:我们如何使 Elasticsearch 7.11 中的 date_histogram 聚合比以往更快

这篇文章是ES7.11版本的文章&#xff0c;主要学习的是思路&#xff0c;记录在这里留作以后参考用。 原文地址&#xff1a;https://www.elastic.co/cn/blog/how-we-made-date-histogram-aggregations-faster-than-ever-in-elasticsearch-7-11 正文开始&#xff1a; Elasticsea…

【数组】有序数组的平方

## 977.有序数组的平方 力扣题目链接 (opens new window) 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10]输出&#xff1a;[0,…

初阶JavaEE(15)(Cookie 和 Session、理解会话机制 (Session)、实现用户登录网页、上传文件网页、常用的代码片段)

接上次博客&#xff1a;初阶JavaEE&#xff08;14&#xff09;表白墙程序-CSDN博客 Cookie 和 Session 你还记得我们之前提到的Cookie吗&#xff1f; Cookie是HTTP请求header中的一个属性&#xff0c;是一种用于在浏览器和服务器之间持久存储数据的机制&#xff0c;允许网站…

g.Grafana之Gauge的图形说明

直接上操作截图 1. 创建一个新的Dashboard 2.为Dashboard创建变量 【General】下的Name与Label的名称自定义 【Query options】 下的Group可以填写Zabbix内的所有组/.*/ , 然后通过Regex正则过滤需要的组名 3.设置Dashboard的图形 我使用文字来描述下这个图 1.我们在dash…