MBR分析笔记

本文是作者关于MBR(主引导记录)的个人分析笔记,介绍了MBR的组成、分区表、系统启动过程以及调试方法,包括静态和动态分析。在启动过程中,MBR将自己复制到内存并寻找活动分区,最后跳转到分区引导记录启动系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于MBR介绍,网上已经有很多了这里分享下自己xp的mbr分析笔记

什么是MBR?
也叫主引导记录(Master Boot Record,简称MBR) MBR位于整个硬盘的0柱面0磁头1扇区的位置处
主引导记录(Master Boot Record,缩写:MBR),又叫做主引导扇区Master Boot Sector
它在硬盘上的三维地址为(柱面,磁头,扇区)=(0,0,1)

MBR组成
MBR可以分为五个部分(512字节)
1、引导程序(440字节)
2、Windows磁盘签名(4个字节)
3、保留位(2个字节)
4、硬盘分区表(Disk Partition Table 简称DPT) 64个字节
5、结束标志 (2个字节)

也可以分成3部分(1.引导程序 2.分区表 3.结束标志)
分区表
一个分区表项为0x10大小字节,所以存在4个分区表项
当然,也就只能有四个主分区或者3个主分区+1个扩展分区,但是平时看到有的电脑分成CDEFGH等盘,这是为什么呢?
因为此时,一般只有C盘是主分区,DEFGH盘一般是扩展分区细分出来的逻辑分区。也就是说扩展分区只能有一个,然后可以再细分为多个逻辑分区。

扩展分区也是主分区的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区。

调试之前先要了解windows系统启动过程
1、开机
2、BIOS加点自检(Power On Self Test,即POST),此时电源稳定后,CPU从内存地址0fff:0000处开始执行
3、将硬盘第一个扇区(0磁头0柱面1扇区)读取内存地址0000:7c00处
4、检测(WORD)0000:7dfe是否等于0xaa55,若不等于则转去尝试其他启动介质,如果没有其他启动介质则显示”No ROM BASIC”
5、跳转到0000:7c00处执行MBR中的程序

6、MBR首先将自己复制到0000:0600处,然后继续执行
7、在主分区表中搜索标志为活动的分区。如果发现没有活动分区或有不止一个活动分区,则显示“Invalid partiton table”
8、将活动分区的第一个扇区读入内存地址0000:7c00处
9、检测(WORD)000:7dfe是否等于0xaa55,若不等于则显示”Miss Operating System”,然后停止,或尝试软盘启动
10、跳转到0000:7c00处继续执行DBR
11、启动系统

以上步骤中2,3,4,5步由BIOS的引导程序完成,6、7、8、9、10步由MBR中的引导程序完成。
知道了过程,调试就简单多了,所以过程是分析一个很关键的步骤。

关于MBR的调试看willJ大大的文章吧~

最好先用IDA动态跟下自己的mbr,接着静态分析(每个系统的mbr都不会是一模一样的)。

IDA静态分析代码

seg000:7C00 seg000          segment byte public 'CODE' use16[/size]
seg000:7C00                 assume cs:seg000
seg000:7C00                 ;org 7C00h
seg000:7C00                 assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing
seg000:7C00                 xor     ax, ax          ; ax = 0
seg000:7C02                 mov     ss, ax          ; ss = 0
seg000:7C04                 mov     sp, 7C00h       ; sp = 0x7c00
seg000:7C07                 sti                     ; 开起段中断
seg000:7C08                 push    ax
seg000:7C09                 pop     es              ; es = 0
seg000:7C0A                 push    ax
seg000:7C0B                 pop     ds              ; ds = 0
seg000:7C0C                 cld                     ; 关闭段中断
seg000:7C0D                 push    ax
seg000:7C0E                 mov     si, 7C00h
seg000:7C11                 mov     di, 600h
seg000:7C14                 mov     cx, 200h        ; 循环次数,512次,也就是mbr的大小
seg000:7C17                 rep movsb               ; rep movsb将ds:si拷贝到es:di处,长度为cx
seg000:7C17                                         ; 即将mbr从0x7c00拷贝到0x600处
seg000:7C19                 mov     di, 61Eh
seg000:7C1C                 push    di
seg000:7C1D                 retf                    ; jmp到0x61E
seg000:7C1D                                         ; 也就是继续执行下一条指令(可以用IDA动态调试看)
s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值