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

相关推荐
老陈头聊SEO1 天前
SEO长尾词优化实战布局
其他
ye150127774552 天前
220V转直流非隔离传感器供电电源芯片WT5105
stm32·单片机·嵌入式硬件·其他·硬件工程
时空无限3 天前
虚无隧穿产生宇宙(true nothing tunneling) 是谁提出的
其他
张高兴5 天前
为什么要对程序进行调试
其他
这是我585 天前
awk命令——功能强大的文本处理工具
linux·其他·shell·awk·强大··
cwtlw8 天前
PhotoShop学习10
笔记·学习·其他·photoshop
stockmasterx8 天前
什么是ETF跟踪误差?场内基金佣金最低是多少?
经验分享·笔记·其他
技术与健康9 天前
学点概率论,打破认识误区
经验分享·其他
安德胜SMT贴片9 天前
SMT贴片:现代电子制造的核心工艺
其他
职坐标在线9 天前
职坐标解码互联网行业转型发展新动能
其他