Windows啓動過程(MBR引導過程分析)

cataloguehtml

1. 電腦啓動過程
2. MBR分析(master boot record) - 位於整個硬盤的 0 扇區
3. DBR(DOS boot record) - 位於柱面0,磁頭1,扇區1,即邏輯扇區0(邏輯扇區的第一個扇區)
4. MBR病毒

 

1. 電腦啓動過程python

1. 按下開機電源,電源向主板和其餘設備供電,此時電壓不穩,主板控制芯片會向CPU發送並保持RESET(復位信號),讓CPU初始化。當電源開始穩定後,芯片組撤去RESERT信號。若是按RESERT信號,當放開RESERT時,就撤去RESERT信號。CPU從FFFF0h處執行指令,此處爲一條跳轉指令,使CPU跳轉到系統BIOS的啓動代碼處 
2. 系統BIOS的啓動代碼首先進行POST(加電自檢)。POST主要對一些關鍵硬件進行檢查。如顯卡,內存,主板等。因爲此處在顯卡初始化以前,因此沒法圖像顯示,只能經過聲音了。即咱們所知道的經過聲音判斷硬件問題 
3. 接着,系統BIOS查找顯卡BIOS(一般地址C0000h處),找到後調用它的初始化代碼,由顯卡BIOS完成顯卡的初始化,此處會在屏幕上顯示顯卡信息,廠商,顯卡容量等 
4. 接着系統BIOS會查找其餘設備的BIOS,並調用它們的初始化代碼
5. 接着系統BIOS檢查CPU類型和工做頻率,並顯示檢測結果。以後系統BIOS檢測內存並顯示信息
6. 內存測試經過後,檢測其餘安裝的硬件設備,包括:硬盤,CD-ROM,串行接口,並行接口等。
7. 標準設備查完後,系統BIOS內部的支持即插即用的代碼檢測和配置系統中安裝的即插即用設備,每檢測到一個,系統BIOS在屏幕上顯示該設備信息,同時爲設備分配中斷,DMA通道和I/O端口資源
8. 到此,硬件設備檢測完畢,系統BIOS會從新清屏並在屏幕上顯示出一個系統配置表,其中概略列出系統中安裝的各類標準硬件設備,及他們使用的資源和一些相關參數。
9. 接下來系統BIOS更新ESCD(擴展系統配置數據)。ESCD是系統BIOS用來與操做系統交換硬件配置信息的數據,存放在CMOS中。一般ESCD數據只有系統硬件配置改變時才更新
10. ESCD更新完畢後,系統BIOS根據用戶指定的啓動順序從指定設備啓動(加載MBR到7c00h處,同時還會把設備的驅動號給dl)

0x1: BIOSgit

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設置
github

Relevant Link:shell

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時有可能改寫它,它先於全部的操做系統被調入內存併發揮做用,而後纔將控制權交給活動主分區內的操做系統
ide

0x1: MBR功能測試

1.掃描分區表查找活動分區
2.尋找活動分區的起始扇區
3.將活動分區的引導扇區讀到內存
4.執行引導扇區的運行代碼(啓動操做系統)

若是主引導代碼未完成這些功能,系統顯示下列錯誤信息spa

Invalid partition table
Error loading operating system
Missing operating system

0x2: MBR成員結構操作系統

1. BootCode(主引導程序代碼): [0:440]
2. DiskSignature(磁盤簽名): [440: 444]: 主引導程序代碼以後的4字節
    self.BootableFlag = struct.unpack("<c", data[:1])[0]
        self.StartCHS0 = struct.unpack("<B", data[1:2])[0]
        self.StartCHS1 = struct.unpack("<B", data[2:3])[0]
        self.StartCHS2 = struct.unpack("<B", data[3:4])[0]
3. Unused: [444:445] 
4. PartitionTables(4個硬盤分區表DPT): [445: 509],佔64字節,每一個分區表佔16字節 
    self.Entry0 = PartitionEntry(data[6:22])
        self.Entry1 = PartitionEntry(data[22:38])
        self.Entry2 = PartitionEntry(data[38:54])
        self.Entry3 = PartitionEntry(data[54:70])
5. Signature(主引導扇區結束標誌55AAH): [509: 511]

1. Bootcode(主引導程序代碼)

