mx动漫wordpress主题,如何做谷歌优化,网络程序,新闻单位网站建设的意义1. 背景
本文主要介绍DBR的读取和解析#xff0c;并提供了基于元神操作系统的实现代码。由于解析DBR的目的是定位到NTFS磁盘分区的元文件$Root进行文件操作#xff0c;所以只解析了少量的部分#xff0c;其它部分可以参考相关文档进行理解。
DBR存在于磁盘分区的第一个扇区…1. 背景
本文主要介绍DBR的读取和解析并提供了基于元神操作系统的实现代码。由于解析DBR的目的是定位到NTFS磁盘分区的元文件$Root进行文件操作所以只解析了少量的部分其它部分可以参考相关文档进行理解。
DBR存在于磁盘分区的第一个扇区中每个分区都有自己的DBR。要寻找DBR只需定位到目标分区的开始位置即可这通过前文中MBR的分区表实现直接使用分区表项的第9-12字节即可。
2. 方法
1定位DBR
在MBR的起始地址上加0x1BE即446得到分区表的起始地址。假设要定位的磁盘分区是N号分区N从0开始计数0表示第一个分区1表示第二个分区依此类推则在分区表起始地址上加16*N即可得到目标分区表项的起始地址因为每个表项16字节。最后在目标表项的0x08偏移开始的4个字节就是分区的起始扇区号也就是定位DBR所需要的内容。
总结一下定位DBR的公式形如MBR_addr0x1BE16*N0x08
2调用元神操作系统的API读取DBR
定位到DBR后使用API_READ_DISK_SECTOR调用元神操作系统的API来读取DBR该操作实现在read_disk_dbr函数中然后在主函数中的读取MBR之后添加对read_disk_dbr函数的调用代码如下所示
use32START:pushacall read_disk_mbrmov eax, 0call read_disk_dbr ;read dbr in partition eaxpopairetsector_dbr: times 512 db 0
partition_base dd 0
;input:
; eax: index of partition to operate, 0 first partition, 1 second partition
read_disk_dbr:pushamov edi, API_PARAMmov dword [fs:edi], API_READ_DISK_SECTORmov dword [fs:edi4], 2 ;2 parametersmov ebx, sector_buffadd ebx, 0x1BE ;ebx point to partition tableshl eax, 4 ;eax * 16add ebx, eax ;ebx point to dest partition itemadd ebx, 8 ;ebx point to start sector no. of dest partitionmov edx, [ds:ebx]mov dword [fs:edi8], edx ;parameter_1: sector no.mov [ds:partition_base], edxxor eax, eaxmov ax, dsadd eax, SEG_BASEmov bh,byte [fs:eax7]mov bl,byte [fs:eax4]shl ebx,16mov bx,word [fs:eax2]add ebx, sector_dbrmov dword [fs:edi12], ebx ;parameter_2: start address of buffercall pword [fs:OS_API]mov eax, 512movzx ebx, word [fs:cursor_y]movzx ecx, word [fs:cursor_x]mov esi, [fs:edi12]call print_bytes_hexadd word [fs:cursor_y], 20.end:poparet
上述代码将磁盘第一个分区的DBR内容读取到sector_dbr缓冲区中并以十六进制形式进行显示结果如下图所示 该图中显示的内容就是磁盘第一个分区的DBR内容。
注意此处打印DBR内容的操作仅为讲解需要后续操作追加之前应当注释掉read_disk_dbr函数中对于print_bytes_hex调用相关的部分即注释掉call pword [fs:OS_API]之后的部分。
另外函数read_disk_dbr需要提供一个输入参数“分区索引号”根据该参数来定位到目标磁盘分区。本例代码中假设要操作的磁盘分区是第一个分区即0号分区该分区索引号在后续操作中可由上层应用提供例如读取文件“d2:\test.txt”操作在文件名中用d2来指明要操作的文件位于磁盘的第二个分区中。
3解析DBR
DBR的内容共有512字节前3个字节为跳转指令跳转到引导代码处之后的8个字节为文件系统的OEM标志字符串如“NTFS ”再之后的若干字节记录了文件系统的重要信息接下来的部分为引导代码最后2个字节为标记字节固定为55 AA。
本文主要解析文件系统的重要信息部分即偏移0x0B开始的若干字节。0x0B-0x0C表示每扇区的字节数0x0D表示每簇的扇区数0x15为介质描述符0x18-0x19表示每磁道扇区数0x1A-0x1B表示磁头数0x1C-0x1F表示隐藏扇区数0x28-0x2F表示该分区的总扇区数0x30-0x37表示$MFT元文件的起始簇号0x38-0x3F表示$MFT镜像文件的起始簇号0x40为每个MFT记录所占的簇数0x44为每索引所占的簇数0x48-0x4F为分区的逻辑序列号0x50-0x53为校验和。
结合上面的截图0x0B-0x0C偏移处的值为00 02即0x0200表示每扇区大小为512字节0x0D偏移处的值为08表示每簇包含8个扇区0x15偏移处的值为F8表示硬盘0x18-0x19偏移处的值为3F 00即0x003F表示每磁道含有63个扇区0x1A-0x1B偏移处的值为F0 00即0x00F00x1C-0x1F偏移处的值为3F 00 00 00即0x0000003F0x28-0x2F偏移处的值为C0 CE D4 01 00 00 00 00即0x0000000001D4CEC00x30-0x37偏移处的值为00 00 0C 00 00 00 00 00即0x00000000000C0000表示$MFT元文件的起始簇号为0x0C00000x38-0x3F偏移处的值为10 00 00 00 00 00 00 00即0x00000000000000100x40偏移处的值为F60x44偏移处的值为010x48-0x4F偏移处的值为89 91 30 D4 A9 30 D4 92。
其中0x0D处的每簇扇区数、0x30-0x37处的$MFT元文件的起始簇号是后续操作中需要用到的信息用于定位$Root元文件。
3. 总结
本文介绍了NTFS文件操作的第二步即解析DBR。通过解析DBR可以获知分区的信息并定位到元文件$MFT以供后续读取$Root元文件使用。
安装元神操作系统的工具“元神操作系统安装器”可去网站www.gnxxkj.com进行下载。安装账号可去网址http://www.gnxxkj.com/app/wuziqi/register.php 进行注册。