硬盤MBR全面分析
作者:佚名 文章來源:本站原創(chuàng) 點擊數: 更新時間:2012/6/20
核心提示:
在分析MBR的結構之前,先有來看看計算機的引導順序(SystemBootSequence)
Step1.內部電源打開,初始化,等待一小段時間用來產生穩(wěn)定的電流。如果主板芯片和CPU收到了不符合規(guī)定的電流,將自動產生一個RESET信號。在主板沒有收到電源的PowerGood信號之前,重復步驟1。
Step2.執(zhí)行BIOS中0FFF0h處的代碼。這里只有一條JMP指令,將跳轉到真正的BIOS啟動程序處。
Step3.BIOS開始加電自檢(Power-OnSelfTest,POST),如果出現錯誤,啟動停止。成功的話執(zhí)行INT19h(SYSTEM-BOOTSTRAPLOADER)
Step4.BIOS開始尋找顯卡,找到的話將執(zhí)行顯卡的BIOS。接著顯卡初始化,將顯示一段顯卡信息,我們開機看到的第一屏就是它。
Step5.BIOS開始執(zhí)行所有其他設備的BIOS,包括軟驅,硬盤等。
Step6.BIOS顯示啟動信息
Step7.BIOS開始額外的檢測。一般有內存檢測,如果內存有問題,將顯示錯誤消息。
Step8.BIOS探測所有的硬件,將顯示如硬盤/光區(qū)信息等
Step9.BIOS給出一個已知硬件的列表
Step10.BIOS按照設置的驅動器順序找驅動器,如果驅動器存在的話繼續(xù)找啟動扇區(qū),軟驅/硬盤的啟動扇區(qū)都在0柱0頭1扇區(qū)(cylinder0,head0,sector1)
Step11.將啟動扇區(qū)讀到內存0000:7c00處,接著INT19h開始執(zhí)行0000:7c00處代碼
Step12.如果找不到驅動器,系統(tǒng)顯示錯誤信息并停止。通常是"Nobootdevice"或"NOROMBASIC-SYSTEMHALTED"
上面是冷啟動的過程,熱啟動將從步驟8開始
磁盤的啟動扇區(qū)就是主引導記錄(MasterBootRecord),包括0柱0頭1扇區(qū)的512個字節(jié),它的任務是完成BIOS到操作系統(tǒng)的交接。
MBR的大體結構:
偏移內容
0000MBR程序代碼
01BE分區(qū)表
01FE結束標志
分區(qū)表結構
BYTE
1如果是引導分區(qū),就是80H,如果不是,就是00H
2-4是該分區(qū)的起始扇區(qū)號
5標志字節(jié),比如05表示擴展分區(qū)
6-8該分區(qū)的終止扇區(qū)號
9-12該分區(qū)已使用的扇區(qū)數
13-16該分區(qū)總共占用的扇區(qū)數
這是從我的硬盤上提取的MBR(硬盤是Maxtor的金鉆20G,netfay的電腦早過時了:P),不同型號的硬盤MBR稍有不同,不過功能都是一樣的
000033C08ED0BC007CFB-5007501FFCBE1B7C3.....|.P.P....|
0010BF1B065057B9E501-F3A4CBBEBE07B104...PW...........
0020382C7C09751583C6-10E2F5CD188B148B8,|.u...........
0030EE83C61049741638-2C74F6BE10074EAC....It.8,t....N.
00403C0074FABB0700B4-0ECD10EBF2894625<.t...........F
0050968A4604B4063C0E-7411B40B3C0C7405..F...<.t...<.t.
00603AC4752B40C64625-067524BBAA5550B4:.u @.F.u$..UP.
007041CD1358721681FB-55AA7510F6C10174A..Xr...U.u....t
00800B8AE0885624C706-A106EB1E886604BF....V$.......f..
00900A00B801028BDC33-C983FF057F038B4E.......3.......N
00A025034E02CD137229-BE5907813EFE7D55.N...r).Y..>.}U
00B0AA745A83EF057FDA-85F67583BE2E07EB.tZ.......u.....
00C08A98915299034608-13560AE812005AEB...R..F..V....Z.
00D0D54F74E433C0CD13-EBB8000080081016.Ot.3...........
00E05633F65656525006-5351BE1000568BF4V3.VVRP.SQ...V..
00F05052B800428A5624-CD135A588D641072PR..B.V$..ZX.d.r
01000A4075014280C702-E2F7F85EC3EB74B7.@u.B......^..t.
0110D6C7F8B1EDCEDED0-A7A1A3B0B2D7B0B3................
0120CCD0F2CEDEB7A8BC-CCD0F8A1A300BCD3................
0130D4D8B2D9D7F7CFB5-CDB3CAB1B3F6CFD6................
0140B4EDCEF3A1A3B0B2-D7B0B3CCD0F2CEDE................
0150B7A8BCCCD0F8A1A3-00C8B1C9D9B2D9D7................
0160F7CFB5CDB3000000-0000000000000000................
01700000000000000000-0000000000000000................
01800000008BFC1E578B-F5CB000000000000......W.........
01900000000000000000-0000000000000000................
01A00000000000000000-0000000000000000................
01B000000000002C4463-B5D7B5D700008001.....,Dc........
01C001000BFE7FFD3F00-00003F047D000000......?...?.}...
01D041FE0CFEFFFF7E04-7D007D9BE5010000A.....~.}.}.....
01E00000000000000000-0000000000000000................
01F00000000000000000-00000000000055AA..............U.
由于程序代碼從0000:7C00開始,下面看反編譯的結果(經過修改)
7C0033C0XORAX,AX;AX=0
7C028ED0MOVSS,AX;SS=0
7C04BC007CMOVSP,7C00;SP=7C00
7C07FBSTI;中斷允許
7C0850PUSHAX
7C0907POPES;ES=0
7C0A50PUSHAX
7C0B1FPOPDS;DS=0
7C0CFCCLD;字符串操作方向:從低到高
7C0DBE1B7CMOVSI,7C1B;源地址DS:SI=0000:7C1B
7C10BF1B06MOVDI,061B;目的地址ES:DI=0000:061B
7C1350PUSHAX
7C1457PUSHDI
7C15B9E501MOVCX,01E5;共1E5h個字節(jié)
7C18F3REPZ
7C19A4MOVSB;將MBR從0000:7C00移動到0000:0600
7C1ACBRETF;跳轉到0000:061B處
PARTITION_SEARCH_LOOP:
061BBEBE07MOVSI,07BE;SI指向分區(qū)表的開始
061EB104MOVCL,04;循環(huán)4次,硬盤最多4個主分區(qū)
0620382CCMP[SI],CH
06227C09JLACTIVE_PARTITION_FOUND
;分區(qū)是活動分區(qū)
06247515JNZINVALID_PARTITION_TABLE
;無效的分區(qū)表
062683C610ADDSI, 10;每個分區(qū)占用16個字節(jié),SI指向下一個分區(qū)
0629E2F5LOOPPARTITION_SEARCH_LOOP
062BCD18INT18;分區(qū)表搜索完,無活動分區(qū),INT18h=DISKLESSBOOTHOOK
ACTIVE_PARTITON_FOUND:
062D8B14MOVDX,[SI];下面的搜索保證只存在一個活動分區(qū),否則分區(qū)表無效
062F8BEEMOVBP,SI;找到的引導分區(qū)標志和開始地址分別存入DX,BP
ONLY_ONE_ACTIVE_PARTITON_SEARCH_LOOP:
063183C610ADDSI, 10
063449DECCX
06357416JZGOOD_PARTITION_TABLE;搜索完畢,剩下的分區(qū)中無活動分區(qū),分區(qū)表正常
0637382CCMP[SI],CH
063974F6JZONLY_ONE_ACTIVE_PARTITON_SEARCH_LOOP;如果還有活動分區(qū)則繼續(xù)向下執(zhí)行
INVALID_PARTITION_TABLE:
063BBE1007MOVSI,0710;SI指向要顯示的錯誤信息處
HANG_MACHINE_LOOP:
063E4EDECSI
DISPLAY_ERROR_MESSAGE_LOOP:
063FACLODSB
06403C00CMPAL,00
064274FAJZHANG_MACHINE_LOOP
;到字符串尾時進入死循環(huán),停止運行
0644BB0700MOVBX,0007
0647B40EMOVAH,0E
0649CD10INT10;顯示錯誤信息
DISPLAY_ERROR_MESSAGE_LOOP_ALIAS:
064BEBF2JMPDISPLAY_ERROR_MESSAGE_LOOP
GOOD_PARTITION_TABLE:
064D894625MOV[BP 25],AX
;tmpvar=BP 25處清零,作為臨時變量
065096XCHGSI,AX;SI=0
06518A4604MOVAL,[BP 04]
;讀分區(qū)類型入AL
0654B406MOVAH,06
06563C0ECMPAL,0E;類型WIN95:DOS16-bitFAT,LBA-mapped
06587411JZTYPE_WIN95_DOS_16BIT_FAT_LBA
065AB40BMOVAH,0B
065C3C0CCMPAL,0C;類型WIN95OSR232-bitFAT,LBA-mapped
065E7405JZTYPE_WIN95_OSR2_32BIT_FAT_LBA
06603AC4CMPAL,AH;類型WIN95OSR232-bitFAT
0662752BJNZTYPE_DEFAULT
066440INCAX;AX=0B0C
TYPE_WIN95_OSR2_32BIT_FAT_LBA:
0665C6462506MOVBYTEPTR[BP 25],06
;tmpvar=06
06697524JNZTYPE_DEFAULT
;這里有點問題,這個轉移應該肯定不成立?
TYPE_WIN95_DOS_16BIT_FAT_LBA:
066BBBAA55MOVBX,55AA
066E50PUSHAX
066FB441MOVAH,41
0671CD13INT13;int13h擴展功能的檢測,IBM/MSINT13Extensions-INSTALLATIONCHECK
067358POPAX
06747216JBINT13H_EXTENSION_UNSUPPORTED
;CF=1-不支持int13h擴展功能
067681FB55AACMPBX,AA55;BX不為AA55-不支持int13h擴展功能
067A7510JNZINT13H_EXTENSION_UNSUPPORTED
067CF6C101TESTCL,01;CL不為1-不支持int13h擴展功能
067F740BJZINT13H_EXTENSION_UNSUPPORTED
06818AE0MOVAH,AL;AH=0E
0683885624MOV[BP 24],DL
;tmpvar=DL,引導分區(qū)標志
0686C706A106EB1EMOVWORDPTR[06A1],1EEB
;改06A1處指令為PUSHDS;JMPNEW_LOCATION_1
INT13H_EXTENSION_UNSUPPORTED:
068C886604MOV[BP 04],AH
;如果支持的話置分區(qū)類型為0E(類型WIN95:DOS16-bitFAT,LBA-mapped)
;否則為06(類型DOS3.31 16-bitFATover32M)
TYPE_DEFAULT:
068FBF0A00MOVDI,000A
READ_SECTOR_LOOP:
0692B80102MOVAX,0201
06958BDCMOVBX,SP;BX設置為7C00
069733C9XORCX,CX;CX=0
069983FF05CMPDI, 05
069C7F03JGNEW_LOCATION_0
069E8B4E25MOVCX,[BP 25]
NEW_LOCATION_0:
06A1034E02ADDCX,[BP 02]
06A4CD13INT13;將活動分區(qū)的起始扇區(qū)讀到0000:7C00
NEW_LOCATION_1:
06A67229JBREAD_SECTOR_ERROR
;CF=1-錯誤
06A8BE5907MOVSI,0759
06AB813EFE7D55AACMPWORDPTR[7DFE],AA55
;扇區(qū)結束標志是否正確?
06B1745AJZREAD_SECTOR_SUCCEEDED
;正確
06B383EF05SUBDI, 05;DI=DI-5
06B67FDAJGREAD_SECTOR_LOOP
06B885F6TESTSI,SI
06BA7583JNZDISPLAY_ERROR_MESSAGE_LOOP:
;顯示錯誤信息:缺少操作系統(tǒng)
06BCBE2E07MOVSI,072E
06BFEB8AJMPDISPLAY_ERROR_MESSAGE_LOOP_ALIAS
;顯示錯誤信息:加載操作系統(tǒng)時發(fā)生錯誤。
070DEB74JMPCONTINUE_KOAD_OS
07838BFCMOVDI,SP
;DI=7C00
07851EPUSHDS
078657PUSHDI
07878BF5MOVSI,BP
0789CBRETF;轉到執(zhí)行0000:7C00處的語句,即操作系統(tǒng)的引導程序
Step1.內部電源打開,初始化,等待一小段時間用來產生穩(wěn)定的電流。如果主板芯片和CPU收到了不符合規(guī)定的電流,將自動產生一個RESET信號。在主板沒有收到電源的PowerGood信號之前,重復步驟1。
Step2.執(zhí)行BIOS中0FFF0h處的代碼。這里只有一條JMP指令,將跳轉到真正的BIOS啟動程序處。
Step3.BIOS開始加電自檢(Power-OnSelfTest,POST),如果出現錯誤,啟動停止。成功的話執(zhí)行INT19h(SYSTEM-BOOTSTRAPLOADER)
Step4.BIOS開始尋找顯卡,找到的話將執(zhí)行顯卡的BIOS。接著顯卡初始化,將顯示一段顯卡信息,我們開機看到的第一屏就是它。
Step5.BIOS開始執(zhí)行所有其他設備的BIOS,包括軟驅,硬盤等。
Step6.BIOS顯示啟動信息
Step7.BIOS開始額外的檢測。一般有內存檢測,如果內存有問題,將顯示錯誤消息。
Step8.BIOS探測所有的硬件,將顯示如硬盤/光區(qū)信息等
Step9.BIOS給出一個已知硬件的列表
Step10.BIOS按照設置的驅動器順序找驅動器,如果驅動器存在的話繼續(xù)找啟動扇區(qū),軟驅/硬盤的啟動扇區(qū)都在0柱0頭1扇區(qū)(cylinder0,head0,sector1)
Step11.將啟動扇區(qū)讀到內存0000:7c00處,接著INT19h開始執(zhí)行0000:7c00處代碼
Step12.如果找不到驅動器,系統(tǒng)顯示錯誤信息并停止。通常是"Nobootdevice"或"NOROMBASIC-SYSTEMHALTED"
上面是冷啟動的過程,熱啟動將從步驟8開始
磁盤的啟動扇區(qū)就是主引導記錄(MasterBootRecord),包括0柱0頭1扇區(qū)的512個字節(jié),它的任務是完成BIOS到操作系統(tǒng)的交接。
MBR的大體結構:
偏移內容
0000MBR程序代碼
01BE分區(qū)表
01FE結束標志
分區(qū)表結構
BYTE
1如果是引導分區(qū),就是80H,如果不是,就是00H
2-4是該分區(qū)的起始扇區(qū)號
5標志字節(jié),比如05表示擴展分區(qū)
6-8該分區(qū)的終止扇區(qū)號
9-12該分區(qū)已使用的扇區(qū)數
13-16該分區(qū)總共占用的扇區(qū)數
這是從我的硬盤上提取的MBR(硬盤是Maxtor的金鉆20G,netfay的電腦早過時了:P),不同型號的硬盤MBR稍有不同,不過功能都是一樣的
000033C08ED0BC007CFB-5007501FFCBE1B7C3.....|.P.P....|
0010BF1B065057B9E501-F3A4CBBEBE07B104...PW...........
0020382C7C09751583C6-10E2F5CD188B148B8,|.u...........
0030EE83C61049741638-2C74F6BE10074EAC....It.8,t....N.
00403C0074FABB0700B4-0ECD10EBF2894625<.t...........F
0050968A4604B4063C0E-7411B40B3C0C7405..F...<.t...<.t.
00603AC4752B40C64625-067524BBAA5550B4:.u @.F.u$..UP.
007041CD1358721681FB-55AA7510F6C10174A..Xr...U.u....t
00800B8AE0885624C706-A106EB1E886604BF....V$.......f..
00900A00B801028BDC33-C983FF057F038B4E.......3.......N
00A025034E02CD137229-BE5907813EFE7D55.N...r).Y..>.}U
00B0AA745A83EF057FDA-85F67583BE2E07EB.tZ.......u.....
00C08A98915299034608-13560AE812005AEB...R..F..V....Z.
00D0D54F74E433C0CD13-EBB8000080081016.Ot.3...........
00E05633F65656525006-5351BE1000568BF4V3.VVRP.SQ...V..
00F05052B800428A5624-CD135A588D641072PR..B.V$..ZX.d.r
01000A4075014280C702-E2F7F85EC3EB74B7.@u.B......^..t.
0110D6C7F8B1EDCEDED0-A7A1A3B0B2D7B0B3................
0120CCD0F2CEDEB7A8BC-CCD0F8A1A300BCD3................
0130D4D8B2D9D7F7CFB5-CDB3CAB1B3F6CFD6................
0140B4EDCEF3A1A3B0B2-D7B0B3CCD0F2CEDE................
0150B7A8BCCCD0F8A1A3-00C8B1C9D9B2D9D7................
0160F7CFB5CDB3000000-0000000000000000................
01700000000000000000-0000000000000000................
01800000008BFC1E578B-F5CB000000000000......W.........
01900000000000000000-0000000000000000................
01A00000000000000000-0000000000000000................
01B000000000002C4463-B5D7B5D700008001.....,Dc........
01C001000BFE7FFD3F00-00003F047D000000......?...?.}...
01D041FE0CFEFFFF7E04-7D007D9BE5010000A.....~.}.}.....
01E00000000000000000-0000000000000000................
01F00000000000000000-00000000000055AA..............U.
由于程序代碼從0000:7C00開始,下面看反編譯的結果(經過修改)
7C0033C0XORAX,AX;AX=0
7C028ED0MOVSS,AX;SS=0
7C04BC007CMOVSP,7C00;SP=7C00
7C07FBSTI;中斷允許
7C0850PUSHAX
7C0907POPES;ES=0
7C0A50PUSHAX
7C0B1FPOPDS;DS=0
7C0CFCCLD;字符串操作方向:從低到高
7C0DBE1B7CMOVSI,7C1B;源地址DS:SI=0000:7C1B
7C10BF1B06MOVDI,061B;目的地址ES:DI=0000:061B
7C1350PUSHAX
7C1457PUSHDI
7C15B9E501MOVCX,01E5;共1E5h個字節(jié)
7C18F3REPZ
7C19A4MOVSB;將MBR從0000:7C00移動到0000:0600
7C1ACBRETF;跳轉到0000:061B處
PARTITION_SEARCH_LOOP:
061BBEBE07MOVSI,07BE;SI指向分區(qū)表的開始
061EB104MOVCL,04;循環(huán)4次,硬盤最多4個主分區(qū)
0620382CCMP[SI],CH
06227C09JLACTIVE_PARTITION_FOUND
;分區(qū)是活動分區(qū)
06247515JNZINVALID_PARTITION_TABLE
;無效的分區(qū)表
062683C610ADDSI, 10;每個分區(qū)占用16個字節(jié),SI指向下一個分區(qū)
0629E2F5LOOPPARTITION_SEARCH_LOOP
062BCD18INT18;分區(qū)表搜索完,無活動分區(qū),INT18h=DISKLESSBOOTHOOK
ACTIVE_PARTITON_FOUND:
062D8B14MOVDX,[SI];下面的搜索保證只存在一個活動分區(qū),否則分區(qū)表無效
062F8BEEMOVBP,SI;找到的引導分區(qū)標志和開始地址分別存入DX,BP
ONLY_ONE_ACTIVE_PARTITON_SEARCH_LOOP:
063183C610ADDSI, 10
063449DECCX
06357416JZGOOD_PARTITION_TABLE;搜索完畢,剩下的分區(qū)中無活動分區(qū),分區(qū)表正常
0637382CCMP[SI],CH
063974F6JZONLY_ONE_ACTIVE_PARTITON_SEARCH_LOOP;如果還有活動分區(qū)則繼續(xù)向下執(zhí)行
INVALID_PARTITION_TABLE:
063BBE1007MOVSI,0710;SI指向要顯示的錯誤信息處
HANG_MACHINE_LOOP:
063E4EDECSI
DISPLAY_ERROR_MESSAGE_LOOP:
063FACLODSB
06403C00CMPAL,00
064274FAJZHANG_MACHINE_LOOP
;到字符串尾時進入死循環(huán),停止運行
0644BB0700MOVBX,0007
0647B40EMOVAH,0E
0649CD10INT10;顯示錯誤信息
DISPLAY_ERROR_MESSAGE_LOOP_ALIAS:
064BEBF2JMPDISPLAY_ERROR_MESSAGE_LOOP
GOOD_PARTITION_TABLE:
064D894625MOV[BP 25],AX
;tmpvar=BP 25處清零,作為臨時變量
065096XCHGSI,AX;SI=0
06518A4604MOVAL,[BP 04]
;讀分區(qū)類型入AL
0654B406MOVAH,06
06563C0ECMPAL,0E;類型WIN95:DOS16-bitFAT,LBA-mapped
06587411JZTYPE_WIN95_DOS_16BIT_FAT_LBA
065AB40BMOVAH,0B
065C3C0CCMPAL,0C;類型WIN95OSR232-bitFAT,LBA-mapped
065E7405JZTYPE_WIN95_OSR2_32BIT_FAT_LBA
06603AC4CMPAL,AH;類型WIN95OSR232-bitFAT
0662752BJNZTYPE_DEFAULT
066440INCAX;AX=0B0C
TYPE_WIN95_OSR2_32BIT_FAT_LBA:
0665C6462506MOVBYTEPTR[BP 25],06
;tmpvar=06
06697524JNZTYPE_DEFAULT
;這里有點問題,這個轉移應該肯定不成立?
TYPE_WIN95_DOS_16BIT_FAT_LBA:
066BBBAA55MOVBX,55AA
066E50PUSHAX
066FB441MOVAH,41
0671CD13INT13;int13h擴展功能的檢測,IBM/MSINT13Extensions-INSTALLATIONCHECK
067358POPAX
06747216JBINT13H_EXTENSION_UNSUPPORTED
;CF=1-不支持int13h擴展功能
067681FB55AACMPBX,AA55;BX不為AA55-不支持int13h擴展功能
067A7510JNZINT13H_EXTENSION_UNSUPPORTED
067CF6C101TESTCL,01;CL不為1-不支持int13h擴展功能
067F740BJZINT13H_EXTENSION_UNSUPPORTED
06818AE0MOVAH,AL;AH=0E
0683885624MOV[BP 24],DL
;tmpvar=DL,引導分區(qū)標志
0686C706A106EB1EMOVWORDPTR[06A1],1EEB
;改06A1處指令為PUSHDS;JMPNEW_LOCATION_1
INT13H_EXTENSION_UNSUPPORTED:
068C886604MOV[BP 04],AH
;如果支持的話置分區(qū)類型為0E(類型WIN95:DOS16-bitFAT,LBA-mapped)
;否則為06(類型DOS3.31 16-bitFATover32M)
TYPE_DEFAULT:
068FBF0A00MOVDI,000A
READ_SECTOR_LOOP:
0692B80102MOVAX,0201
06958BDCMOVBX,SP;BX設置為7C00
069733C9XORCX,CX;CX=0
069983FF05CMPDI, 05
069C7F03JGNEW_LOCATION_0
069E8B4E25MOVCX,[BP 25]
NEW_LOCATION_0:
06A1034E02ADDCX,[BP 02]
06A4CD13INT13;將活動分區(qū)的起始扇區(qū)讀到0000:7C00
NEW_LOCATION_1:
06A67229JBREAD_SECTOR_ERROR
;CF=1-錯誤
06A8BE5907MOVSI,0759
06AB813EFE7D55AACMPWORDPTR[7DFE],AA55
;扇區(qū)結束標志是否正確?
06B1745AJZREAD_SECTOR_SUCCEEDED
;正確
06B383EF05SUBDI, 05;DI=DI-5
06B67FDAJGREAD_SECTOR_LOOP
06B885F6TESTSI,SI
06BA7583JNZDISPLAY_ERROR_MESSAGE_LOOP:
;顯示錯誤信息:缺少操作系統(tǒng)
06BCBE2E07MOVSI,072E
06BFEB8AJMPDISPLAY_ERROR_MESSAGE_LOOP_ALIAS
;顯示錯誤信息:加載操作系統(tǒng)時發(fā)生錯誤。
070DEB74JMPCONTINUE_KOAD_OS
07838BFCMOVDI,SP
;DI=7C00
07851EPUSHDS
078657PUSHDI
07878BF5MOVSI,BP
0789CBRETF;轉到執(zhí)行0000:7C00處的語句,即操作系統(tǒng)的引導程序