0x00000000: 33c0                             XOR AX, AX
0x00000002: 8ed0                             MOV SS, AX
0x00000004: bc007c                           MOV SP, 0x7c00    ; 當前棧區在0x7c00
0x00000007: fb                               STI
0x00000008: 50                               PUSH AX
0x00000009: 07                               POP ES
0x0000000a: 50                               PUSH AX
0x0000000b: 1f                               POP DS
0x0000000c: fc                               CLD
0x0000000d: be1b7c                           MOV SI, 0x7c1b
0x00000010: bf1b06                           MOV DI, 0x61b
0x00000013: 50                               PUSH AX
0x00000014: 57                               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: 7513                             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: 49                               DEC CX
0x00000034: 7419                             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: 7405                             JZ 0x6b
0x00000066: a0b607                           MOV AL, [0x7b6]
0x00000069: 75d2                             JNZ 0x3d
0x0000006b: 80460206                         ADD BYTE [BP+0x2], 0x6
0x0000006f: 83460806                         ADD WORD [BP+0x8], 0x6
0x00000073: 83560a00                         ADC WORD [BP+0xa], 0x0
0x00000077: e82100                           CALL 0x9b
0x0000007a: 7305                             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: 57                               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: 7223                             JB 0xca
0x000000a7: 8ac1                             MOV AL, CL
0x000000a9: 243f                             AND AL, 0x3f
0x000000ab: 98                               CBW
0x000000ac: 8ade                             MOV BL, DH
0x000000ae: 8afc                             MOV BH, AH
0x000000b0: 43                               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: 42                               INC DX
0x000000bc: f7e2                             MUL DX
0x000000be: 39560a                           CMP [BP+0xa], DX
0x000000c1: 7723                             JA 0xe6
0x000000c3: 7205                             JB 0xca
0x000000c5: 394608                           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: 7351                             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: 60                               PUSHA
0x000000ea: bbaa55                           MOV BX, 0x55aa
0x000000ed: b441                             MOV AH, 0x41
0x000000ef: cd13                             INT 0x13         
0x000000f1: 7236                             JB 0x129
0x000000f3: 81fb55aa                         CMP BX, 0xaa55    
0x000000f7: 7530                             JNZ 0x129
0x000000f9: f6c101                           TEST CL, 0x1    
0x000000fc: 742b                             JZ 0x129
0x000000fe: 61                               POPA
0x000000ff: 60                               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=1
0x00000111: 6a10                             PUSH 0x10        ; PacketSize=16 PReserved=0
0x00000113: b442                             MOV AH, 0x42    ; 磁盤地址數據包
0x00000115: 8bf4                             MOV SI, SP
0x00000117: cd13                             INT 0x13        ; 擴展讀
0x00000119: 61                               POPA
0x0000011a: 61                               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: 61                               POPA
0x0000012a: f9                               STC
0x0000012b: c3                               RET

2. PartitionEntry(分區表)

1. 引導標誌(BootableFlag)[0:1]: 指明該分區是不是活動分區
    1) 0x80: Bootable
    2) !0x80: Not Bootable
2. 硬盤物理起始位置信息(Start_CHS)
    1) 磁頭(Heads): [1:2]
    2) 扇區(Sector): [2:3]
    3) 柱面(Cylinder): [3:4]
3. 分區的類型描述(PartitionType)[4:5]: 定義了分區的類型
    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",
4. 硬盤物理結束位置信息(End_CHS)
    1) 磁頭(Heads): [5:6]
    2) 扇區(Sector): [6:7]
    3) 柱面(Cylinder): [7:8]
5. 本分區以前使用的扇區數(Starting Sector LBA)[8:12]: 指從該磁盤開始到該分區開始之間的偏移量,以扇區數爲單位
在我本身電腦上這個值取到的是0x3f(63),即MBR的第一個分區是從63扇區開始,一般狀況下,磁盤的3-63扇區之間的內容是未使用的,所以MBR木馬經常將shellcode放置在這塊分區中

6. 分區的總扇區數(Section in Partition)[12:16]: 該分區所包含扇區的總數
在我本身電腦上這個值取到的是0xee7bb0f(250067727)

個人電腦上第4個分區表的解析結果以下

===== Partition Table #1 =====
Boot flag: 0x80 (Bootable)
Partition type: 0x7 (NTFS)
Starting Sector (LBA): 0x3f (63)
Starting CHS: Cylinder: 0 Head: 1 Sector: 1
Ending CHS: Cylinder: 1023 Head: 254 Sector: 63
Size in sectors: 0xee7bb0f (250067727)
 
===== Partition Table #2 =====
Boot flag: 0x0 
Partition type: 0x0 (Empty)
Starting Sector (LBA): 0x0 (0)
Starting CHS: Cylinder: 0 Head: 0 Sector: 0
Ending CHS: Cylinder: 0 Head: 0 Sector: 0
Size in sectors: 0x0 (0) 
===== Partition Table #3 =====
Boot flag: 0x0 

Partition type: 0x0 (Empty)
Starting Sector (LBA): 0x0 (0)
Starting CHS: Cylinder: 0 Head: 0 Sector: 0
Ending CHS: Cylinder: 0 Head: 0 Sector: 0
Size in sectors: 0x0 (0) 

===== Partition Table #4 =====
Boot flag: 0x0 
Partition type: 0x0 (Empty)
Starting Sector (LBA): 0x0 (0)
Starting CHS: Cylinder: 0 Head: 0 Sector: 0
Ending CHS: Cylinder: 0 Head: 0 Sector: 0
Size in sectors: 0x0 (0)

因爲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

相關文章
相關標籤/搜索