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

相关推荐
红点租赁系统开发2 小时前
小程序租赁系统开发指南与实现策略
其他
老陈头聊SEO20 小时前
新手SEO指南如何快速入门与提升网站排名
其他
老陈头聊SEO20 小时前
提炼关键词的力量:AI驱动下的SEO优化策略
其他
打工的小李1 天前
人才画像系统助力企业构建可持续发展的动态人才成长体系
其他
红点租赁系统开发1 天前
金融租赁系统的发展与全球化战略实施探讨
其他
这是我582 天前
C++打小怪游戏
c++·其他·游戏·visual studio·小怪·大型·怪物
NullPointerZZZ2 天前
vue3和element-plus笔记
其他
gavin_gxh3 天前
SAP PP ECN CSAP_MAT_BOM_MAINTAIN
运维·经验分享·其他
安建资小栗子5 天前
一般行业安全管理人员考试题库分享
其他
cwtlw6 天前
SpringMVC的使用
java·开发语言·笔记·学习·其他