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

1. 背景

本文主要介绍MBR的读取和解析,并提供了基于元神操作系统的实现代码。由于解析MBR的目的是定位到NTFS磁盘分区进行文件操作,所以只解析了MBR的分区表部分,至于MBR的其它部分,可以参考相关文档进行理解。

2. 方法

(1)调用元神操作系统的API读取MBR

使用API_READ_DISK_SECTOR来调用元神操作系统的API,代码如下所示:

use32START:pushacall read_disk_mbrpopairetinclude 'api_def.inc'OS_API equ 0x00030C16
API_PARAM equ 0x03000000
SEG_BASE equ 0x00040000
cursor_x equ 0x02004B10
cursor_y equ 0x02004B12sector_buff: times 512 db 0
read_disk_mbr:pushamov edi, API_PARAMmov dword [fs:edi], API_READ_DISK_SECTORmov dword [fs:edi+4], 2		;2 parametersmov dword [fs:edi+8], 0		;parameter_1: sector no.xor 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_buffmov 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], 20poparet;print hex bytes
;input:
;	eax: byte count to print
;	ebx: y coordinate to print (from 0)
;	ecx: x coordinate to print (from 0)
;	esi: buffer storing data to print
print_bytes_hex:pushaimul edi,ebx,80*2	;calculate coordinateadd edi,ecxadd edi,ecxmov ecx,eaxmov ah,0x0F.next_char:mov bl,byte [fs:esi].hex_char:mov al,bland al,0x0Fadd al,0x30cmp al,0x39jbe .num_charadd al,'A'-0x30-10.num_char:mov [gs:edi+2],axshr ebx,4mov al,bland al,0x0Fadd al,0x30cmp al,0x39jbe .num_char2add al,'A'-0x30-10.num_char2:mov [gs:edi],axmov al,' 'mov [gs:edi+4],axadd edi,6inc esiloop .next_charpoparet

上述代码将磁盘的第一个扇区(0号扇区)的内容读取到sector_buff缓冲区中,并以十六进制形式进行显示,结果如下图所示:

该图中显示的内容就是磁盘第一个扇区的内容,即MBR的内容。

注意:此处打印MBR内容的操作仅为讲解需要,后续操作追加之前应当注释掉read_disk_mbr函数中对于print_bytes_hex调用相关的部分,即注释掉call pword [fs:OS_API]之后的部分。另外,该例所示代码的详细解释可参考前面的博文。

(2)解析MBR

MBR的内容共有512字节,前446个字节为引导代码,之后的64字节为磁盘分区表,最后2个字节为标记字节(固定为55 AA)。

本文主要解析中间64字节的分区表。该表包含4个项,每个项为16字节,所以通过该分区表可以表示4个磁盘分区,即一个磁盘最多可以分4个区。更多的分区需要扩展分区的支持,不在本文介绍的范围之内,需要的可以参考相关文档自行实现。

每个分区表项占16个字节。第一个字节为启动标志,值为80H时表示该分区包含操作系统,即操作系统安装在该分区中,值为00H时表示该分区不包含操作系统;第2-4字节表示该分区开始的磁头号、扇区号、柱面号;第5字节表示该分区的文件系统类型,值为0BH时表示FAT32文件系统,值为07H时表示NTFS文件系统;第6-8字节表示该分区结束的磁头号、扇区号、柱面号;第9-12字节表示该分区首扇区的相对扇区号;第13-16字节表示该分区的总扇区数。

在分区表项中,提供了两种方式对分区进行定位:第一种是使用磁头号、扇区号、柱面号进行定位;第二种是使用分区首扇区的相对扇区号进行定位。对于大容量的磁盘,目前主要使用的是第二种方式。

结合上面的截图,4个分区表项中只有前两个有内容,后两个表项全是0,所以测试磁盘中有两个分区(常见的为C盘和D盘)。第一个表项的内容为“80 01 01 00 07 EF FF FF 3F 00 00 00 C1 CE D4 01”,第一个字节为80H,表示操作系统安装在该分区中;第5字节为07H,表示该分区的文件系统类型为NTFS;第9-12字节为3F 00 00 00,表示该分区首扇区的相对扇区号为0x0000003F,即该分区的第一个扇区为0x3F号扇区(即63号扇区);第13-16字节为C1 CE D4 01,表示该分区的总扇区数为0x01D4CEC1,即该分区包含30,723,777个扇区,合计为15,730,573,824个字节,约为15GB。

