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 进行注册。