基于元神操作系统实现NTFS文件操作(三)
1. 背景
本文主要介绍DBR的读取和解析,并提供了基于元神操作系统的实现代码。由于解析DBR的目的是定位到NTFS磁盘分区的元文件$Root进行文件操作,所以只解析了少量的部分,其它部分可以参考相关文档进行理解。
DBR存在于磁盘分区的第一个扇区中,每个分区都有自己的DBR。要寻找DBR,只需定位到目标分区的开始位置即可,这通过前文中MBR的分区表实现,直接使用分区表项的第9-12字节即可。
2. 方法
(1)定位DBR
在MBR的起始地址上加0x1BE(即446),得到分区表的起始地址。假设要定位的磁盘分区是N号分区(N从0开始计数,0表示第一个分区,1表示第二个分区,依此类推),则在分区表起始地址上加16*N即可得到目标分区表项的起始地址,因为每个表项16字节。最后,在目标表项的0x08偏移开始的4个字节就是分区的起始扇区号,也就是定位DBR所需要的内容。
总结一下,定位DBR的公式形如:MBR_addr+0x1BE+16*N+0x08
(2)调用元神操作系统的API读取DBR
定位到DBR后使用API_READ_DISK_SECTOR调用元神操作系统的API来读取DBR,该操作实现在read_disk_dbr函数中,然后在主函数中的读取MBR之后添加对read_disk_dbr函数的调用,代码如下所示:
use32START:pushacall read_disk_mbrmov eax, 0call read_disk_dbr ;read dbr in partition eaxpopairetsector_dbr: times 512 db 0
partition_base dd 0
;input:
; eax: index of partition to operate, 0 = first partition, 1 = second partition
read_disk_dbr:pushamov edi, API_PARAMmov dword [fs:edi], API_READ_DISK_SECTORmov dword [fs:edi+4], 2 ;2 parametersmov ebx, sector_buffadd ebx, 0x1BE ;ebx point to partition tableshl eax, 4 ;eax * 16add ebx, eax ;ebx point to dest partition itemadd ebx, 8 ;ebx point to start sector no. of dest partitionmov edx, [ds:ebx]mov dword [fs:edi+8], edx ;parameter_1: sector no.mov [ds:partition_base], edxxor eax, eaxmov ax, dsadd eax, SEG_BASEmov bh,byte [fs:eax+7]mov bl,byte [fs:eax+4]shl ebx,16mov bx,word [fs:eax+2]add ebx, sector_dbrmov dword [fs:edi+12], ebx ;parameter_2: start address of buffercall pword [fs:OS_API]mov eax, 512movzx ebx, word [fs:cursor_y]movzx ecx, word [fs:cursor_x]mov esi, [fs:edi+12]call print_bytes_hexadd word [fs:cursor_y], 20.end:poparet
上述代码将磁盘第一个分区的DBR内容读取到sector_dbr缓冲区中,并以十六进制形式进行显示,结果如下图所示:

