Windows启动过程(MBR引导过程分析)
catalogue
. 电脑启动过程
. MBR分析(master boot record) - 位于整个硬盘的 扇区
. DBR(DOS boot record) - 位于柱面0,磁头1,扇区1,即逻辑扇区0(逻辑扇区的第一个扇区)
. MBR病毒
1. 电脑启动过程
. 按下开机电源,电源向主板和其他设备供电,此时电压不稳,主板控制芯片会向CPU发送并保持RESET(复位信号),让CPU初始化。当电源开始稳定后,芯片组撤去RESERT信号。如果按RESERT信号,当放开RESERT时,就撤去RESERT信号。CPU从FFFF0h处执行指令,此处为一条跳转指令,使CPU跳转到系统BIOS的启动代码处
. 系统BIOS的启动代码首先进行POST(加电自检)。POST主要对一些关键硬件进行检查。如显卡,内存,主板等。由于此处在显卡初始化之前,所以无法图像显示,只能通过声音了。即我们所知道的通过声音判断硬件问题
. 接着,系统BIOS查找显卡BIOS(通常地址C0000h处),找到后调用它的初始化代码,由显卡BIOS完成显卡的初始化,此处会在屏幕上显示显卡信息,厂商,显卡容量等
. 接着系统BIOS会查找其他设备的BIOS,并调用它们的初始化代码
. 接着系统BIOS检查CPU类型和工作频率,并显示检测结果。之后系统BIOS检测内存并显示信息
. 内存测试通过后,检测其他安装的硬件设备,包括:硬盘,CD-ROM,串行接口,并行接口等。
. 标准设备查完后,系统BIOS内部的支持即插即用的代码检测和配置系统中安装的即插即用设备,每检测到一个,系统BIOS在屏幕上显示该设备信息,同时为设备分配中断,DMA通道和I/O端口资源
. 到此,硬件设备检测完毕,系统BIOS会重新清屏并在屏幕上显示出一个系统配置表,其中概略列出系统中安装的各种标准硬件设备,及他们使用的资源和一些相关参数。
. 接下来系统BIOS更新ESCD(扩展系统配置数据)。ESCD是系统BIOS用来与操作系统交换硬件配置信息的数据,存放在CMOS中。通常ESCD数据只有系统硬件配置改变时才更新
10. ESCD更新完毕后,系统BIOS根据用户指定的启动顺序从指定设备启动(加载MBR到7c00h处,同时还会把设备的驱动号给dl)
0x1: BIOS
BIOS(Basic Input/Output System)基本输入输出系统,全称是ROM-BIOS,是只读存储器基本输输出系统的简写,它实际是一组被固化到电脑中,为电脑提供最低级最直接的硬件控制的程序。电脑启动后第一个运行的用户级汇编代码就是它(因为严谨来说CPU内部也有启动代码),而BIOS的运行离不开CMOS(Complementary Metal Oxide Semiconductor),CMOS本意是指互补金属氧化物半导体,一种大规模应用于集成电路芯片制造的原料,在计算机领域,CMOS常指保存计算机基本启动信息(如日期、时间、启动设置等)的芯片CMOS 的功耗很低,计算机主板上一个纽扣电池就可以给它长时间地提供电力,即使系统掉电,信息也不会丢失。而当主板电池供电不足时CMOS的信息会丢失
CMOS是主板上的一块可读写的RAM芯片,是用来保存BIOS的硬件配置和用户对某些参数的设定。而对CMOS中各项参数的设定要通过专门的程序,现在多数厂家将CMOS设置程序做到了BIOS芯片中,在开机时通过按下某个特定键就可进入CMOS设置程序而非常方便地对系统进行设置,因此这种CMOS设置又通常被叫做BIOS设置
Relevant Link:
http://blog.csdn.net/sunqinye/article/details/18793853
2. MBR分析(master boot record) - 位于整个硬盘的 0 扇区
磁盘的存储是已扇区为基本单位的,我们的资料,操作系统代码,包括系统启动引导代码(MBR)都是存储在这些扇区中,其中硬盘的0柱面、0磁头、1扇区称为主引导扇区,也叫主引导记录MBR,该记录占用512个字节,它用于硬盘启动时将系统控制权(BIOS启动后将控制权给MBR,MBR负责加载操作系统)转给用户指定的、在分区表中登记了某个操作系统分区
MBR的内容是在硬盘分区时由分区软件写入该扇区的,MBR不属于任何一个操作系统,不随操作系统的不同而不同,即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。但安装某些多重引导功能的软件或LINUX的LILO时有可能改写它,它先于所有的操作系统被调入内存并发挥作用,然后才将控制权交给活动主分区内的操作系统
0x1: MBR功能
.扫描分区表查找活动分区
.寻找活动分区的起始扇区
.将活动分区的引导扇区读到内存
.执行引导扇区的运行代码(启动操作系统)
如果主引导代码未完成这些功能,系统显示下列错误信息
Invalid partition table
Error loading operating system
Missing operating system
0x2: MBR成员结构
. BootCode(主引导程序代码): [:]
. DiskSignature(磁盘签名): [: ]: 主引导程序代码之后的4字节
self.BootableFlag = struct.unpack("<c", data[:])[]
self.StartCHS0 = struct.unpack("<B", data[:])[]
self.StartCHS1 = struct.unpack("<B", data[:])[]
self.StartCHS2 = struct.unpack("<B", data[:])[]
. Unused: [:]
. PartitionTables(4个硬盘分区表DPT): [: ],占64字节,每个分区表占16字节
self.Entry0 = PartitionEntry(data[:])
self.Entry1 = PartitionEntry(data[:])
self.Entry2 = PartitionEntry(data[:])
self.Entry3 = PartitionEntry(data[:])
. Signature(主引导扇区结束标志55AAH): [: ]

