MBR引导代码分析
- 格式:pdf
- 大小:175.61 KB
- 文档页数:8
硬盘主引导记录(MBR)及其结构详解硬盘的0柱面、0磁头、1扇区称为主引导扇区,FDISK程序写到该扇区的内容称为主引导记录(MBR)。
该记录占用512个字节,它用语硬盘启动时将系统控制权交给用户指定的,并在分区表中登记了的某个操作系统区。
1.MBR的读取硬盘的引导记录(MBR)是不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它。
但我们可以用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 100XXXX: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 13XXXX:XXXX INT 3XXXX:XXXX (按回车键)-G=100 (执行以上程序段)-D 1000 11FF (显示512字节的MBR 内容)2.MBR 的组成一个扇区的硬盘主引导记录MBR 由如图6-15所示的4个部分组成。
·主引导程序(偏移地址0000H--0088H ),它负责从活动分区中装载,并运行系统引导程序。
·出错信息数据区,偏移地址0089H--00E1H 为出错信息,00E2H--01BDH 全为0字节。
硬盘主引导记录(MBR)及其结构详解hbrqlpf 于 2008-10-01 21:14:00 发布14569 收藏 5 文章标签:扩展磁盘代码分析任务活动basic硬盘的0柱面、0磁头、1扇区称为主引导扇区,FDISK程序写到该扇区的内容称为主引导记录(MBR)。
该记录占用512个字节,它用于硬盘启动时将系统控制权交给用户指定的,并在分区表中登记了的某个操作系统区。
1.MBR的读取硬盘的引导记录(MBR)是不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它。
但我们可以用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 100XXXX: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 13XXXX:XXXX INT 3XXXX:XXXX (按回车键)-G=100 (执行以上程序段)-D 1000 11FF (显示512字节的MBR内容)2.MBR的组成一个扇区的硬盘主引导记录MBR由4个部分组成。
主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序。
硬盘主引导记录(MBR)及其结构详解硬盘的0柱面、0磁头、1扇区称为主引导扇区,FDISK程序写到该扇区的内容称为主引导记录(MBR)。
该记录占用512个字节,它用语硬盘启动时将系统控制权交给用户指定的,并在分区表中登记了的某个操作系统区。
1.MBR的读取硬盘的引导记录(MBR)是不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它。
但我们可以用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 100XXXX: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 13XXXX:XXXX INT 3XXXX:XXXX (按回车键)-G=100 (执行以上程序段)-D 1000 11FF (显示512字节的MBR内容)2.MBR的组成一个扇区的硬盘主引导记录MBR由如图6-15所示的4个部分组成。
·主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序。
·出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节。
硬盘主引导扇区(MBR、DPT、DBR、BPB)详解.txt“恋”是个很强悍的字。
它的上半部取自“变态”的“变”,下半部取自“变态”的“态”。
硬盘主引导扇区(MBR、DPT、DBR、BPB)详解引用:网上收集的资料,放到这里来学习,这方面登山人大哥是高手,有空指点一下喽硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR),该记录占用512个字节,它用于硬盘启动时将系统控制权转给用户指定的、在分区表中登记了某个操作系统分区。
MBR的内容是在硬盘分区时由分区软件(如FDISK)写入该扇区的,MBR不属于任何一个操作系统,不随操作系统的不同而不同,即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。
但安装某些多重引导功能的软件或LINUX的LILO时有可能改写它;它先于所有的操作系统被调入内存并发挥作用,然后才将控制权交给活动主分区内的操作系统(图一)。
MBR由三部分构成:1.主引导程序代码,占446字节2.硬盘分区表DPT,占64字节3.主引导扇区结束标志AA55H一、硬盘的主引导程序代码是从偏移0000H开始到偏移01BDH结束的446字节;主引导程序代码包括一小段执行代码。
启动PC 机时,系统首先对硬件设备进行测试,成功后进入自举程序INT 19H;然后读系统磁盘0柱面、0磁头、1扇区的主引导扇区MBR的内容到内存指定单元0:7C00 首地址开始的区域,并执行MBR程序段。
主引导代码实现下列功能:1.扫描分区表查找活动分区;2.寻找活动分区的起始扇区;3.将活动分区的引导扇区读到内存;4.执行引导扇区的运行代码。
如果主引导代码未完成这些功能,系统显示下列错误信息:Invalid partition tableError loading operating systemMissing operating system二、硬盘分区表DPT是从偏移01BEH开始到偏移01FDH结束的64字节(图二);硬盘分区表分为四小部分,每一小部分表示一个分区的信息,占16字节。
MBR代码分析;MBR.ASM; MASM MBR; LINK MBR; EXE2BIN MBR.MODEL tiny.CODE;设置寄存器及堆栈值org 0Head:Start:clixor ax,axmov ss,axmov sp,7C00H ;ss:sp=0:7C00Hmov si,sppush axpop espush axpop ds ;es=ds=0sti;将程序代码由0:7C00H移动到0:0600H处cldmov di,600Hmov cx,100H ;100H Words=512 Bytes,即一个扇区大小repne movswdb 0EA H ;这个是FAR JUMP的机器码dw offset Continue+600H, 0000H ;这个是跳转目的地址,即0:061DH ;搜索可引导分区Continue:mov si,600H+1BEH ;si指向分区表mov bl,4 ;四个分区FindBoot:FindBoot:cmp byte ptr[si],80Hje SaveRec ;读扇区位置cmp byte ptr[si],0jne Invaild ;无效分区add si,10Hdec bljnz FindBootint 18H ;进入ROM BASIC;读取引导分区的扇区,柱面号SaveRec:mov dx,[si]mov cx,[si+2]mov bp,si;检查其余分区表FindNext:add si,10Hdec bljz SetReadcmp byte ptr[si],0 ;是否存在非法分区je FindNextInvaild:mov si,offset ErrMsg1+600H;字符串输出子程序PrintStr:lodsbcmp al,0je DeadLockpush simov bx,7mov ah,0EH ;输出字符int 10Hpop sijmp short PrintStr ;下一字符DeadLock:jmp short DeadLock ;无穷循环,也可以写成jmp $ ;读引导扇区SetRead:mov di,5 ;读取次数ReadBoot:mov bx,7C00Hmov ax,201Hpush diint 13H ;cx,dx已经在SaveRec处得到pop dijnc GoBoot ;成功则启动xor ax,axint 13H ;reset驱动器,然后再读取dec dijnz ReadBootmov si,offset ErrMsg2+600Hjmp short PrintStr 失败输出信息,并进入无穷循环;检查读入的引导扇区GoBoot:mov si,offsetErrMsg3+600Hmov di,7C00H+1FEHcmp word ptr[di],0AA55Hjne PrintStr ;非AA55标志则输出错误信息mov si,bp ;si指向可启动分区db 0EA H,0,7CH,0,0 ;跳转至0:7C00HErrMsg1 db 'Invaild partition table',0ErrMsg2 db 'Error loading operating system',0 ErrMsg3 db 'Missing operating system',0Tail:FillNum equ 1BEH-(Tail-Head) ;计算填0数目db FillNum dup(0);四个分区表项数据,跟分区情况有关,详细含义另解PartTable db 80H,1,1,0,4,4,0D1H,2,11H,0,0,0,0FEH,0FFH,0,0db 0,0,0C1H,3,5,4,0D1H,0FEH,0FFH,0FFH,0,0,0ACH,53H,0,0db 20H dup(0)ID dw 0AA55Hend start;如果开始试用org 600H,那么访问数据时就不必加上600H,如mov si,offset ErrMsg2+600H;可写为mov si,offset ErrMsg2,这时就不能用exe2bin得到数据,必须试用debug ;debug mbr.exe;-nmbr.bin;-rcx 200;-wcs:600;-q。
硬盘分区表知识——详解硬盘MBR硬盘是现在计算机上最常用的存储器之一。
我们都知道,计算机之所以神奇,是因为它具有高速分析处理数据的能力。
而这些数据都以文件的形式存储在硬盘里。
不过,计算机可不像人那么聪明。
在读取相应的文件时,你必须要给出相应的规则。
这就是分区概念。
分区从实质上说就是对硬盘的一种格式化。
当我们创建分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录(即Master Boot Record,一般简称为MBR)和引导记录备份的存放位置。
而对于文件系统以及其他操作系统管理硬盘所需要的信息则是通过以后的高级格式化,即Format命令来实现。
面、磁道和扇区硬盘分区后,将会被划分为面(Side)、磁道(Track)和扇区(Sector)。
需要注意的是,这些只是个虚拟的概念,并不是真正在硬盘上划轨道。
先从面说起,硬盘一般是由一片或几片圆形薄膜叠加而成。
我们所说,每个圆形薄膜都有两个“面”,这两个面都是用来存储数据的。
按照面的多少,依次称为0 面、1面、2面……由于每个面都专有一个读写磁头,也常用0头(head)、1头……称之。
按照硬盘容量和规格的不同,硬盘面数(或头数)也不一定相同,少的只有2面,多的可达数十面。
各面上磁道号相同的磁道合起来,称为一个柱面(Cylinder)。
上面我们提到了磁道的概念。
那么究竟何为磁道呢?由于磁盘是旋转的,则连续写入的数据是排列在一个圆周上的。
我们称这样的圆周为一个磁道。
如果读写磁头沿着圆形薄膜的半径方向移动一段距离,以后写入的数据又排列在另外一个磁道上。
根据硬盘规格的不同,磁道数可以从几百到数千不等;一个磁道上可以容纳数KB 的数据,而主机读写时往往并不需要一次读写那么多,于是,磁道又被划分成若干段,每段称为一个扇区。
一个扇区一般存放512字节的数据。
扇区也需要编号,同一磁道中的扇区,分别称为1扇区,2扇区……计算机对硬盘的读写,处于效率的考虑,是以扇区为基本单位的。
mbr的组成成分
MBR(MasterBootRecord)是计算机硬盘的第一个扇区,是启动计算机时的重要组成部分。
MBR由三个部分组成:引导代码、分区表和MBR签名。
1.引导代码:MBR的第一扇区被称为MBR引导扇区,该扇区的前446个字节被称为引导代码。
引导代码是一段机器语言程序,用于启动操作系统,并将控制权传递给操作系统的引导程序。
2.分区表:MBR的引导扇区中的下一个部分是分区表。
分区表是一个表格,用于描述硬盘上的分区情况。
MBR最多可以支持4个主分区或3个主分区和1个扩展分区。
每个分区的信息包括分区的起始位置、分区大小、分区类型等。
3.MBR签名:MBR的引导扇区的最后两个字节是MBR签名。
它是一个标志位,用于标识MBR的有效性。
MBR签名的值为0x55AA,表示该MBR是有效的。
总之,MBR是计算机启动过程的重要组成部分,由引导代码、分区表和MBR签名三个部分组成,它们共同协作,保证计算机的正常启动。
- 1 -。
windows 7 的 MBR 分析前话: 引导磁盘的 MBR 由 int 0x19 加载到 0x7c00,int 0x19 最后的工作是 跳到 0x7c00 执行。
一、 我的 bochs 上的 windows 7 的 disk images 介绍在 bochs 上, 我为 windows 7 分配了 10g 的磁盘空间, 这 10g 的分空间, bochs 是这样分配的:cylinders = 20805, heads = 16, spt = 63 cylinders(柱面或道)是 20805,heads(磁头或面)是 16,spt(扇区/柱 面 - 每道扇区数)为 63 那么:磁盘空间为:disk size = cylinders * 63 * heads * 512 = 20805 * 63 * 16 * 512 = 10,737,377,280 bytes = 10g二、硬盘的 MBR(主引导记录)MBR 是位于: 扇区 0 (逻辑扇区) 即: 柱面 0 (0-cylinder) 0 磁头 , (0-head) , 1 扇区(1-sector) 大小为 512 bytes。
整个 MBR 的结构如下:位置(hex) 大小(bytes) 描述000 - 162 162 - 1BD 1BE - 1CD 1CE - 1DD 1DE - 1ED 1EE - 1FD 1FE - 1FF354 bytes 92 bytes 16 bytes 16 bytes 16 bytes 16 bytes 2 bytes硬盘 MBR 引导记录(代码区) MBR 数据区域 分区表 1 分区表 2 分区表 3 分区表 4 MBR 标志(55AA)1、磁盘分区表(Disk Partition Table) 在 MBR 里的后 64 个字节里是磁盘的分区表结构,可定义 4 个分区,每个分 区 16 bytes,从 0x1be ~ 0x1fe 共 64 bytes。
MBR引导代码详解MBR主引导扇区前139个字节引导代码详解1(前27字节,作用:复制)默认分类 2009-12-01 14:50:48 阅读127 评论0 字号:大中小订阅MBR在系统启动时自动加载到0000:7c00处,为512个字节.下面这段代码实现把0000:7c1b处MBR代码复制485个字节到0000:061b处,为什么不从0000:7c00开始复制512个到0000:0600处,因为前面1b 个字节为复制代码,所以忽略.空出的0000:7c00开始的空间将读入活动分区的操作系统的引导家扇区.0000 xor ax,ax '置ax为00002 mov ss,ax '把堆栈代寄存器置为00000004 mov sp,7c00 '把堆栈指令置为7c00,把以堆栈指向0000:7c00,0007 sti '中断使能0008 push ax '这条PUSH指令在0008处,前面的8个字节指令已经执行,所以push指令输入的数据覆盖前面的0000-0001空间,没有关系.这条PUSH ax指令与下面一条指令一起是把es置为0,es用于movsb指令,'REP MOVSB (同repz movsb)的作用是重复CX次将[DS:SI]中字节传送到[ES:DI]中。
SI、DI加或减1由DF确定,DF=0,加。
REP使CX减1,到0后结束传送。
所以REP MOVSB 指令与CX、SI、DI、ES、DS寄存器和Flag的DF位设置有关。
0009 pop es000a push ax '作用同上000b pop ds000c cld '使方向标志寄存器DF=0000D mov si, 7c1b '用于movsb0010 mov di, 061b '用于movsb ,将[DS:SI]中字节传送到[ES:DI]中0013 push ax '保存ax,di,用于第001a处指令retf(同ret),使ax->cs,di->ip,实现指令跳转0014 push di0015 mov cx,01e5 '用于repz movsb中的repz,每次cx减1,到0不执行movsb,为485,除去复制代码27个字节,即复制001B开始的代码0018 repz0019 movsb '复制字节001a retfMBR主引导扇区前139个字节引导代码详解2默认分类 2009-12-01 19:15:58 阅读55 评论0 字号:大中小订阅(第28到第76字节,共49个字节,作用:判断是否是活动分区,是否是非活动分区),一个扇区是512个字节,所以MBR主引导扇区也是512个字节,最后两个字节是55 AA,是表示结束的字节.而次后64个字节是硬盘分区表字节,每16个字节代表一个分区表项,所以最多有4项分区表项(如最多分为C,D,E,F盘),如果分区个数多于4个,则用虚拟MBR技术,即在MBR 扇区的分区表中用2项就行,第一项分区表为主分区C盘,第2项分区表为扩展分区,它指向这项中磁头,扇区,柱面3维地址所指向的扇区(为第二个分区的第一个扇区,如D),在这个扇区中的分区表项也只有2项,第一项是这个分区,第二个分区表项为扩展分区.这个分区项指向下一个分区(如E盘)的的第一个扇区.,以此推之,就是一个分区链,这种就可以突破MBR中只有4个分区表项了.分区表项的第一个字节代表的是是否为活动分区,80表示是活动分区(主分区),00表示的是非活动分区(扩展分区,或没有用到的分区表项这个标志也为00),除这两个标示外.其它标示为非法.下面是这17个字节的代码:001B mov si,07BE '因为前面27个字节代码把MBR内容复制到0000:0600处(其实前面27个复制代码字节为00,没有复制过来,一开始就复制到0000:061b 处),所以分区表的位置就为0000:06BE(第一项的开头地址).所以这句代码是把si指向MBR 中硬盘分区表的第一项的首地址.001E mov cl,04 '分区表有4项,4*16=64个字节,用于loop0020 cmp [si],ch 'cx寄存器前面用movsb减为0,所以ch=0,判断第一个分区表项的第一个字节标示是否为非活动分区,因为cmp是有符号数据比较,如果[si]=80,则其比0小0022 jl 002D '如果是80,活动分区,则跳到002D地址,这里有点问题,如果是81非法数据,也是小于0,也会跳到002D地址,所以用JZ比较好点0024 jne 003B ' 如果不等于00,(即不为非活动分区),则跳到003B,显示错误信息.0026 add si,0010 '使si指向下一个分区项,即跳过16个字节.0029 loop 0020 '循环取出4个分区表项.loop由cx次数决定002B int 18 'INT 18 为ROM BASIC 入口代码,它指分区表项中没有活动分区标志或非活动分区标志时,进行ROM BASIC代码.002D mov dx,[si] '若找到活动分区,把分区表项的前2个字节放到DX中dl=80,dh=起始磁头号002F mov bp,si '把活动分区的起始位置保存到BP寄存器中0031 add si,0010 '指向下一个分区表项0034 dec cx '因为前面ch=0,就是把前面cl=4减1,0035 je 004D '分区检测完毕,则跳转到系统引导区0037 cmp [si],ch '判断是否为非活动分区,是则跳转检测下一个分区表项,就是一面这条指令0039 je 0031'下面地址003B,是前面在检测既不是活动分区时,也不是非活动分区时,跳过来显示错误信息003B mov si,0710 'MBR扇区中错误信息的地址(10fH),在这里起始地址是0600,所以为070f003e dec si '前一指令是0710,这里减1,正好是070f003F lodsb '把si指向的地址中的数据字节放到al中,执行后si+10040 cmp al,00 '如果指向的数据字节为00(到结束了),就跳到003E,这时因为上面si+1了,003E处减1还是指向这个00,所以就(循环)停止到这,显示错误信息0042 je 003E0044 mov bx,0007 'BIOS中断int 10h,BX=传输区地址0047 mov ah,0E '设置显示模式,AL=0E 640×200 彩色图形(EGA)0049 int 10 '中断10H 显示字符004B jmp 003f '跳转显示下一个字符.MBR主引导扇区前139个字节引导代码详解3默认分类 2009-12-02 12:03:23 阅读46 评论0 字号:大中小订阅最后一段字节的作用是把活动分区对应的第一个扇区的512个字节数据读到0000:7C00处,如果读取不成功再读,读取的次数赋到DI中,如果读取成功,判断结束标志是否为AA 55,则恢复活动分区指针到SI,转到0000:7c00处,执行活动分区的系统引导程序.mov si,bpjmp 0000:7c00。
磁盘引导扇区详细解析英文回答。
Master Boot Record (MBR)。
The Master Boot Record (MBR) is the first sector of a partitioned hard disk drive. It contains the partition table and a small amount of executable code that is responsible for booting the computer.The MBR is located at the beginning of the hard drive, at sector 0. It is a 512-byte sector that is divided into three main sections:1. The boot code (446 bytes)。
2. The partition table (64 bytes)。
3. The signature (2 bytes)。
The boot code is the first part of the MBR. It is a small program that is responsible for loading the operating system into memory and starting it up. The boot code is typically very simple, and it only needs to be able to load the first few sectors of the operating system into memory.Partition Table.The partition table is the second part of the MBR. It contains a list of the partitions on the hard drive. Each partition is represented by a 16-byte entry in thepartition table. The partition table entry contains the following information:The starting sector of the partition.The size of the partition.The type of partition.The signature is the last part of the MBR. It is a 2-byte value that identifies the MBR as a valid MBR. The signature is typically 0xAA55.Extended Boot Record (EBR)。
硬盘主引导扇区(MBS)结构,代码已注释有的网友反映第五部分MBR源代码看不懂,我注释一下我们经常遇到各种各样的硬盘故障,其中有相当部分是硬盘软故障,如有些朋友在安装Linux 后,发现无法安装Windows等,但很多朋友由于在对硬盘的逻辑结构不是很了解,无法判断合解决该类问题。
为了普及这些知识,增强大家的兴趣和做试验成功后的成就感,本人以提问的形式给大家展现这方面的知识,同时也提醒大家在实做时先用一个多余而且无重要数据的硬盘做试验,免得造成不必要的损失。
另外,对于汇编不了解但有一定计算机基础的朋友,建议自己查找资料进一步学习,也可以记下本文中的代码,实做中灵活应用。
问题:我们在安装所有版本的Windows时,一般不管使用Win 9X的Fdisk命令对硬盘进行分区,还是由安装程序进行分区,基本上都只能分一个主分区和一个扩展分区,扩展分区里面又分若干逻辑分区,很少人尝试过分多个主分区或多个扩展分区,今天有空出下面问题,随便做了个试验(Linux下做直接读Linux分区的文件试验导致硬盘Linux彻底被破坏,干脆。
),结果如下:10G硬盘分为了3个主分区,而且还可以从任何一个主分区启动,也就是说,3个主分区装了3个操作系统。
问题:(1)在只有基本的DOS情况下是如何做到的?(除了DOS,不允许用其它任何软件)(2)一块硬盘最多可分为几个主分区和几个扩展分区?目的:通过讨论,让大家(1)深刻理解硬盘0面0道1扇区的MBR+DPT+BRI结构;(2)掌握手动修改MBR和DPT的手段,具备手动备份和还原硬盘0面0道1扇区的能力;(3)了解计算机从硬盘启动的过程,了解编写多重启动程序的基本方法;(4)为将来学习其它操作系统打下良好的基础。
答案:(由于编辑窗口太小,可能有不少错误,也已修改不少,剩下的请指出)关键词:MBS- Master Boot Sector 主引导扇区MBR-Master Boot Record 主引导记录DPT-Disk Partition Table 硬盘分区表BRI-Boot Record ID 引导记录标志CHS-(Cylinder柱面,也就是磁道编号0-m Head 头,编号0-n Sector 扇区编号1-t)参数。
mbr详细解析硬盘MBR全面分析MBR, 硬盘硬盘MBR全面分析在分析MBR的结构之前,先有来看看计算机的引导顺序(System Boot Sequence)Step 1. 内部电源打开,初始化,等待一小段时间用来产生稳定的电流。
如果主板芯片和CPU 收到了不符合规定的电流,将自动产生一个RESET信号。
在主板没有收到电源的Power Good 信号之前,重复步骤1。
Step 2. 执行BIOS中0FFF0h处的代码。
这里只有一条JMP指令,将跳转到真正的BIOS启动程序处。
Step 3. BIOS开始加电自检(Power-On Self Test, POST),如果出现错误,启动停止。
成功的话执行INT 19h(SYSTEM - BOOTSTRAP LOADER)Step 4. BIOS开始寻找显卡,找到的话将执行显卡的BIOS。
接着显卡初始化,将显示一段显卡信息,我们开机看到的第一屏就是它。
Step 5. BIOS开始执行所有其他设备的BIOS,包括软驱,硬盘等。
Step 6. BIOS显示启动信息Step 7. BIOS开始额外的检测。
一般有内存检测,如果内存有问题,将显示错误消息。
Step 8. BIOS探测所有的硬件,将显示如硬盘/光区信息等Step 9. BIOS给出一个已知硬件的列表Step 10. BIOS按照设置的驱动器顺序找驱动器,如果驱动器存在的话继续找启动扇区,软驱/硬盘的启动扇区都在0柱0头1扇区(cylinder 0, head 0, sector 1)Step 11. 将启动扇区读到内存0000:7c00处,接着INT 19h开始执行0000:7c00处代码Step 12. 如果找不到驱动器,系统显示错误信息并停止。
通常是"No boot device"或"NO ROM BASIC -SYSTEM HALTED"上面是冷启动的过程,热启动将从步骤8开始磁盘的启动扇区就是主引导记录(Master Boot Record),包括0柱0头1扇区的512个字节,它的任务是完成BIOS到操作系统的交接。
MBR案例分析报告1. 简介本文档旨在对MBR(Master Boot Record)案例进行全面分析和报告。
MBR是计算机硬盘上的一个特殊区域,用于存储引导程序和分区表等重要信息。
在本次案例中,我们将深入探讨MBR的作用、相关问题和解决方案。
2. MBR的作用MBR是计算机启动过程中的关键组成部分,它负责加载操作系统的引导程序和分区表。
具体而言,MBR的主要作用包括:•引导加载程序:MBR中存储了引导加载程序的代码,该程序负责加载操作系统的核心组件。
•分区表:MBR还包含了磁盘分区表的信息,用于确定磁盘上各个分区的位置和大小。
3. MBR案例概述在这个案例中,我们将探讨一个与MBR相关的问题。
具体来说,我们将分析一种特定情况下MBR被破坏的情况,以及如何解决这个问题。
4. 案例分析在本次案例中,我们遇到了一个MBR被破坏的问题。
当用户尝试启动计算机时,系统提示找不到可启动的设备。
通过进一步的调查和分析,我们发现MBR已经被病毒或恶意软件感染,导致其无法正常工作。
4.1 问题诊断为了确定MBR的问题,我们采取了以下步骤:1.检查启动错误:我们首先观察到系统提示找不到可启动设备的错误信息,这是启动问题的明显迹象。
2.检查MBR状态:通过使用磁盘工具,我们查看了MBR的状态,并发现它已经被感染或破坏。
4.2 解决方案针对以上问题,我们制定了以下解决方案:1.使用安全启动:为了防止类似的问题再次发生,我们建议用户启用安全启动功能。
安全启动可以检测并阻止不信任的引导加载程序执行,从而保护系统安全。
2.修复MBR:为了解决当前的问题,我们采取了以下步骤修复MBR:–启动到恢复环境:我们使用操作系统安装光盘或USB驱动器启动计算机,并选择恢复环境。
–执行修复命令:在恢复环境中,我们使用相关的修复命令来修复MBR。
具体的命令取决于使用的操作系统和工具。
3.安全扫描和清除:为了确保系统的安全性,我们建议用户进行全面的安全扫描和清除,以防止其他恶意软件的存在。
MBR扇区解析周伟撰写1 MBR简介 (1)2 引导程序 (1)3 windows磁盘签名 (1)4 硬盘分区表 (2)5 结束标志 (2)6 总结 (3)1MBR简介主引导记录(MBR,Master Boot Record)是位于磁盘最前边的一段引导(Loader)代码。
它占用硬盘的第一个扇区(即0柱面0磁头1扇区),有512字节。
它负责磁盘操作系统(DOS)对磁盘进行读写时分区合法性的判别、分区引导信息的定位,它由磁盘操作系统(DOS)在对硬盘进行初始化时产生的。
2引导程序引导程序:占440字节,偏移位置:0x00-0x1B7;网上很多资料描述该段占用446字节,从偏移位置Ox1B8-Ox1BD并不是真正的引导程序。
引导程序在系统启动过程中的引导功能是这样实现的:主板BIOS程序自检通过后,会将MBR扇区整个读取到内存中,然后将执行权交给内存中MBR扇区的引导程序;系统下一步就会判断MBR扇区最后两字节是否为55AA,不是则报错;是则查找是否有活动分区,若有则判断活动分区的引导扇区在磁盘中的地址,并将该引导扇区读入内存及判断其合法性,如果是合法扇区,随后引导权就交给引导扇区去引导操作系统。
通过winhex可以查看该偏移位置下引导程序的二进制文件,如下图所示:3windows磁盘签名偏移位置:0x1B8-0x1BB;windows初始化时写入的磁盘标签;当硬盘挂载到windows操作系统后,会读取硬盘的MBR扇区及其磁盘签名并记录磁盘签名到注册表中;假如清除磁盘签名,然后重启挂载,windows会自动写入磁盘签名,但是0x1B8略有变化,如果挂载到其它系统,磁盘显示为“没有初始化”;分区正常,假如这时候再进行磁盘进行初始化将破坏分区表。
偏移位置OxBC-OxBD目前是保留的,不会影响到MBR分区和磁盘。
注:上图标注后面两位即是该位置。
4硬盘分区表偏移位置:0x1BE-0x1FD,结构非常重要,管理硬盘分区,如果分区表被破坏,硬盘分区丢失,显示未指派。
MBR引导代码分析整理:太虚野老用WinHex读MBR,如下:图中3个用红色矩形框框住的是3个字符串(Invalid partition table、Error loading operating system、Missing operating system)的地址相关的,分别是0x12C、0x144、0x 163。
用蓝色矩形框框住的,MBR里面的1B8偏移位置为磁盘签名,该签名由ntldr写入,W indows就是靠这个磁盘签名来确定是从哪块硬盘启动的,如果两个磁盘签名相同了,那么n tldr就会随机更改一块磁盘,但是下次就不会出现这种情况了。
实际MBR的可执行代码到0 x12B处结束。
MBR引导代码的作用就是加载活动分区的引导代码。
用IDA Pro反汇编MBR 后如下(包括分析):;//MBR在系统启动时由BIOS INT 19H自动加载到0000:7c00处,为512个字节.下面这段代码实现把0000:7c1b处MBR代码复制485个字节到0000:061b处,为什么不从0000:7c00开始复制512个到0000:06cc处,因为前面1b 个字节为复制代码,所以忽略.空出的0000:7c00 开始的空间将读入活动分区的操作系统的引导扇区.seg000:0000 33 C0 xor ax, ax ;//ax寄存器清0seg000:0002 8E D0 mov ss, ax ;//栈寄存器ss=0seg000:0004 BC 00 7C mov sp, 7C00h ;//栈指针—SS:SP=0000:7C00seg000:0007 FB sti ;//允许中断seg000:0008 50 push ax ;这条PUSH指令在0008处,前面的8个字节指令已经执行,所以push指令输入的数据覆盖前面的0000-0001空间,没有关系. seg000:0009 07 pop es ;//附加数据段寄存器es=0seg000:000A 50 push ax;seg000:000B 1F pop ds ;//数据段寄存器ds=0seg000:000C FC cld ;//使方向标志寄存器DF=0,规定其后的串操作为正向串操作;把7C1Bh处的长1E5h的代码拷贝到61Bh处seg000:000D BE 1B 7C mov si, 7C1Bh ;//用于movsbseg000:0010 BF 1B 06 mov di, 61Bh ;//用于movsb ,将[DS:SI]中字节传送到[ES:DI]中seg000:0013 50 push ax ;//保存ax,di,用于第001a处指令retf(同ret),使ax->cs,di->ip,实现指令跳转seg000:0014 57 push diseg000:0015 B9 E5 01 mov cx, 1E5h ;//用于rep movsb中的rep,每次cx 减1,到0不执行movsb ,200H-1BH=1E5seg000:0018 F3 A4 rep movsbseg000:001A CB retf ;//相当于pop ip; pop cs,即执行retf指令后跳转到061BH处执行seg000:001B; ---------------------------------------------------------------------------seg000:001B BD BE 07 mov bp, 7BEh ;// 600h+1BEh=7BEh,分区表起始偏移为1BEh,07BEH开始的16个字节是第一个分区表项seg000:001E B1 04 mov cl, 4 ;//硬盘的mbr分区表最多有4个表项,用于loopseg000:0020seg000:0020 loc_10020: ; CODE XREF: seg000:002A↓j seg000:0020 38 6E 00 cmp [bp+0], ch ;//检查分区指示符.cx寄存器前面用movsb减为0,所以ch=0.判断第一个分区表项的第一个字节是否为活动分区,因为cmp是有符号数据比较,如果[bp+0]=80,80H为负数,则其比0小seg000:0023 7C 09 jl short loc_1002E ;//如果是80,活动分区,则跳到002E地址.这里有点问题,如果[bp+0x0]是符号位为1的任意数的话,也是小于0,也会跳到002E地址seg000:0025 75 13 jnz short loc_1003A;//分区指示符不为0就跳转(显示分区表无效)seg000:0027 83 C5 10 add bp, 10h ;//指向下一个表项(每一个表项的长度为10h字节)seg000:002A E2 F4 loop loc_10020 ;//cx不为0就循环;四表项的状态字节都为0就执行ROM BASIC中断.只有IBM个人计算机有Basic包括在ROM中;Int 18h中断服务程序就是启动ROM-Basic,如果没有ROM BASIC,中断18H通常会显示消息 NO ROM BASIC 然后"系统暂停",并且系统中断seg000:002C CD 18 int 18h;//找到活动分区后,还要检查剩余分区的启动标志是否为0;不允许存在多个活动分区seg000:002Eseg000:002E loc_1002E: ; CODE XREF: seg000:0023 j seg000:002E 8B F5 mov si, bpseg000:0030seg000:0030 loc_10030: ; CODE XREF: seg000:0038↓j seg000:0030 83 C6 10 add si, 10h ;//下一个分区表表项seg000:0033 49 dec cx ;//分区表表项数量减1seg000:0034 74 19 jz short loc_1004F ;//如果4个表项都检查完毕就跳转seg000:0036 38 2C cmp [si], ch ;//检查分区指示符是否为0 seg000:0038 74 F6 jz short loc_10030 ;//如果分区指示符是0就跳转检查下一分区,否则分区表是无效的seg000:003Aseg000:003A loc_1003A: ; CODE XR EF: seg000:0025 j seg000:003A A0 B5 07 mov al, ds:7B5h ;// 01B5+0600=7B5h,0x1B5偏移地址处一般为2C,0x12C偏移地址处指向字符串“Invalid partition table”seg000:003Dseg000:003D loc_1003D: ; CODE XREF: seg000:0069↓j seg000:003D B4 07 mov ah, 7 ;//例如:AX=72C,原0x12C偏移地址处指向字符串“Invalid partition table”,012C+0600=72C,即AX指向错误信息seg000:003F 8B F0 mov si, ax ;//si就指向字符串seg000:0041seg000:0041 loc_10041: ; CODE XREF: seg000:004D↓j seg000:0041 AC lodsb ;//读取一个字节到alseg000:0042seg000:0042 loc_10042: ; CODE XREF: seg000:0044↓j seg000:0042 3C 00 cmp al, 0 ;//字符串是否显示完成,MBR中三个错误信息字符串都以00结尾seg000:0044 74 FC jz short loc_10042 ;// 如果字符串显示完成,则进入死循环。
否则如果字符串没有结束,调用10H号中断继续显示字符seg000:0046 BB 07 00 mov bx, 7 ;//BL前景色,这里7为白色seg000:0049 B4 0E mov ah, 0Eh ;//显示字符(光标前移)seg000:004B CD 10 int 10hseg000:004D EB F2 jmp short loc_10041 ;// 读取并显示下一个字符seg000:004F; ---------------------------------------------------------------------------;//如果分区表都是正确的,开始加载活动分区的引导扇区seg000:004Fseg000:004F loc_1004F: ; CODE XREF: seg000:0034 j seg000:004F 88 4E 10 mov [bp+10h], cl ;//bp是指向可引导分区表项的指针,cl为0.将[bp+0x10]标识位的初始值清0。
这个标志表示是否尝试过备份的引导扇区.[bp+10h]的字节肯定是没用的空间seg000:0052 E8 46 00 call sub_1009B ;//加载活动分区的头512字节到7C00H处seg000:0055 73 2A jnb short loc_10081 ;//加载成功就跳转seg000:0057seg000:0057 loc_10057: ; CODE XREF: seg000:008D↓j seg000:0057 FE 46 10 inc byte ptr [bp+10h];//将[bp+0x10]标识位置1,表示已经尝试过加载备份的引导扇区seg000:005A 80 7E 04 0B cmp byte ptr [bp+4], 0Bh ;//0BH:用传统INT 13h就可以访问的FAT32分区seg000:005E 74 0B jz short loc_1006Bseg000:0060 80 7E 04 0C cmp byte ptr [bp+4], 0Ch ;//0CH:需要用扩展INT 13h访问的FAT32分区seg000:0064 74 05 jz short loc_1006Bseg000:0066 A0 B6 07 mov al, ds:7B6h ;// 加载引导扇区失败,显示错误信息.0x1B6+0600=7B6h ,0x1B6偏移地址处一般为44,0x144偏移地址处指向字符串“Error loading operating system”seg000:0069 75 D2 jnz short loc_1003D ;//跳转到此地址将错误信息显示出来(显示完后,系统进入死循环);//如果活动分区是FAT32分区,尝试加载备份的引导扇区.FAT32的备份引导扇区号=引导扇区号+6seg000:006Bseg000:006B loc_1006B: ; CODE XREF: seg000:005E j seg000:006B ; seg000:0064 j seg000:006B 80 46 02 06 add byte ptr [bp+2], 6 ;//分区开始的扇区+6 seg000:006F 83 46 08 06 add word ptr [bp+8], 6 ;//本分区前已用的扇区数低2个字节+6seg000:0073 83 56 0A 00 adc word ptr [bp+0Ah], 0 ;//如果产生进位,将本分区前已用的扇区数高2个字节+1seg000:0077 E8 21 00 call sub_1009Bseg000:007A 73 05 jnb short loc_10081seg000:007C A0 B6 07 mov al, ds:7B6h ;//如果备份的引导扇区也损坏了,显示错误信息“Error loading operating system”seg000:007F EB BC jmp short loc_1003Dseg000:0081; ---------------------------------------------------------------------------;//在把控制权交给引导扇区前,要先检查引导扇区的签名(signature),防止把控制权交给已经损坏的引导扇区seg000:0081seg000:0081 loc_10081: ; CODE XREF: seg000:0055 jseg000:0081 ;seg000:007A j seg000:0081 81 3E FE 7D 55 AA cmp word ptr ds:7DFEh, 0AA55h ;//检查活动分区的头个扇区最后的2个字节是不是AA55hseg000:0087 74 0B jz short loc_10094;//如果是以AA55结尾就跳转seg000:0089 80 7E 10 00 cmp byte ptr [bp+10h], 0 ;//如果不是以AA55结尾,判断是否已经加载备份的引导扇区seg000:008D 74 C8 jz short loc_10057 ;// 如果没有加载备份的引导扇区,则跳转,加载备份的引导扇区seg000:008F A0 B7 07 mov al, ds:7B7h ;// 如果已经加载备份的引导扇区,则跳转显示错误信息. 0x1B7+0600=7B7h ,0x1B7偏移地址处一般为63,0x163偏移地址处指向字符串“Missing operating system”seg000:0092 EB A9 jmp short loc_1003Dseg000:0094; --------------------------------------------------------------------------- ;//转交控制权给引导扇区,让它去完成OS的引导seg000:0094seg000:0094 loc_10094: ;CODE XREF: seg000:0087 j seg000:0094 8B FC mov di, sp ;//di = sp = 7C00hseg000:0096 1E push ds ;//设置cs段seg000:0097 57 push di ;//设置ipseg000:0098 8B F5 mov si, bp ;//把活动分区表项指针传给引导扇区seg000:009A CB retf ;//相当于pop ip; pop cs,即执行retf指令后跳转到0000:7C00处执行(MBR的引导代码结束)seg000:009Bseg000:009B; =============== S U B R O U T I N E ======================================= ;//读取引导扇区的子过程seg000:009Bseg000:009Bseg000:009B sub_1009B proc near ; CODE XREF: seg000:0052 p seg000:009B ; seg000:0077 p seg000:009B BF 05 00 mov di, 5 ;//最多尝试读取活动分区的头个扇区5次,如果5次都失败了,提示载入操作系统错误seg000:009E 8A 56 00 mov dl, [bp+0];//驱动器dl=80H(00H~7FH:软盘;80H~0FFH:硬盘),分区的启动标志其实就是硬盘号seg000:00A1 B4 08 mov ah, 8 ;//08H号读取驱动器参数(读取这些参数是为了决定用CHS方式还是LBA方式读取磁盘)seg000:00A3 CD 13 int 13hseg000:00A5 72 23 jb short loc_100CA ;//CF=1代表操作失败,跳转(直接采用CHS方式读取磁盘),如果取参数失败,认为BIOS肯定不支持扩展Int 13h ;//计算用传统Int 13h能访问的最大逻辑扇区号,计算公式为:(最大磁头号+1)*每道扇区数*(最大柱面号+1).由于现代硬盘基本上采用LBA方式寻址,因此计算出的最大逻辑扇区号通常会很小。