该图中显示的内容就是磁盘第一个分区的DBR内容。
注意:此处打印DBR内容的操作仅为讲解需要,后续操作追加之前应当注释掉read_disk_dbr函数中对于print_bytes_hex调用相关的部分,即注释掉call pword [fs:OS_API]之后的部分。
另外,函数read_disk_dbr需要提供一个输入参数“分区索引号”,根据该参数来定位到目标磁盘分区。本例代码中假设要操作的磁盘分区是第一个分区(即0号分区),该分区索引号在后续操作中可由上层应用提供,例如:读取文件“d2:\test.txt”操作,在文件名中用d2来指明要操作的文件位于磁盘的第二个分区中。
(3)解析DBR
DBR的内容共有512字节,前3个字节为跳转指令(跳转到引导代码处),之后的8个字节为文件系统的OEM标志字符串(如:“NTFS ”),再之后的若干字节记录了文件系统的重要信息,接下来的部分为引导代码,最后2个字节为标记字节(固定为55 AA)。
本文主要解析文件系统的重要信息部分,即偏移0x0B开始的若干字节。0x0B-0x0C表示每扇区的字节数;0x0D表示每簇的扇区数;0x15为介质描述符;0x18-0x19表示每磁道扇区数;0x1A-0x1B表示磁头数;0x1C-0x1F表示隐藏扇区数;0x28-0x2F表示该分区的总扇区数;0x30-0x37表示$MFT元文件的起始簇号;0x38-0x3F表示$MFT镜像文件的起始簇号;0x40为每个MFT记录所占的簇数;0x44为每索引所占的簇数;0x48-0x4F为分区的逻辑序列号;0x50-0x53为校验和。
结合上面的截图,0x0B-0x0C偏移处的值为00 02(即0x0200),表示每扇区大小为512字节;0x0D偏移处的值为08,表示每簇包含8个扇区;0x15偏移处的值为F8,表示硬盘;0x18-0x19偏移处的值为3F 00(即0x003F),表示每磁道含有63个扇区;0x1A-0x1B偏移处的值为F0 00(即0x00F0);0x1C-0x1F偏移处的值为3F 00 00 00(即0x0000003F);0x28-0x2F偏移处的值为C0 CE D4 01 00 00 00 00(即0x0000000001D4CEC0);0x30-0x37偏移处的值为00 00 0C 00 00 00 00 00(即0x00000000000C0000),表示$MFT元文件的起始簇号为0x0C0000;0x38-0x3F偏移处的值为10 00 00 00 00 00 00 00(即0x0000000000000010);0x40偏移处的值为F6;0x44偏移处的值为01;0x48-0x4F偏移处的值为89 91 30 D4 A9 30 D4 92。
其中,0x0D处的每簇扇区数、0x30-0x37处的$MFT元文件的起始簇号是后续操作中需要用到的信息,用于定位$Root元文件。
3. 总结
本文介绍了NTFS文件操作的第二步,即解析DBR。通过解析DBR可以获知分区的信息,并定位到元文件$MFT,以供后续读取$Root元文件使用。
安装元神操作系统的工具“元神操作系统安装器”可去网站www.gnxxkj.com进行下载。安装账号可去网址http://www.gnxxkj.com/app/wuziqi/register.php 进行注册。
相关文章:
基于元神操作系统实现NTFS文件操作(三)
1. 背景 本文主要介绍DBR的读取和解析,并提供了基于元神操作系统的实现代码。由于解析DBR的目的是定位到NTFS磁盘分区的元文件$Root进行文件操作,所以只解析了少量的部分,其它部分可以参考相关文档进行理解。 DBR存在于磁盘分区的第一个扇区…...
深度学习与数学归纳法
最近发现,深度学习可以分为两个主要的阶段,分别是前向推理以及反向传播,分别对应着网络的推理和参数训练两个步骤。其中推理有时候也称为归纳推理。 在做参数训练的时候,本质上是在利用历史数据求网络参数的先验分布; …...
《Linux从小白到高手》理论篇(六):Linux软件安装一篇通
List item 本篇介绍Linux软件安装相关的操作命令,看完本文,有关Linux软件安装相关操作的常用命令你就掌握了99%了。 Linux软件安装 RPM RPM软件的安装、删除、更新只有root权限才能使用;查询功能任何用户都可以操作;如果普通用…...
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
1. 运行项目 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Appl…...
②EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器
EtherCAT转Modbus485RTU网关多路同步高速采集无需编程串口服务器https://item.taobao.com/item.htm?ftt&id798036415719 EtherCAT 串口网关 EtherCAT 转 RS485 (接上一章) 自由协议通信步骤 (以MS-A2-1041为例) 接收与…...
matlab-对比两张图片的HSV分量的差值并形成直方图
%对比两张图片的HSV分量的差值并形成直方图,改个路径就能用,图片分辨率要一致 close all; clear all; clc; I1imread(E:\test\resources\image\1.jpg); I2imread(E:\test\resources\image\2.jpg); HSV1 rgb2ntsc(I1); HSV2 rgb2ntsc(I2); %HSV,HSV 代…...
微服务SpringGateway解析部署使用全流程
官网地址: Spring Cloud Gateway 目录 1、SpringGateway简介 1、什么是网关 2、为什么用网关【为了转发】 2、应用: 1.启动nacos 2.创建网关项目 3.网关配置1 4.网关配置2【了解】 5.过滤器配置【了解】 1、SpringGateway简介 核心功能有三个&…...
Solidity 存储和内存管理:深入理解与高效优化
在 Solidity 中,存储和内存管理是编写高效智能合约的关键组成部分。合约执行的每一步操作都可能涉及到数据的存储和读取,而这些操作对 gas 的消耗有很大影响。因此,理解 Solidity 的存储模型以及如何优化数据的管理对于合约的安全性、性能和成…...
机器学习篇-day02-KNN算法实现鸢尾花模型和手写数字识别模型
一. KNN简介 KNN思想 K-近邻算法(K Nearest Neighbor,简称KNN)。比如:根据你的“邻居”来推断出你的类别 KNN算法思想:如果一个样本在特征空间中的k 个最相似的样本中的大多数属于某一个类别,则该样本也属…...
【C++】STL--vector
1.vector的介绍 我们先来看看vector的文档介绍,实际中我们只要熟悉相关接口就好了。 成员函数 使用STL的三个境界:能用,明理,能扩展 ,那么下面学习vector,我们也是按照这个方法去学习 2 vector的使用 v…...
Java使用Redis的详细教程
Redis是一个基于内存的key-value结构数据库,即非关系型数据库,具有高性能、丰富的数据类型、持久化、高可用性和分布式等特点。在Java项目中,Redis通常用于缓存、分布式锁、计数器、消息队列和排行榜等场景。以下是在Java中使用Redis的详细教…...
严重 Zimbra RCE 漏洞遭大规模利用(CVE-2024-45519)
攻击者正在积极利用 CVE-2024-45519,这是一个严重的 Zimbra 漏洞,该漏洞允许他们在易受攻击的安装上执行任意命令。 Proofpoint 的威胁研究人员表示,攻击始于 9 月 28 日,几周前,Zimbra 开发人员发布了针对 CVE-2024-…...
php函数积累
对称函数 isset 判断数组arr中是否存在键key 返回值true/false isset(name,$arr) unset 删除数组中的键 需存在key不然抛出异常 unset($arr[name]) json_encode 数据转json格式 json_encode($arr) 一般形式 指定字符编码形式 json_decode json格式转原有数据格式 json_d…...
前端项目场景相关的面试题,包含验证码、图片存储、登录鉴权、动态路由、组件划分等项目场景实际的面试题
项目场景面试题 如何防止短信验证码被刷 问题场景 添加倒计时和图片滑动验证,避免不必要的资源浪费 发送短信验证码需要费用发送短信消耗服务器资源 公司的图片、视频、文件资源如何存储的 传统模式 分开存储到数据服务器,托管服务器到云端 缺点&…...
uniapp 上了原生的 echarts 图表插件了 兼容性还行
插件地址:echarts - DCloud 插件市场 兼容性这块儿不知道后期会不会支持其他浏览器 H5 的话建议可以用原生的不用这个插件...
共享单车轨迹数据分析:以厦门市共享单车数据为例(八)
副标题:基于POI数据的站点综合评价——以厦门市为例(三) 什么是优劣解距离法(TOPSIS)? 优劣解距离法(Technique for Order Preference by Similarity to Ideal Solution,简称TOPSI…...
sentinel原理源码分析系列(二)-动态规则和transport
本文是sentinel原理源码分析系列第二篇,分析两个组件,动态配置和transport 动态规则 Sentinel提供动态规则机制,依赖配置中心,如nacos,zookeeper,组件支持动态配置,模板类型为规则,支…...
ubuntu切换源方式记录(清华源、中科大源、阿里源)
文章目录 前言一、中科大源二、清华源三、阿里源 前言 记录ubunut切换各个源的方式。 备注:更换源之后使用sudo apt-get update更新索引。 提示:以下是本篇文章正文内容,下面案例可供参考 一、中科大源 地址:https://mirrors.u…...
【10】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-泛型基础全解(泛型函数、泛型接口、泛型类)及参数、接口补充
序言: 本文详细讲解了关于ArkTs语言中的泛型,其中包含泛型函数、泛型接口、泛型约束、泛型类及其中参数的使用方法,补充了一部分接口相关的知识,包括接口的继承和具体实现,也写到了一些边边角角的小知识,剩…...
2024年09月CCF-GESP编程能力等级认证C++编程一级真题解析
本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 据有关资料,山东大学于1972年研制成功DJL-1计算机,并于1973年投入运行,其综合性能居当时全国第三位。DJL-1计算机运算控制…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
如何做好一份技术文档?从规划到实践的完整指南
如何做好一份技术文档?从规划到实践的完整指南 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...
stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
这是系统中断服务程序的默认处理汇编函数,如果我们没有定义实现某个中断函数,那么当stm32产生了该中断时,就会默认跑这里来了,所以我们打开了什么中断,一定要记得实现对应的系统中断函数,否则会进来一直循环…...
今日行情明日机会——20250609
上证指数放量上涨,接近3400点,个股涨多跌少。 深证放量上涨,但有个小上影线,相对上证走势更弱。 2025年6月9日涨停股主要行业方向分析(基于最新图片数据) 1. 医药(11家涨停) 代表标…...