1. Bootcode(主引导程序代码)
0x00000000: 33c0 XOR AX, AX
0x00000002: 8ed0 MOV SS, AX
0x00000004: bc007c MOV SP, 0x7c00 ; 当前栈区在0x7c00
0x00000007: fb STI
0x00000008: PUSH AX
0x00000009: POP ES
0x0000000a: PUSH AX
0x0000000b: 1f POP DS
0x0000000c: fc CLD
0x0000000d: be1b7c MOV SI, 0x7c1b
0x00000010: bf1b06 MOV DI, 0x61b
0x00000013: PUSH AX
0x00000014: PUSH DI
0x00000015: b9e501 MOV CX, 0x1e5 ; 区块初始化
0x00000018: f3a4 REP MOVSB ; 复制引导扇区内容到DI所在位置
0x0000001a: cb RETF ; 远返回指令,相当于跳转到0:DI
0x0000001b: bdbe07 MOV BP, 0x7be ; 栈底 7be 即指向DPT表
0x0000001e: b104 MOV CL, 0x4
0x00000020: 386e00 CMP [BP+0x0], CH ; 对介质类型判断
0x00000023: 7c09 JL 0x2e
0x00000025: JNZ 0x3a
0x00000027: 83c510 ADD BP, 0x10 ; 继续判断下一个分区表
0x0000002a: e2f4 LOOP 0x20
0x0000002c: cd18 INT 0x18
0x0000002e: 8bf5 MOV SI, BP
0x00000030: 83c610 ADD SI, 0x10
0x00000033: DEC CX
0x00000034: JZ 0x4f
0x00000036: 382c CMP [SI], CH
0x00000038: 74f6 JZ 0x30
0x0000003a: a0b507 MOV AL, [0x7b5]
0x0000003d: b407 MOV AH, 0x7
0x0000003f: 8bf0 MOV SI, AX
0x00000041: ac LODSB
0x00000042: 3c00 CMP AL, 0x0
0x00000044: 74fc JZ 0x42
0x00000046: bb0700 MOV BX, 0x7
0x00000049: b40e MOV AH, 0xe
0x0000004b: cd10 INT 0x10
0x0000004d: ebf2 JMP 0x41
0x0000004f: 884e10 MOV [BP+0x10], CL
0x00000052: e84600 CALL 0x9b
0x00000055: 732a JAE 0x81
0x00000057: fe4610 INC BYTE [BP+0x10]
0x0000005a: 807e040b CMP BYTE [BP+0x4], 0xb
0x0000005e: 740b JZ 0x6b
0x00000060: 807e040c CMP BYTE [BP+0x4], 0xc
0x00000064: JZ 0x6b
0x00000066: a0b607 MOV AL, [0x7b6]
0x00000069: 75d2 JNZ 0x3d
0x0000006b: ADD BYTE [BP+0x2], 0x6
0x0000006f: ADD WORD [BP+0x8], 0x6
0x00000073: 83560a00 ADC WORD [BP+0xa], 0x0
0x00000077: e82100 CALL 0x9b
0x0000007a: JAE 0x81
0x0000007c: a0b607 MOV AL, [0x7b6]
0x0000007f: ebbc JMP 0x3d
0x00000081: 813efe7d55aa CMP WORD [0x7dfe], 0xaa55 ; 检测signature
0x00000087: 740b JZ 0x94
0x00000089: 807e1000 CMP BYTE [BP+0x10], 0x0
0x0000008d: 74c8 JZ 0x57 ; if(支持 API位图) {
0x0000008f: a0b707 MOV AL, [0x7b7]
0x00000092: eba9 JMP 0x3d
0x00000094: 8bfc MOV DI, SP
0x00000096: 1e PUSH DS
0x00000097: PUSH DI
0x00000098: 8bf5 MOV SI, BP
0x0000009a: cb RETF
0x0000009b: bf0500 MOV DI, 0x5
0x0000009e: 8a5600 MOV DL, [BP+0x0]
0x000000a1: b408 MOV AH, 0x8
0x000000a3: cd13 INT 0x13
0x000000a5: JB 0xca
0x000000a7: 8ac1 MOV AL, CL
0x000000a9: 243f AND AL, 0x3f
0x000000ab: CBW
0x000000ac: 8ade MOV BL, DH
0x000000ae: 8afc MOV BH, AH
0x000000b0: INC BX
0x000000b1: f7e3 MUL BX
0x000000b3: 8bd1 MOV DX, CX
0x000000b5: 86d6 XCHG DH, DL
0x000000b7: b106 MOV CL, 0x6
0x000000b9: d2ee SHR DH, CL
0x000000bb: INC DX
0x000000bc: f7e2 MUL DX
0x000000be: 39560a CMP [BP+0xa], DX
0x000000c1: JA 0xe6
0x000000c3: JB 0xca
0x000000c5: CMP [BP+0x8], AX
0x000000c8: 731c JAE 0xe6
0x000000ca: b80102 MOV AX, 0x201
0x000000cd: bb007c MOV BX, 0x7c00
0x000000d0: 8b4e02 MOV CX, [BP+0x2]
0x000000d3: 8b5600 MOV DX, [BP+0x0]
0x000000d6: cd13 INT 0x13
0x000000d8: JAE 0x12b
0x000000da: 4f DEC DI
0x000000db: 744e JZ 0x12b
0x000000dd: 32e4 XOR AH, AH
0x000000df: 8a5600 MOV DL, [BP+0x0]
0x000000e2: cd13 INT 0x13
0x000000e4: ebe4 JMP 0xca
0x000000e6: 8a5600 MOV DL, [BP+0x0]
0x000000e9: PUSHA
0x000000ea: bbaa55 MOV BX, 0x55aa
0x000000ed: b441 MOV AH, 0x41
0x000000ef: cd13 INT 0x13
0x000000f1: JB 0x129
0x000000f3: 81fb55aa CMP BX, 0xaa55
0x000000f7: JNZ 0x129
0x000000f9: f6c101 TEST CL, 0x1
0x000000fc: 742b JZ 0x129
0x000000fe: POPA
0x000000ff: PUSHA ; 寄存器保护
0x00000100: 6a00 PUSH 0x0 ; BlockNum_H4
0x00000102: 6a00 PUSH 0x0
0x00000104: ff760a PUSH WORD [BP+0xa]
0x00000107: ff7608 PUSH WORD [BP+0x8] ; BlockNum_L4
0x0000010a: 6a00 PUSH 0x0 ; BufferAddr_H2
0x0000010c: 68007c PUSH WORD 0x7c00 ; BufferAddr_L2
0x0000010f: 6a01 PUSH 0x1 ; BlockCount=
0x00000111: 6a10 PUSH 0x10 ; PacketSize= PReserved=
0x00000113: b442 MOV AH, 0x42 ; 磁盘地址数据包
0x00000115: 8bf4 MOV SI, SP
0x00000117: cd13 INT 0x13 ; 扩展读
0x00000119: POPA
0x0000011a: POPA
0x0000011b: 730e JAE 0x12b
0x0000011d: 4f DEC DI
0x0000011e: 740b JZ 0x12b
0x00000120: 32e4 XOR AH, AH
0x00000122: 8a5600 MOV DL, [BP+0x0]
0x00000125: cd13 INT 0x13
0x00000127: ebd6 JMP 0xff
0x00000129: POPA
0x0000012a: f9 STC
0x0000012b: c3 RET
2. PartitionEntry(分区表)
. 引导标志(BootableFlag)[:]: 指明该分区是否是活动分区
) 0x80: Bootable
) !0x80: Not Bootable
. 硬盘物理起始位置信息(Start_CHS)
) 磁头(Heads): [:]
) 扇区(Sector): [:]
) 柱面(Cylinder): [:]
. 分区的类型描述(PartitionType)[:]: 定义了分区的类型
0x00: "Empty",
0x01: "FAT12,CHS",
0x04: "FAT16 16-32MB,CHS",
0x05: "Microsoft Extended",
0x06: "FAT16 32MB,CHS",
0x07: "NTFS",
0x0b: "FAT32,CHS",
0x0c: "FAT32,LBA",
0x0e: "FAT16, 32MB-2GB,LBA",
0x0f: "Microsoft Extended, LBA",
0x11: "Hidden FAT12,CHS",
0x14: "Hidden FAT16,16-32MB,CHS",
0x16: "Hidden FAT16,32MB-2GB,CHS",
0x18: "AST SmartSleep Partition",
0x1b: "Hidden FAT32,CHS",
0x1c: "Hidden FAT32,LBA",
0x1e: "Hidden FAT16,32MB-2GB,LBA",
0x27: "PQservice",
0x39: "Plan 9 partition",
0x3c: "PartitionMagic recovery partition",
0x42: "Microsoft MBR,Dynamic Disk",
0x44: "GoBack partition",
0x51: "Novell",
0x52: "CP/M",
0x63: "Unix System V",
0x64: "PC-ARMOUR protected partition",
0x82: "Solaris x86 or Linux Swap",
0x83: "Linux",
0x84: "Hibernation",
0x85: "Linux Extended",
0x86: "NTFS Volume Set",
0x87: "NTFS Volume Set",
0x9f: "BSD/OS",
0xa0: "Hibernation",
0xa1: "Hibernation",
0xa5: "FreeBSD",
0xa6: "OpenBSD",
0xa8: "Mac OSX",
0xa9: "NetBSD",
0xab: "Mac OSX Boot",
0xaf: "MacOS X HFS",
0xb7: "BSDI",
0xb8: "BSDI Swap",
0xbb: "Boot Wizard hidden",
0xbe: "Solaris 8 boot partition",
0xd8: "CP/M-86",
0xde: "Dell PowerEdge Server utilities (FAT fs)",
0xdf: "DG/UX virtual disk manager partition",
0xeb: "BeOS BFS",
0xee: "EFI GPT Disk",
0xef: "EFI System Parition",
0xfb: "VMWare File System",
0xfc: "VMWare Swap",
. 硬盘物理结束位置信息(End_CHS)
) 磁头(Heads): [:]
) 扇区(Sector): [:]
) 柱面(Cylinder): [:]
. 本分区之前使用的扇区数(Starting Sector LBA)[:]: 指从该磁盘开始到该分区开始之间的偏移量,以扇区数为单位
在我自己电脑上这个值取到的是0x3f(),即MBR的第一个分区是从63扇区开始,通常情况下,磁盘的3-63扇区之间的内容是未使用的,因此MBR木马常常将shellcode放置在这块分区中 . 分区的总扇区数(Section in Partition)[:]: 该分区所包含扇区的总数
在我自己电脑上这个值取到的是0xee7bb0f()
我的电脑上第4个分区表的解析结果如下
===== Partition Table # =====
Boot flag: 0x80 (Bootable)
Partition type: 0x7 (NTFS)
Starting Sector (LBA): 0x3f ()
Starting CHS: Cylinder: Head: Sector:
Ending CHS: Cylinder: Head: Sector:
Size in sectors: 0xee7bb0f () ===== Partition Table # =====
Boot flag: 0x0
Partition type: 0x0 (Empty)
Starting Sector (LBA): 0x0 ()
Starting CHS: Cylinder: Head: Sector:
Ending CHS: Cylinder: Head: Sector:
Size in sectors: 0x0 ()
===== Partition Table # =====
Boot flag: 0x0 Partition type: 0x0 (Empty)
Starting Sector (LBA): 0x0 ()
Starting CHS: Cylinder: Head: Sector:
Ending CHS: Cylinder: Head: Sector:
Size in sectors: 0x0 () ===== Partition Table # =====
Boot flag: 0x0
Partition type: 0x0 (Empty)
Starting Sector (LBA): 0x0 ()
Starting CHS: Cylinder: Head: Sector:
Ending CHS: Cylinder: Head: Sector:
Size in sectors: 0x0 ()
由于MBR仅仅为分区表保留了64字节的存储空间,而每个分区则占用16字节的空间,也就是只能分4个分区,而4个分区在实际情况下往往是不够用的。因此就有了扩展分区,扩展分区中的每个逻辑分区的分区信息都存在一个类似MBR的扩展引导记录(简称EBR)中,扩展引导记录包括分区表和结束标志“55 AA”,没有引导代码部分

