当前位置: 首页 > 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计算机运算控制…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...