1. 背景
本文主要介绍MBR的读取和解析,并提供了基于元神操作系统的实现代码。由于解析MBR的目的是定位到NTFS磁盘分区进行文件操作,所以只解析了MBR的分区表部分,至于MBR的其它部分,可以参考相关文档进行理解。
2. 方法
(1)调用元神操作系统的API读取MBR
使用API_READ_DISK_SECTOR来调用元神操作系统的API,代码如下所示:
use32START:pushacall read_disk_mbrpopairetinclude 'api_def.inc'OS_API equ 0x00030C16
API_PARAM equ 0x03000000
SEG_BASE equ 0x00040000
cursor_x equ 0x02004B10
cursor_y equ 0x02004B12sector_buff: times 512 db 0
read_disk_mbr:pushamov edi, API_PARAMmov dword [fs:edi], API_READ_DISK_SECTORmov dword [fs:edi+4], 2 ;2 parametersmov dword [fs:edi+8], 0 ;parameter_1: sector no.xor eax, eaxmov ax, dsadd eax, SEG_BASEmov bh,byte [fs:eax+7]mov bl,byte [fs:eax+4]shl ebx,16mov bx,word [fs:eax+2]add ebx, sector_buffmov dword [fs:edi+12], 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:edi+12]call print_bytes_hexadd word [fs:cursor_y], 20poparet;print hex bytes
;input:
; eax: byte count to print
; ebx: y coordinate to print (from 0)
; ecx: x coordinate to print (from 0)
; esi: buffer storing data to print
print_bytes_hex:pushaimul edi,ebx,80*2 ;calculate coordinateadd edi,ecxadd edi,ecxmov ecx,eaxmov ah,0x0F.next_char:mov bl,byte [fs:esi].hex_char:mov al,bland al,0x0Fadd al,0x30cmp al,0x39jbe .num_charadd al,'A'-0x30-10.num_char:mov [gs:edi+2],axshr ebx,4mov al,bland al,0x0Fadd al,0x30cmp al,0x39jbe .num_char2add al,'A'-0x30-10.num_char2:mov [gs:edi],axmov al,' 'mov [gs:edi+4],axadd edi,6inc esiloop .next_charpoparet
上述代码将磁盘的第一个扇区(0号扇区)的内容读取到sector_buff缓冲区中,并以十六进制形式进行显示,结果如下图所示:
该图中显示的内容就是磁盘第一个扇区的内容,即MBR的内容。
注意:此处打印MBR内容的操作仅为讲解需要,后续操作追加之前应当注释掉read_disk_mbr函数中对于print_bytes_hex调用相关的部分,即注释掉call pword [fs:OS_API]之后的部分。另外,该例所示代码的详细解释可参考前面的博文。
(2)解析MBR
MBR的内容共有512字节,前446个字节为引导代码,之后的64字节为磁盘分区表,最后2个字节为标记字节(固定为55 AA)。
本文主要解析中间64字节的分区表。该表包含4个项,每个项为16字节,所以通过该分区表可以表示4个磁盘分区,即一个磁盘最多可以分4个区。更多的分区需要扩展分区的支持,不在本文介绍的范围之内,需要的可以参考相关文档自行实现。
每个分区表项占16个字节。第一个字节为启动标志,值为80H时表示该分区包含操作系统,即操作系统安装在该分区中,值为00H时表示该分区不包含操作系统;第2-4字节表示该分区开始的磁头号、扇区号、柱面号;第5字节表示该分区的文件系统类型,值为0BH时表示FAT32文件系统,值为07H时表示NTFS文件系统;第6-8字节表示该分区结束的磁头号、扇区号、柱面号;第9-12字节表示该分区首扇区的相对扇区号;第13-16字节表示该分区的总扇区数。
在分区表项中,提供了两种方式对分区进行定位:第一种是使用磁头号、扇区号、柱面号进行定位;第二种是使用分区首扇区的相对扇区号进行定位。对于大容量的磁盘,目前主要使用的是第二种方式。
结合上面的截图,4个分区表项中只有前两个有内容,后两个表项全是0,所以测试磁盘中有两个分区(常见的为C盘和D盘)。第一个表项的内容为“80 01 01 00 07 EF FF FF 3F 00 00 00 C1 CE D4 01”,第一个字节为80H,表示操作系统安装在该分区中;第5字节为07H,表示该分区的文件系统类型为NTFS;第9-12字节为3F 00 00 00,表示该分区首扇区的相对扇区号为0x0000003F,即该分区的第一个扇区为0x3F号扇区(即63号扇区);第13-16字节为C1 CE D4 01,表示该分区的总扇区数为0x01D4CEC1,即该分区包含30,723,777个扇区,合计为15,730,573,824个字节,约为15GB。
类似的,第二个表项的内容为“00 00 C1 FF 07 EF FF FF 00 CF D4 01 F0 48 D3 02”,第一个字节为00H,表示该分区不包含操作系统;第5字节为07H,表示该分区的文件系统类型为NTFS;第9-12字节为00 CF D4 01,表示该分区的首扇区的相对扇区号为0x01D4CF00,即该分区的第一个扇区为0x01D4CF00扇区;第13-16字节为F0 48 D3 02,表示该分区的总扇区数为0x02D348F0,即该分区包含47,401,200个扇区,合计为24,269,414,400个字节,约为24GB。
3. 总结
本文介绍了NTFS文件操作的第一步,即解析MBR。通过解析MBR可以获知磁盘的分区信息,并定位到目标分区,以供后续读取DBR使用。
安装元神操作系统的工具“元神操作系统安装器”可去网站www.gnxxkj.com进行下载。安装账号可去网址http://www.gnxxkj.com/app/wuziqi/register.php 进行注册。