如上图:EBR中分区表的第一项描述第一个逻辑分区,第二项指向下一个逻辑分区的EBR。如果下一个逻辑分区不存在,第二项就不需要了 
如果硬盘的MBR被破坏,可以复制其他硬盘的MBR到故障盘,然后修复分区表,也可以初始化故障盘然后修复分区表
Relevant Link:
https://raw.githubusercontent.com/gleeda/misc-scripts/master/misc_python/mbr_parser.py
https://raw.githubusercontent.com/gleeda/misc-scripts/master/misc_python/mbr_parser.py
https://github.com/hamptus/pyMBR/blob/master/mbr.py
http://baike.baidu.com/item/%E5%BC%95%E5%AF%BC%E6%89%87%E5%8C%BA
http://bbs.pediy.com/thread-178914.htm
http://blog.csdn.net/sunqinye/article/details/18793853
http://www.360doc.com/content/14/1201/12/11681374_429548792.shtml
http://www.bydavy.com/2012/01/lets-decrypt-a-master-boot-record/
http://dengqi.blog.51cto.com/5685776/1348951
3. DBR(DOS boot record) - 位于柱面0,磁头1,扇区1,即逻辑扇区0(逻辑扇区的第一个扇区)
分区引导扇区也称DBR,是由FORMAT高级格式化命令写到该扇区的内容,DBR是由硬盘的MBR装载的程序段。DBR装入内存后,即开始执行该引导程序段,其主要功能是完成操作系统的自举并将控制权交给操作系统。每个分区都有引导扇区,但只有被设为活动分区才会被MBR装的DBR入内存运行
Relevant Link:
http://baike.baidu.com/item/DBR/4998996
4. MBR病毒
http://bbs.pediy.com/thread-121861.htm
Copyright (c) 2017 LittleHann All rights reserved
Windows启动过程(MBR引导过程分析)的更多相关文章
- Windows 启动过程
		