类似的,第二个表项的内容为“00 00 C1 FF 07 EF FF FF 00 CF D4 01 F0 48 D3 02”,第一个字节为00H,表示该分区不包含操作系统;第5字节为07H,表示该分区的文件系统类型为NTFS;第9-12字节为00 CF D4 01,表示该分区的首扇区的相对扇区号为0x01D4CF00,即该分区的第一个扇区为0x01D4CF00扇区;第13-16字节为F0 48 D3 02,表示该分区的总扇区数为0x02D348F0,即该分区包含47,401,200个扇区,合计为24,269,414,400个字节,约为24GB。

3. 总结

本文介绍了NTFS文件操作的第一步,即解析MBR。通过解析MBR可以获知磁盘的分区信息,并定位到目标分区,以供后续读取DBR使用。

安装元神操作系统的工具“元神操作系统安装器”可去网站www.gnxxkj.com进行下载。安装账号可去网址http://www.gnxxkj.com/app/wuziqi/register.php 进行注册。 

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

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

相关文章

Python使用matplotlib绘制五星红旗

安装包 pip install matplotlib pip install numpy完整代码 import matplotlib.pyplot as plt import numpy as np# 设置画布尺寸 fig plt.figure(figsize(10, 7)) ax fig.add_subplot(111)# 绘制红色背景 ax.set_facecolor(red)# 五星红旗的尺寸定义 flag_width 30 flag_…

VMware ESXi 8.0U3b macOS Unlocker OEM BIOS 2.7 Dell HPE 定制版 9 月更新发布

VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 Dell HPE 定制版 9 月更新发布 VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 8.0U3 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、IEIT SYSTEMS (浪潮信息)、Cisco …

前端规范工程-2:JS代码规范(Prettier + ESLint)

Prettier 和 ESLint 是两个在现代 JavaScript 开发中广泛使用的工具,它们结合起来可以提供以下作用和优势: 代码格式化和风格统一: Prettier 是一个代码格式化工具,能够自动化地处理代码的缩进、空格、换行等格式问题,…

491. 递增子序列

文章目录 491. 递增子序列思路回溯三部曲总结 491. 递增子序列 491. 递增子序列 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素,如…

Linux中的进程间通信之管道

管道 管道是Unix中最古老的进程间通信的形式。 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道” 匿名管道 #include <unistd.h> 功能:创建一无名管道 原型 int pipe(int fd[2]); 参数 fd&#xff1a;文件描述符数组,其中fd[0]表示读端, fd[1]表示写端 …

解锁PDF阅读器的神奇功能与应用场景

PDF格式的文档因其稳定性、兼容性和安全性&#xff0c;成为了广泛传播和存储信息的重要载体。而PDF阅读器则是我们打开这个数字知识宝库的关键钥匙。接下来&#xff0c;让我们一同走进福昕PDF阅读器和它小伙伴们的世界&#xff0c;去探索它们的神奇之处。 1.福昕阅读器 链接一…

Spring Boot 和 MyBatis-Plus凑一块儿了,这份教程你得看

一、引言 MyBatis-Plus 是 MyBatis 的增强版&#xff0c;提供了 CRUD 接口、分页插件、性能分析插件等特性&#xff0c;简化了开发过程。本文将详细介绍如何在 Spring Boot 项目中集成 MyBatis-Plus。 支持的数据看也越来越多&#xff0c;值得去搞一下&#xff0c;写了一个小例…

Hive数仓操作(八)

一、Hive中的分桶表 1. 分桶表的概念 分桶表是Hive中一种用于提升查询效率的表类型。分桶指的是根据指定列的哈希值将数据划分到不同的文件&#xff08;桶&#xff09;中。 2. 分桶表的原理 哈希分桶&#xff1a;根据分桶列计算哈希值&#xff0c;对哈希值取模&#xff0c;将…

三维激光扫描技术在文保修缮项目中的应用

三维激光扫描技术作为一种新兴的高精度空间数据获取手段&#xff0c;其在文物保护和修缮项目中的应用日益广泛。这项技术通过快速获取物体表面的三维密集点云数据&#xff0c;为文物的数字化存档、保护、修复及再利用提供了强有力的技术支持。 数据采集&#xff1a;高精度与非接…

