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

devtools/2024/10/23 22:29:12/

1. 背景

本文继续介绍当前磁盘分区下的文件遍历操作,对于从$Root元文件的90H属性和A0H属性中解析出的子目录,解析每个子目录下的文件,并提供了基于元神操作系统的实现代码。

2. 方法

(1)判断子目录

判断子目录分为两种情况,在遍历90H属性和A0H属性时可以通过对应索引项的偏移0x48-0x4B处的值来判断,在读取对应文件的元文件后可以通过30H属性体的偏移0x38-0x3B处的值来判断。这两种情况分别适用于文件集遍历和单文件操作两种情形。

具体的做法是对偏移处的值做位测试,1表示只读文件,2表示隐藏文件,4表示系统文件,0x20表示归档文件,0x10000000表示目录,其他定义可以查阅相关文档。如果某个文件项中该偏移处的值为0x10000002,则表示该文件项所指的是一个隐藏目录。

继续前文的代码,假设当前ESI中保存的是某个文件的索引项起始地址,则判断当前文件是否为子目录的代码片段如下所示:

	test dword [fs:esi+0x48], 0x10000000jnz .fold

如果是子目录,则跳转到.fold标签处完成进一步操作,比如遍历该子目录下的文件等。

(2)遍历子目录

遍历子目录分为两种情况,一种是直接给出完整的目录路径,搜索该路径获得子目录的MFT编号,并通过该编号读取和遍历该子目录下的所有文件;另一种情况是在遍历父目录的过程中遇到子目录,此时直接从对应的索引项中读取子目录的MFT编号,然后通过该编号读取和遍历子目录下的所有文件。第一种情况在后续的文件搜索操作中进行介绍,本文先介绍第二种情况。

在通过90H和A0H属性遍历某个目录(例如根目录)下的文件时,如果发现某个索引项所标识的是子目录并且需要进一步遍历该子目录下的文件,则通过索引项的偏移0x00-0x07处获取对应子目录的MFT编号,然后用该编号定位和读取元文件,之后在读取的数据中解析90H属性和A0H属性来实现文件遍历。

继续前文的代码,假设当前ESI中保存的是某个索引项的起始地址,经判断,该索引项标识的是子目录,并需要对该子目录进行遍历,则部分代码如下所示:

	mov eax, [fs:edi+0x00]	;MFT no.mov ebx, [ds:mem_addr]call read_mftcall parse_90hcall parse_a0h

上述代码中只使用了MFT编号的低4字节,对于小分区,该值已经完全够用。代码中的函数parse_90h和parse_a0h分别对应着解析90H属性和解析A0H属性,其具体实现代码可以参考前文;至于函数read_mft,类似于前文的read_disk_root,区别在于读取的不再是$Root元文件,换成了目标MFT文件,其实现代码如下所示:

;read mft eax to buffer ebx
;input:
;	eax: mft no. to read
;	ebx: address of buffer to store the data
read_mft:pushamov esi, sector_dbrcmp dword [ds:esi+3], 'NTFS'jnz .errormov edx,dword [ds:esi+0x30]movzx ecx,byte [ds:esi+0x0D]imul edx, ecxadd edx, [ds:partition_base]shl eax, 1add edx, eaxmov edi, API_PARAMmov dword [fs:edi], API_READ_DISK_SECTORmov dword [fs:edi+4], 2		;2 parametersmov dword [fs:edi+8], edx	;parameter_1: sector no.mov dword [fs:edi+12], ebx	;parameter_2: start address of buffer to store resultcall pword [fs:OS_API]inc edxadd ebx, 512mov edi, API_PARAMmov dword [fs:edi], API_READ_DISK_SECTORmov dword [fs:edi+4], 2		;2 parametersmov dword [fs:edi+8], edx	;parameter_1: sector no.mov dword [fs:edi+12], ebx	;parameter_2: start address of buffer to store resultcall pword [fs:OS_API]jmp .end.error:stc.end:poparet

本文所述代码的运行效果与前文类似,都是显示了目标目录下的文件列表,可自行编译并通过元神操作系统运行查看结果。下图所示为对d1:\windows目录进行遍历的部分结果:

3. 总结

本文介绍了文件遍历操作中对子目录的遍历,也是文件遍历的最后一部分内容。

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


http://www.ppmy.cn/devtools/128272.html

相关文章

TCP标志位在网络故障排查中的作用

http://www.anatraf.com 在网络运维和故障排查中,理解TCP协议至关重要,而TCP标志位(Flags)更是其中的核心。通过分析TCP包的各个标志位,我们可以获取丰富的状态信息,帮助网络工程师定位问题,优…

QT的文件操作类 QFile

QFile 是 Qt 框架中用于文件处理的一个类。它提供了读取和写入文件的功能,支持文本和二进制文 件。 QFile 继承自 QIODevice ,因此它可以像其他IO设备一样使用。 主要功能 文件读写: QFile 支持打开文件进行读取或写入操作文件信息&#x…

vulnhub靶场之digitalworld.local DEVELOPMENT

一.环境搭建 1.靶场描述 This machine reminds us of a DEVELOPMENT environment: misconfigurations rule the roost. This is designed for OSCP practice, and the original version of the machine was used for a CTF. It is now revived, and made slightly more nefari…

15分钟学Go 第9天:函数的定义与调用

第9天:函数的定义与调用 欢迎来到第9天的Go语言学习模块!今天我们将深入探讨函数的定义与调用,帮助你掌握如何编写和使用函数。学习函数不仅是Go语言的基础,也是程序设计的核心概念之一。这一节将详细介绍函数的结构、参数传递、…

【VUE】Vue渲染列表为什么要加key

提升Vue渲染性能:帮助 Vue 跟踪每个节点的身份,进行高效的 DOM 操作;如果不设置key值,则 Vue 无法准确地知道哪些元素是新增、删除或者移动的,只能重新渲染整个列表,导致性能下降;只有通过为每个…

计算机毕设项目:网上订餐管理系统(Java+Springboot+MySQL),完整源代码+数据库+毕设文档+部署说明

本文关键字:Java编程;Springboot框架;毕业设计;毕设项目;编程实战;项目源代码;程序数据库;毕设文档;开题报告和任务书;项目部署说明;网上订餐管理…

无法获得下列许可 SOLIDWORKS Standard。 无法从使用许可服务器内读取数据,(-16,10009,10054)

无法获得下列许可 SOLIDWORKS Standard。 无法从使用许可服务器内读取数据,(-16,10009,10054) 错误如图 打开xxclean 扩展功能 服务无法启动

ceph pg stale 恢复

问题 如果 ceph -s 看到 ceph 有类似如下状态的 pg data:volumes: 1/1 healthypools: 5 pools, 113 pgsobjects: 6.94k objects, 22 GiBusage: 24 GiB used, 33 TiB / 33 TiB availpgs: 0.885% pgs not active366/13880 objects degraded (2.637%)