基于元神操作系统实现NTFS文件操作(三)

news2024/10/3 19:19:56

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函数的调用,代码如下所示:

use32

START:
	pusha
	
	call read_disk_mbr
	
	mov eax, 0
	call read_disk_dbr	;read dbr in partition eax
	
	popa
	iret
	
sector_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:
	pusha
	mov edi, API_PARAM
	mov dword [fs:edi], API_READ_DISK_SECTOR
	mov dword [fs:edi+4], 2		;2 parameters
	
	mov ebx, sector_buff
	add ebx, 0x1BE			;ebx point to partition table
	shl eax, 4			    ;eax * 16
	add ebx, eax			;ebx point to dest partition item
	add ebx, 8			    ;ebx point to start sector no. of dest partition
	mov edx, [ds:ebx]
	mov dword [fs:edi+8], edx	;parameter_1: sector no.
	mov [ds:partition_base], edx
	
	xor eax, eax
	mov ax, ds
	add eax, SEG_BASE
	mov bh,byte [fs:eax+7]
	mov bl,byte [fs:eax+4]
	shl ebx,16
	mov bx,word [fs:eax+2]
	add ebx, sector_dbr
	mov dword [fs:edi+12], ebx	;parameter_2: start address of buffer

	call pword [fs:OS_API]
	
	mov eax, 512
	movzx ebx, word [fs:cursor_y]
	movzx ecx, word [fs:cursor_x]
	mov esi, [fs:edi+12]
	call print_bytes_hex
	
	add word [fs:cursor_y], 20

 .end:
	popa
	ret

上述代码将磁盘第一个分区的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 进行注册。 

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

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

相关文章

《数据结构》--链表【包含跳表概念】

不知道大家对链表熟悉还是陌生,我们秉着基础不牢,地动山摇的原则,会一点点的介绍链表的,毕竟链表涉及的链式存储也很重要的。在这之前,我们认识过顺序存储的顺序表,它其实就是一个特殊的数组。那链表到底是…

树莓派 AI 摄像头(Raspberry Pi AI Camera)教程

系列文章目录 前言 人们使用 Raspberry Pi 产品构建人工智能项目的时间几乎与我们生产 Raspberry Pi 的时间一样长。随着我们发布功能越来越强大的设备,我们能够支持的原生应用范围也在不断扩大;但无论哪一代产品,总会有一些工作负载需要外部…

SpringBoot介绍及整合Mybatis Plus

目录 SpringBoot背景及特点 SpringBoot整合Mybatis Plus SpringBoot背景及特点 SpringBoot的设计目是抛弃之前Spring、SpringMVC繁杂的配置过程,简化开发过程。之前的Spring框架需要大量的手动配置,包括XML配置文件或Java配置类,配置过程繁…

深入理解 Git 一个开发者的必备工具

深入理解 Git 一个开发者的必备工具 演示地址 演示地址 获取更多 获取更多 在现代软件开发中,版本控制系统扮演着至关重要的角色。其中,Git 是最流行的选择之一。无论你是新手还是有经验的开发者,了解 Git 的基本概念和使用方法都能大大提…

YOLO v11实时目标检测3:训练数据集格式说明

一、Yolov11简介 YOLOv11 是 YOLO 系列的最新版本,它不仅在目标检测方面表现出色,还引入了对象分割和多目标跟踪的功能。本文将介绍如何使用 YOLOv11 进行人流统计、车流统计以及跟踪的实际应用。 二、Yolo v11训练数据集格式说明 2.1 数据组织&#…

SAT分离轴定理的c++/python实现