Python案例--水仙花数的探索之旅

一、引言 水仙花数&#xff0c;也称为阿姆斯特朗数&#xff0c;是一种特殊的三位数&#xff0c;其各位数字的立方和等于其本身。例如&#xff0c;153就是一个水仙花数&#xff0c;因为 135333153135333153。这种数字的发现不仅展示了数字的内在美&#xff0c;也激发了人们对数…

Element-plus安装及其基础组件使用

简而言之&#xff0c;在main.js中导出以下库,仅此&#xff0c;搞多了出错难排查 import ElementPlus from element-plus //导入ElementPlus 模块 import element-plus/dist/index.css //引入样式 app.use(ElementPlus) //注册库就能使用了 Element Plus 是一个基于 Vue 3 的组件…

《Linux从小白到高手》理论篇(十一):Linux的系统环境管理

值此国庆佳节&#xff0c;深宅家中&#xff0c;闲来无事&#xff0c;就多写几篇博文。本篇详细深入介绍Linux的系统环境管理。 环境变量 linux系统下&#xff0c;如果你下载并安装了应用程序&#xff0c;很有可能在键入它的名称时出现“command not found”的提示内容。如果每…

2024必备英语在线翻译工具推荐

英语在线翻译工具就如同一位随时待命的语言助手&#xff0c;为我们打破语言障碍&#xff0c;搭建起沟通的桥梁。接下来&#xff0c;让我们一起深入了解这些英语在线翻译工具的丰富功能及其为我们带来的便利。 1.福昕在线翻译 链接直达>>https://fanyi.pdf365.cn/doc …

命令按钮QLink

主要作用用来点击后可以自动打开系统的网页浏览器&#xff0c;跳转到指定的网页 常用方法 文本 //获取和设置文本 QString text() const void setText(const QString &text)描述信息 //获取和设置描述文本 QString description() const void setDescription(const QSt…

【RabbitMQ】面试题

在本篇文章中&#xff0c;主要是介绍RabbitMQ一些常见的面试题。对于前几篇文章的代码&#xff0c;都已经在码云中给出&#xff0c;链接是mq-test: 学习RabbitMQ的一些简单案例 (gitee.com)&#xff0c;如果存在问题的话欢迎各位提出&#xff0c;望共同进步。 MQ的作用以及应用…

【web安全】——XXE漏洞

1.XML基础 1.1.XML简介 XML被称为可扩展标记语言&#xff0c;与HTML类似&#xff0c;但是HTML中的标签都是预定义(预先定义好每个标签的作用)的&#xff0c;而XML语言中的标签都是自定义(可以自己定义标签的名称、属性、值、作用)的;HTML中的标签可以是单标签&#xff0c;而X…

SpringMVC源码-SpringMVC框架中Spring父容器和SpringMVC子容器加载的流程以及SpringMVC九大内置组件的初始

一、Spring父容器启动 SpringMVC 的项目结构如下: applicationContext.xml spring的配置文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.o…

机器学习西瓜书笔记(十三) 第十三章半监督学习+代码

第十三章 13 半监督学习13.1 未标记样本13.3.1 小结 13.2 生成式方法13.2.1 小结 13.3 半监督SVM13.3.1 小结 13.4 图半监督学习13.4.1 小结 13.5 基于分歧的方法13.5.1 小结 13.6 半监督聚类13.6.1 小结 13.7 代码&#xff1a;手写数据集上的标签传播-性能展示章末小结 13 半监…

数据结构——初识树和二叉树

线性结构是一对一的关系&#xff0c;意思就是只有唯一的前驱和唯一的后继&#xff1b; 非线性结构&#xff0c;如树形结构&#xff0c;它可以有多个后继&#xff0c;但只有一个前驱&#xff1b;图形结构&#xff0c;它可以有多个前驱&#xff0c;也可以有多个后继。 树的定义…

变电站红外检测数据集 1180张 变电站红外 标注voc yolo 13类

变电站红外检测数据集 1180张 变电站红外 标注voc yolo 13类 变电站红外检测数据集 名称 变电站红外检测数据集 (Substation Infrared Detection Dataset) 规模 图像数量&#xff1a;1185张图像。类别&#xff1a;13种设备类型。标注个数&#xff1a;2813个标注。 数据划分…