catalogue
1. 電腦啟動過程 2. MBR分析(master boot record) - 位於整個硬碟的 0 扇區 3. DBR(DOS boot record) - 位於柱面0,磁頭1,扇區1,即邏輯扇區0(邏輯扇區的第一個扇區) 4. MBR病毒
1. 電腦啟動過程
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: 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功能
1.掃描分割槽表查詢活動分割槽 2.尋找活動分割槽的起始扇區 3.將活動分割槽的引導扇區讀到記憶體 4.執行引導扇區的執行程式碼(啟動作業系統)
如果主引導程式碼未完成這些功能,系統顯示下列錯誤資訊
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