mbr (主引导记录(Master Boot Record))
MBR,即主引导记录,是对IBM兼容机的硬盘或者可移动磁盘分区时,在驱动器最前端的一段引导扇区。MBR概念是在1983年PC DOS 2.0支持硬盘后才有的。[1]
MBR描述了逻辑分区的信息,包含文件系统以及组织方式。此外,MBR还包含计算机在启动的第二阶段加载操作系统的可执行代码或连接每个分区的引导记录(VBR)。这个MBR代码通常被称为
引导程序。
由于MBR分区表的最大可寻址的存储空间只有2Tb(232×512字节)。因此,在大硬盘出现的现在,MBR分区方式逐渐被GUID分区表取代。
MBR不可能存在于不可分区的媒介如软盘等中。
中文名 主引导记录
外文名 Master Boot Record
简 称 MBR
成立时间 1983年
性 质硬盘的主引导记录
分区解析
MBR,全称为Master Boot Record,即硬盘的主引导记录。
为了便于理解,一般将MBR分为广义和狭义两种:广义的MBR包含整个扇区(引导程序、分区表及分隔标识),也就是上面所说的主引导记录;而狭义的MBR仅指引导程序而言。
硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、硬盘分区表DPT(Disk Partition table)和分区有效标志。在总共512字节的主引导
扇区里主引导程序(boot loader)占446个字节,第二部分是Partition table区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。第三部分是magic
number,占2个字节,固定为0xAA55或0x55AA,这取决于处理器类型[2] ,如果是小端模式处理器[3] (如Intel系列),则该值为0xAA55;如果是大端模式处理器[3] (如Motorola6800)
,则该值为0x55AA。
标准 MBR 结构
地址
描述
长度
Hex
Oct
Dec
(字节)
0
0
0
代码区
440
(最大 446)
01B8
670
440
选用软盘标志
4
01BC
674
444
一般为空值; 0x0000
2
01BE
676
446
标准 MBR 分区表规划
64
(四个16 byte的主分区表入口)
01FE
776
510
55h
MBR 有效标志
2
01FF
777
511
AAh
MBR, 总大小: 446 + 64 + 2 =
512[4]
注意
MBR是不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它,但可以通过命令来修改和重写,如在minix3里面,可以用命令:installboot -m /dev/c0d0
/usr/mdec/masterboot来把masterboot这个小程序写到mbr里面,masterboot通常用汇编语言来编写。我们也可以用ROM-BIOS中提供的INT13H的2号功能来读出该扇区的内容,也可用软件工具
Norton8.0中的DISKEDIT.EXE来读取。
调用参数
用INT13H的读磁盘扇区功能的调用参数如下:
入口参数:AH=2 (指定功能号)
AL=要读取的扇区数
DL=磁盘号(0、1-软盘;80、81-硬盘)
DH=磁头号
CL高2位+CH=柱面号
CL低6位=扇区号
CS:BX=存放读取数据的内存缓冲地址
出口参数:CS:BX=读取数据存放地址
错误信息:如果出错CF=1 AH=错误代码
用DEBUG读取位于硬盘0柱面、0磁头、1扇区的操作如下:
A>DEBUG
-A 100
XXXX:XXXX MOV AX,0201 (用功能号2读1个扇区)
XXXX:XXXX MOV BX,1000 (把读出的数据放入缓冲区的地址为CS:1000)
XXXX:XXXX MOV CX,0001 (读0柱面,1扇区)
XXXX:XXXX MOV DX,0080 (指定第一物理盘的0磁头)
XXXX:XXXX INT 13
XXXX:XXXX INT 3
XXXX:XXXX (按回车键)
-G=100 (执行以上程序段)
-D 1000 11FF (显示512字节的MBR内容)
在windows操作系统下,例如xp,2003,Vista,windows7,有微软提供的接口直接读写mbr;
FILE * fd=fopen("\\\\.\\PHYSICALDRIVE0","rb+");
char buffer[512];
fread(buffer,512,1,fd);
//then you can edit buffer[512] as your wish......
fseek(fd,0,SEEK_SET); //很重要
fwrite(buffer,512,1,fd); //把修改后的MBR写入到你的机器
fclose(fd); //大功告成
MBR组成
一个扇区的硬盘主引导记录MBR由4个部分组成。
硬盘MBR扇区
硬盘MBR扇区
·主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序。
·出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节。
·分区表(DPT,Disk Partition Table)含4个分区项,偏移地址01BEH--01FDH,每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4。
·结束标志字,偏移地址01FE--01FF的2个字节值为结束标志0xAA55或0x55AA,称为“魔数”(magic number)。如果该标志错误系统就不能启动。
MBR的结构如下表所示
字节偏移(16进制)
字节数
描述
00~1BD
446
引导代码
1BE~1CD
16
分区表项1
1CE~1DD
16
分区表项2
1DE~1ED
16
分区表项3
1EE~1FD
16
分区表项4
1FE~1FF
2
签名值0xAA55或0x55AA
具体含义如下:
(1)0x00~0x1BD:446个字节,包含一段指令,用以通知计算机如何访问分区表并定位操作系统的位置
这部分的代码会因为操作系统不同而不同,利用引导代码可以实现多重系统引导。多系统引导有两种方法可以实现:一种方法是用Windows操作系统在引导分区中设置一段代码,先加载进入用
户选择系统的界面,允许用户选择要进入的系统,再进入指定的系统;第二种方法是改变MBR中的引导代码,该代码直接呈现给用户一个选择系统的界面。
(2)0x1BE~0x1FD:64个字节,4个分区表项,每个表项占用16个字节,描述一个分区,最多可以描述4个分区(这就是为什么MBR分区体系只能分成4个区【我们平时看到的分区一般可以从26
个字母中选取任意多个当做分区标识(多于4个),这是因为那些分区是逻辑分区,这里的4个分区指的是主分区和扩展分区的数目,而逻辑分区是在扩展分区中划分出来的,也叫做二级、三
级扩展分区。】)。
分区表项并没有顺序要求,即不要求第一个分区表项在第二个分区表项前。
分区表也不要求从第一个分区表项开始
(3)0x1FE~0x1FF:2个字节,有效结束标志0xAA55或0x55AA。如果没有这个标志,操作系统会认为磁盘没有初始化,无法正确加载磁盘的分区。
分区表参数含义(字节)
0 活动(80)或非活动分区(00)
1 2 3 起始的磁头 01 柱面 01 扇区00值
4 分区类型符 NTFS(07)FAT32(0B)扩展(0F)
5 6 7 结束的磁头 FE 柱面 FF 扇区FF值
8 9 A B 本分区之前已用扇区数
C D E F 本分区大小
虚拟MBR
即 EBR (extent boot record)扩展引导记录
其记录表项 与MBR相同 ,用于管理扩展分区上的逻辑驱动器。
MBR修复编辑
MBR在某些情况下,如病毒或者分区操作不当会引起MBR代码段的损坏,表现的现象就是电脑启动时,屏幕出现黑底一个或几个无意义的字母闪光标或无任何提示闪光标。这种情况在确认硬盘
无物理故障后,可以使用一些简单方法进行恢复。
Dos命令
使用任意启动盘启动到MSDOS提示符,键入命令:
fdisk /mbr
Diskgenius
用启动盘,无论dos版或者pe版均可,启动diskgenius,然后选择菜单“硬盘”-“重建主引导记录”,为避免病毒残留,还可执行一次”硬盘“-”清除保留扇区“
Windows xp命令
xp之下,需要安装tool kit附加工具,为系统增加一个fixmbr命令行工具。执行命令之前,先将故障硬盘挂载到一台好的电脑,或者使用xp安装盘启动电脑,然后执行命令:
fixmbr \Device\HardDisk0 此处的0或其他数字需先通过diskpart工具的list driver进行查找。
Windows 7命令
修复方式同xp,只是命令换成bootrec /fixmbr
========
如何查看电脑硬盘是gpt分区还是MBR分区
我们知道一般win7或者以下的系统一般是安装在MBR分区中,win8一般是安装在gpt分区中,可是我怎么判断呢?
方法/步骤
1
右击桌面上的'计算机“点击”管理“
2
在”管理“中找得”磁盘管理“
3
进入磁盘管理可以看到我们硬盘的一般情况,那么该如何查看我的硬盘的分区模式。
4
右击”磁盘0“选择”属性“
5
在”属性“中切换到”卷“标签,这时我们就可以看到”磁盘分区形式“可以看到为gpt
6
其实我们在右击”磁盘0“选项中可以看到”转换成MBR磁盘“这样也可以判断它为gpt分区
7
是不是很简单,只要这几步就可以判断了。
注意事项
在”磁盘0“属性中可以看到硬盘分区模式。
win8一般是gpt分区,win7一般是MBR分区
========
读取硬盘的MBR引导扇区(Windows各系统通用)
硬盘的引导扇区位于 0 磁道 0 磁头 1 扇区位置,该扇区存放着系统的引导程序和硬盘的分区表等重要信息。另外小甲鱼八卦一下,该扇区常常是病毒的重点攻击目标!
实现要求:读取硬盘引导扇区并保存为boot.ini文件
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
实现原理:
上节课小甲鱼不是说会告诉大家如何在用户模式下直接访问硬盘么?嗯,而且承诺绝对简单通俗。好吧,事实上,硬盘内核驱动程序将硬盘作为一个文件,文件名为:"\\.\\physicaldrive0"
我们可以利用这个鲜为人知的文件名,通过 CreateFile, ReadFile, WriteFile 和 DeviceIoControl API 来进行访问硬盘。
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 功能:读取硬盘引导扇区并保存于boot.ini文件中
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
include windows.inc
include comdlg32.inc
include user32.inc
include kernel32.inc
includelib comdlg32.lib
includelib user32.lib
includelib kernel32.lib
.data
szFileName db '\\.\\physicaldrive0', 0 ; 硬盘设备名
.data?
szBuffer db 512 dup (?)
@hFile dd ?
@dwBytesRead dd ?
@szLogFile db MAX_PATH dup (?)
.const
szNewFile db 'boot.ini', 0
szErrOpenFile db '无法打开硬盘文件!', 0
szErrCreateFile db '无法创建boot.ini文件!', 0
szSuccess db '成功读取硬盘引导区并写入boot.ini文件!', 0
szCaption db '鱼C工作室', 0
.code
start:
invoke CreateFile, ; 打开或创建文件
addr szFileName, ; 文件的名字
GENERIC_READ, ; 允许读访问
FILE_SHARE_READ, ; 允许对文件进行共享访问
0, ; 指向一个SECURITY_ATTRIBUTES结构的指针
OPEN_EXISTING, ; 文件必须存在
FILE_ATTRIBUTE_NORMAL, ; 默认属性
0
.if eax == INVALID_HANDLE_VALUE ; 打开文件错误
invoke MessageBox,
NULL,
addr szErrOpenFile,
addr szCaption,
MB_OK
jmp exit
.endif
mov @hFile, eax ; 返回文件句柄,这时候硬盘被看成是一个文件的哦~
invoke ReadFile, ; 从文件中读取数据
@hFile, ; 文件句柄
addr szBuffer, ; 用于保存读入数据的缓冲区
sizeof szBuffer, ; 需要读入的字符数
addr @dwBytesRead, ; 实际读入的字节数
0
invoke CloseHandle, @hFile ; 小甲鱼温馨提醒:记得文件打开后要擦屁股->关闭文件,否则造成内存泄漏
invoke lstrcpy, ; 拷贝字符串
addr @szLogFile,
addr szNewFile
invoke CreateFile, ; 创建boot.ini文件
addr @szLogFile,
GENERIC_WRITE,
FILE_SHARE_READ,
0,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
0
.if eax != INVALID_HANDLE_VALUE
mov @hFile, eax
invoke WriteFile, ; 将数据写入boot.ini文件
@hFile,
addr szBuffer,
sizeof szBuffer,
addr @dwBytesRead,
0
invoke CloseHandle, @hFile ; 擦屁股
invoke wsprintf, ; 这个事实上常用的函数,如果有问题的鱼油可以在论坛搜索下,有篇文章中小甲鱼已经做好了详细的解释给大家。
addr szBuffer,
addr szSuccess
invoke MessageBox,
NULL,
addr szBuffer,
addr szCaption,
MB_OK
.else
invoke MessageBox,
NULL,
addr szErrCreateFile,
addr szCaption,
MB_OK
.endif
exit:
invoke ExitProcess, NULL
end start
========
用winhex判别MBR、EBR、DBR
1、什么是逻辑驱动?
2、什么是物理驱动器?
3、怎么搜索MBR、 EBR、DBR?
MBR、 EBR、DBR他们都是以55AA结尾
在winhex中搜索16进制:55AA 偏移512=510
(1)搜索DBR的标志:
FAT16的DBR:EB 3C 90 没有备份的DBR
FAT32的DBR:EB 58 90 (备份的DBR)在该分区的第6扇区
NTFS的DBR: EB 52 90 (备份的DBR)在该分区的最后一个扇区
判别MBR的方法:
MBR就在LBA第一个扇区,打开物理硬盘,第一个扇区就是了。MBR的分区表在1BE偏移往后到1FD,共64个字节,每项16个字节。1FE-1FF就是“55 AA”
判别EBR的方法:
EBR的结构和MBR的结构是一样的,在倒数第五行倒数第二个字节应该是00 01,并且前446个字节应该是0
(2)查找DBR 可以通过搜索本分区的EBR去找DBR.
可以搜索EBR,定位DBR.
DBR相对于EBR后63号扇区。
(3)当某分区的DBR坏了,就提示:未格式化
这个时候用winhex打开逻辑盘,就打不开。
我们只有通过打开物理驱动器,然后跳转到该分区。
就可以查看DBR是否被破坏了。。。。
可物理驱动器的模式是从"0"扇区开始描述系统
而逻辑驱动模式是从系统的DBR开始描述系统(从第64扇区开始描述).
========