分离轴定理的c/python实现 现在要对BEV模型检查出来的车辆做NMS,把3d框的平面属性获取到后,配合旋转角度投影到地面就是2D图形。 开始碰撞检测,判断是否重叠,保留置信度高的框就行。 原理 分离轴定理(Separating A…

(C语言贪吃蛇)11.贪吃蛇方向移动和刷新界面一起实现面临的问题

目录 前言 实现效果 支持方向变换 修改默认效果 如何修改 总结 前言 我们上节实现了不需要按下右键就可以是贪吃蛇自发的向右移动,本节我们主要来解决贪吃蛇方向移动和刷新界面所遇到的问题。 实现效果 上图是我们希望实现的效果,我们可以自发地控…

Go 进阶:Go + gin 极速搭建 EcommerceSys 电商系统

Go 进阶:Go + gin 极速搭建 EcommerceSys 电商系统 前言 本章节适合有一定基础的 Golang 初学者,通过简单的项目实践来加深对 Golang 的基本语法和 Web 开发的理解。 具体请联系作者 项目结构 项目流程图 技术栈 项目结构 项目路由 4. 项目模型 项目初始化 初始化项目文…

归并排序【C语言版-笔记】

目录 一、概念二、排序流程理解三、代码实现3.1主调函数3.2 merge函数 四、性能分析 一、概念 归并是一种算法思想,是将两个或两个一上的有序表合并成一个长度较大的有序表。若一开始无序表中有n个元素,可以把n个元素看作n个有序表,把它们两…

Java中数据转换以及字符串的“+”操作

隐式转换(自动类型转换) 较小范围的数据类型转成较大范围的数据类型 强制转换(显式转换) 将数据范围大的数据类型转换为数据范围小的数据类型 基本数据类型之间的转换 当需要将一个较大的数据类型(如float或double…

Linux:进程控制(一)

目录 一、写时拷贝 1.创建子进程 2.写时拷贝 二、进程终止 1.函数返回值 2.错误码 3.异常退出 4.exit 5._exit 一、写时拷贝 父子进程,代码共享,不作写入操作时,数据也是共享的,当任意一方试图写入,便通过写时拷…

影刀RPA实战:excel相关图片操作指令解

1.实战目标 excel是工作中必不缺少的工具,今天我们继续使用影刀RPA来实现excel操作的便利性,让影刀自动化来帮我们完成工作。 2.单元格填充图片 2.1 指令说明 功能:向 Excel 单元格插入本地图片或网络图片,支持Office和WPS&…

波阻抗,是电场矢量的模值/磁场矢量的模值

波阻抗是电场复振幅除以磁场复振幅,最后只与介质με有关 所以磁场可用电场强度表示(利用波阻抗) 问题,复振幅是矢量,波阻抗的定义是复振幅的比值?答案:不是,很明显,波阻…

Web3 游戏周报(9.22 - 9.28)

回顾上周的区块链游戏概况,查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【9.22-9.28】Web3 游戏行业动态: Axie Infinity 将 Fortune Slips 的冷却时间缩短至 24 小时,从而提高玩家的收入。 Web3 游戏开发商 Darkbright Studios…

Pikachu-Sql Inject-搜索型注入

MySQL的搜索语句: select * from table where column like %text%; 如:使用引号闭合左边的引号, or 11 把所有数据查询出来; # 注释掉后面的 引号等; test or 11# 查询出结果: 注入的核心点…

Cloneable接口(浅拷贝和深拷贝的区别)

前言 Object类中存在这一个clone方法,调用这个方法可以创建一个对象的“拷贝”。但是想要合法调用clone方法,必须要先实现Clonable接口,否则就会抛出CloneNotSupportedException异常。 1 Cloneable接口 //Cloneable接口声明 public interf…

CentOS 7文件系统

从centos7开始,默认的文件系统从ext4变成了XFS。随着虚拟化的应用越来越广泛,作为虚拟化磁盘来源的大文件(单个文件几GB级别)越来越常见。 1.XFS组成部分: XFS文件系统在数据的分布上主要划分为三部分:数据…

QT篇:QT介绍

一.QT概述 Qt 是一个跨平台的应用程序和用户界面框架,用于开发图形用户界面(GUI)应用程序以及命令行工 具。它最初由挪威的 Trolltech (奇趣科技)公司开发,现在由 Qt Company 维护,2020年12月8…

如何在网格中模拟腐烂扩散:如何使用广度优先搜索(BFS)解题

问题描述 你需要在一个二维的网格中处理橘子的腐烂扩散过程,网格中的每个单元格可以有三种状态: 0:表示空格,没有橘子。1:表示一个新鲜的橘子。2:表示一个腐烂的橘子,它可以在 1 分钟内让上下…

模拟算法(1)_替换所有的问号

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 模拟算法(1)_替换所有的问号 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. …