基于元神操作系统实现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 进行注册。

相关推荐
方安乐9 小时前
命理学研究
其他
闪闪发亮的小星星2 天前
欧拉角的定义
其他
探序基因3 天前
R语言读取h5格式的文件
其他
t057773 天前
立足通用航空生态 德意志飞机与COMTRONIC开启D328eco合作新篇章
其他
方见华Richard4 天前
递归对抗引擎RAE V4.0(AGI自主进化版)
经验分享·笔记·其他·交互·学习方法
老陈头聊SEO4 天前
长尾关键词在SEO优化中的应用及其对流量提升的影响分析
其他·搜索引擎·seo优化
晚霞的不甘5 天前
Flutter for OpenHarmony:迈向专业:购物APP的架构演进与未来蓝图
其他·flutter·架构·fiddler·前端框架·harmonyos
t057776 天前
精工美学新标杆!VELO ANGEL RIDE 坐垫尽显骑行美学
其他
t057776 天前
解锁跑骑肌肉密码!维乐 Angel 3D 坐垫让训练更高效
其他
老陈头聊SEO7 天前
生成引擎优化(GEO)在提升内容价值与搜索引擎排名中的关键作用
其他·搜索引擎·seo优化