引言 启动过程是我们了解操作系统的第一个环节.了解 Windows 的启动过程,可以帮助我们解决一些启动的问题,也能帮助我们了解 Windows 的整体结构. 以下内容将分为[加载内核].[内核初始化 ...
 - UEFI BIOS模式下Windows系统启动过程以及引导文件修复方法
		
有关UEFI BIOS基础知识的简介,一年前在网易博客做过详细的概述.鉴于某些网友仍然对UEFI下Windows的启动过程不甚了解,虽然网上有各式各样的启动修复工具,但是对于新手来说,如果不明白其中的 ...
 - UEFI下windows启动过程
		
引导文件 在UEFI安装完操作系统后,Windows至少使用两个分区,一个叫做ESP分区(EFI SYSTEM PARTITION),用于存放启动文件,另一个则是BIOS下正常的系统分区,不同的是,B ...
 - Android 启动过程简析
		
首先我们先来看android构架图: android系统是构建在linux系统上面的. 所以android设备启动经历3个过程. Boot Loader,Linux Kernel & Andr ...
 - 双系统如何删除Linux,恢复Windows从MBR引导启动?
		
嗯,现在愿意尝试Linux的人越来越多了.通常,如果一台电脑里已经装有了Windows,再装Linux,安装时,Linux的grub引导程 序就会覆盖掉保存在MBR当中的原来的Windows引导程序. ...
 - GRUB损坏后,如何修复windows启动mbr
		
今天使用Ghost装系统遇到windows7不能启动的问题,采用下面帖子中的部分命令搞定之. 我自己是直接使用: 插入windows7安装光盘,从光盘启动,在光盘启动完成后,按下shift+f10键, ...
 - 主引导记录MBR/硬盘分区表DPT/主分区、扩展分区和逻辑分区/电脑启动过程
		
主引导扇区主引导扇区位于整个硬盘的0柱面0磁头1扇区{(柱面,磁头,扇区)|(0,0,1)},bios在执行自己固有的程序以后就会jump到MBR中的第一 条指令.将系统的控制权交由mbr来执行.主引 ...
 - [17]Windows的启动过程
		
一.内核的引导 在intel x86系统上,windows操作系统获得控制首先从硬盘的主引导记录(MBR,Master Boot Record)开始,windows setup程序在安装windows ...
 - Linux系统在启动过程中mbr主引导程序被破坏的解决方案
		
首先,mbr主引导程序被破坏是指系统在启动过程中,磁头找不到/boot分区(windows的启动分区在c盘). 1)下面我们模拟主引导分区被破坏的情况:(在启动分区划分446M的存储大小) 2)重启( ...
 
随机推荐
- AngularJS学习之旅—AngularJS 控制器(六)
			
1.AngularJS 控制器 AngularJS 应用程序被控制器控制. ng-controller 指令定义了应用程序控制器. 控制器是 JavaScript 对象,由标准的 JavaScript ...
 - MFC自绘菜单
			
自绘控件问题多多.本文以菜单为例. ①当要使用顶层菜单资源.对话框资源.状态栏资源等这3种资源的任何一种.那么CWinApp::InitInstance函数内部必须使用LoadFrame函数来加载资源 ...
 - SQLAlchemy增删改查
			
sqlalchemy中让MySQL支持中文字符 engine = create_engine("mysql+pymysql://root:mysql8@localhost/mysqltest ...
 - DSP到底是个什么鬼?看完你就懂了
			
DSP 即数字信号处理技术, DSP 芯片即指能够实现数字信号处理技术的芯片. DSP芯片是一种快速强大的微处理器,独特之处在于它能即时处理资料. DSP 芯片的内部采用程序和数据分开的哈佛结构,具有 ...
 - Bubble Babble Binary Data Encoding的简介以及bubblepy的安装使用方法
			
Bubble Babble Binary Data Encoding是由Antti Huima创建的一种编码方法,可以把二进制信息表示为由交替的元音和辅音组成的伪词(pseudo-words),主要用 ...
 - Golang 入门 : 数组
			
数组是指一系列同一类型数据的集合.数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型,比如 int.string 等,也可以是用户自定义的类型.一个数组包含的元素个数被 ...
 - Reachability from the Capital CodeForces - 999E (强连通)
			
There are nn cities and mm roads in Berland. Each road connects a pair of cities. The roads in Berla ...
 - Ubuntu 系统安装详解 19.04最新版本
			
Ubuntu 19.04版本系统安装详解 1 .镜像的下载 推荐 阿里云镜像下载 2.安装 1.1.新建虚拟机 注意硬件的兼容性问题 当前只有5.x可以用,其他兼容各位可以尝试下,我也都试过,但只有5 ...
 - EntityFramework优化:第一次启动优化
			
1. 预先生成视图 通过代码的方式来预先生成视图,要求EntityFramework是6.0及以上版本. 控制台程序: using System.Data.Entity.Infrastructure; ...
 - rsync 远程拷贝
			
rsync -vzP win7.qcow2 agu@192.168.1.198:/tmp/