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

  1. 背景

本文主要介绍Root元文件的读取,并提供了基于元神操作系统的实现代码。Root元文件中包含了当前分区的根目录下的文件和子目录信息,具体的可以参考相关文档,后续连载文章中也会逐步讲解。

  1. 方法

(1)定位$Root元文件

在DBR内容的偏移0x30处可以得到MFT元文件的起始簇号,在偏移0x0D处可以得到每簇扇区数,将这两个值相乘即可得到MFT元文件的起始扇区号。最后,再加上目标分区的起始地址,就得到了MFT元文件在磁盘上的扇区号,也就是定位MFT元文件所需要的内容。

MFT元文件有很多,其前16个是固定的。5号元文件就是Root元文件,该元文件中存放着根目录文件,用于管理根目录,也是本文的目标。其它的元文件可以参考相关的文档,0号元文件是MFT,1号元文件是MFTMirr,2号元文件是LogFile,3号元文件是Volume,4号元文件是AttrDef,6号元文件是Bitmap,7号元文件是Boot,8号元文件是BadClus。

每个元文件占用2个扇区,即1KB内容。所以,在MFT元文件的起始扇区号上加10,得到的便是5号元文件Root的起始扇区号,也就是本文定位和读取$Root所需要的内容。

(2)调用元神操作系统的API读取$Root元文件

先用API_ALLOC_MEMORY调用元神操作系统的API来分配内存,用于存放元文件的内容,该操作实现在mem_alloc函数中。然后定位到Root元文件并用API_READ_DISK_SECTOR调用元神操作系统的API两次来读取Root元文件的内容,该操作实现在read_disk_root函数中。最后,在主函数中的读取DBR之后添加对mem_alloc函数和read_disk_root函数的调用,代码如下所示:

复制代码
use32

START:
	pusha
	
	call read_disk_mbr
	
	mov eax, 0
	call read_disk_dbr	;read dbr in partition eax
	
	call mem_alloc
	call read_disk_root
	
	popa
	iret
	
read_disk_root:
	pusha	;pushes eax,ecx,edx,ebx,esp,ebp,esi,edi
	mov esi, sector_dbr
	cmp dword [ds:esi+3], 'NTFS'
	jnz .end

	mov eax,dword [ds:esi+0x30]	    ;eax = cluster no. of MFT, 8B
	movzx ecx,byte [ds:esi+0x0D]	;sector count of each cluster
	imul eax, ecx	                ;eax = sector no. of MFT
	add eax, [ds:partition_base]	;eax = LBA no. of MFT
	add eax, 10	                    ;eax = LBA no. of $Root in MFT:
	mov ebx, [ds:mem_addr]
	
	mov edi, API_PARAM
	mov dword [fs:edi], API_READ_DISK_SECTOR
	mov dword [fs:edi+4], 2		;2 parameters
	mov dword [fs:edi+8], eax	;parameter_1: sector no.
	mov dword [fs:edi+12], ebx	;parameter_2: start address of buffer to store result
	call pword [fs:OS_API]
	
	inc eax
	add ebx, 512
	mov dword [fs:edi], API_READ_DISK_SECTOR
	mov dword [fs:edi+4], 2		;2 parameters
	mov dword [fs:edi+8], eax	;parameter_1: sector no.
	mov dword [fs:edi+12], ebx	;parameter_2: start address of buffer to store result
	call pword [fs:OS_API]
	
	mov eax, 512
	movzx ebx, word [fs:cursor_y]
	movzx ecx, word [fs:cursor_x]
	mov esi, [ds:mem_addr]
	call print_bytes_hex
	
	add ebx, 20
	add esi, 512
	call print_bytes_hex
	
	add word [fs:cursor_y], 40
	
 .end:
	popa
	ret

mem_addr dd 0
mem_size dd 0
mem_alloc:
	pusha
	
	mov edi, API_PARAM
	mov dword [fs:edi], API_ALLOC_MEMORY
	mov dword [fs:edi+4], 0
	call pword [fs:OS_API]
	
	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]
	mov ecx, ebx
	add ebx, mem_addr
	add ecx, mem_size
	
	mov eax, [fs:edi+8]		;start address of memory for allocation
	mov [fs:ebx], eax
	mov eax, [fs:edi+12]		;memory size for allocation
	mov [fs:ecx], eax
	
	popa
	ret

上述代码中先申请内存,将内存的首地址存在变量mem_addr中,将内存的大小存放在变量mem_size中。然后根据DBR中偏移0x03-0x06处的内容来判断当前分区是否是NTFS分区,如果不是则直接退出,否则根据DBR的内容定位到$Root元文件,并将其2个扇区的数据内容读取到申请的内存中,最后以十六进制形式进行显示,结果如下图所示:

第一张图为Root元文件第一个扇区的内容,第二张图为Root元文件第二个扇区的内容。

注意:此处打印内容的操作仅为讲解需要,后续操作追加之前应当注释掉read_disk_root函数中对于print_bytes_hex调用相关的部分,即注释掉call pword [fs:OS_API]之后的部分。

(3)解析$Root元文件

$Root元文件的解析涉及到的内容较多,限于篇幅,将在下一篇博文中进行介绍。

  1. 总结

本文介绍了NTFS文件操作的第三步,即定位并读取Root元文件,下文将结合本文读取的内容对Root元文件的内容进行解析。

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

相关推荐
数字体验运营官7 小时前
内容中台重构企业知识管理路径
其他
数字体验运营官10 小时前
Baklib知识中台构建企业智能服务新引擎
其他
xiaobin8899915 小时前
matlab官方免费下载安装超详细教程2025最新matlab安装教程(MATLAB R2024b)
java·开发语言·其他·matlab
烈焰猩猩20 小时前
计算机发展的历程
其他
laowangpython1 天前
MySQL基础面试通关秘籍(附高频考点解析)
数据库·mysql·其他·面试
职坐标在线2 天前
职坐标AIoT技能培训课程实战解析
其他
草莓熊Lotso3 天前
【C语言字符函数和字符串函数(一)】--字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现
c语言·开发语言·经验分享·笔记·其他
xiaobin889993 天前
【2025最新版】VMware虚拟机下载安装教程 保姆级图文详解(附安装包+常用镜像Linux,win11,ubuntu,centos)
linux·其他·ubuntu·centos
橘子洲头4 天前
有关知名分析品牌默克Supelco®的前世今生
其他
生态笔记5 天前
R利用spaa包计算植物/微生物的生态位宽度和重叠指数
经验分享·其他