当前位置: 首页 > news >正文

基于元神操作系统实现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计算机运算控制…...

网络编程(UDP编程)

思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...