硬盤(pán)解鎖
作者:佚名 文章來(lái)源:本站原創(chuàng) 點(diǎn)擊數(shù): 更新時(shí)間:2012/7/4
核心提示:不知道你是否曾碰到過(guò)從軟盤(pán)和硬盤(pán)都啟動(dòng)不了計(jì)算機(jī)的情形?一般計(jì)算機(jī)的硬盤(pán)分區(qū)表被病毒感染后,若不能啟動(dòng)機(jī)子,通常從軟盤(pán)可以啟動(dòng)。
不知道你是否曾碰到過(guò)從軟盤(pán)和硬盤(pán)都啟動(dòng)不了計(jì)算機(jī)的情形?一般計(jì)算機(jī)的硬盤(pán)分區(qū)表被病毒感染后,若不能啟動(dòng)機(jī)子,通常從軟盤(pán)可以啟動(dòng)。但在嚴(yán)重的情形下,不但從硬盤(pán)不能啟動(dòng)機(jī)子,就是從軟盤(pán)也不能啟動(dòng)。有的惡毒的病毒就能使硬盤(pán)被死鎖。筆者一次在自己機(jī)子上玩弄硬盤(pán)鎖時(shí),就被鎖住過(guò)一次。結(jié)果在硬盤(pán)下選擇DOS或WIN95模式啟動(dòng)機(jī)子都死機(jī),在軟盤(pán)下用DOS啟動(dòng)也死機(jī);在COMS中將硬盤(pán)類型選擇None,雖然可以從軟盤(pán)啟動(dòng),但啟動(dòng)后沒(méi)有硬盤(pán),使用軟盤(pán)上的FDISK命令,想重新分區(qū)或格式化都沒(méi)門(mén)。弄得我一籌莫展。 本來(lái),硬盤(pán)被鎖住時(shí),可以采用3.0以下的DOS版本啟動(dòng)機(jī)子,機(jī)子啟動(dòng)后雖然也不認(rèn)硬盤(pán),但其不認(rèn)的原因在于其管理不了現(xiàn)在的大硬盤(pán),因此可以用Debug修改硬盤(pán)分區(qū)表,修改后可以啟動(dòng)。但在已進(jìn)入WINDOWS的年代,3.0以下的DOS實(shí)難找到,即使找到,你的機(jī)子上恐怕也因沒(méi)有5寸軟驅(qū)而不能使用。因此,最好的辦法是編制一個(gè)程序來(lái)解決這個(gè)問(wèn)題。筆者通過(guò)嘗試和思考,找到一種比較實(shí)用的方法,可以輕松解開(kāi)死鎖的硬盤(pán),當(dāng)然也把自己的硬盤(pán)解開(kāi)了。下面,我將這種方法介紹出來(lái)。
二·硬盤(pán)鎖住原理
硬盤(pán)鎖住通常是對(duì)硬盤(pán)的分區(qū)表做手腳,因此首先應(yīng)該了解硬盤(pán)的分區(qū)表。硬盤(pán)分區(qū)表位于0柱面0磁頭1扇區(qū),這個(gè)扇區(qū)的前面200多個(gè)字節(jié)是主引導(dǎo)程序,后面從01BEH開(kāi)始的64個(gè)字節(jié)是分區(qū)表。分區(qū)表共64字節(jié),分為4欄,每欄16字節(jié),用來(lái)描述一個(gè)分區(qū)。如果是用DOS的FDISK程序分區(qū)后,最多只用兩欄,第一欄描述基本的DOS分區(qū),第二欄描述擴(kuò)展的DOS分區(qū)。
分區(qū)表一欄的結(jié)構(gòu)與各字節(jié)的含義如下:
00H—標(biāo)志活動(dòng)字節(jié),活動(dòng)DOS分區(qū)為80H,其它為00H。
01H—本分區(qū)邏輯0扇區(qū)所在的磁頭號(hào)。
02H—邏輯0扇區(qū)所在柱面中的扇區(qū)號(hào)。
03H—邏輯0扇區(qū)所在的柱面號(hào)。
04H—分區(qū)類型標(biāo)志。
05H—本分區(qū)最后一個(gè)扇區(qū)的磁頭號(hào)。
06H—最后一個(gè)扇區(qū)的扇區(qū)號(hào)。
07H—最后一個(gè)柱面的柱面號(hào)。
08H—硬盤(pán)上在本分區(qū)之前的扇區(qū)總數(shù),用雙字表示。
0CH—本分區(qū)的扇區(qū)總數(shù),從邏輯0扇區(qū)計(jì)數(shù),不含隱藏扇區(qū),用雙字表示。
在上面的介紹中給出的柱面號(hào)與扇區(qū)號(hào)雖然各占一個(gè)字節(jié),但實(shí)際上扇區(qū)號(hào)用6位表示,柱面號(hào)用10位表示,扇區(qū)號(hào)所在字節(jié)的最高兩位實(shí)際上是柱面號(hào)的最高兩位。
分區(qū)表的最后兩個(gè)字節(jié)是分區(qū)表的有效標(biāo)志,如果將其改變,將不能從硬盤(pán)啟動(dòng),這是一種簡(jiǎn)單的鎖住硬盤(pán)的方法。解決的辦法是從軟盤(pán)啟動(dòng),啟動(dòng)后硬盤(pán)仍然可以使用。用Debug或Noratn中的Diskedit軟件將硬盤(pán)該分區(qū)表中的標(biāo)志恢復(fù),則從硬盤(pán)啟動(dòng)也沒(méi)有問(wèn)題了。鎖住硬盤(pán)的另一種方法是對(duì)分區(qū)參數(shù)做手腳,如果將分區(qū)參數(shù)全部變?yōu)?,則啟動(dòng)時(shí)由于找不到分區(qū)參數(shù),從硬盤(pán)是沒(méi)法啟動(dòng),從軟盤(pán)啟動(dòng)后也不認(rèn)硬盤(pán),如果你敲入盤(pán)符C并回車,將出現(xiàn)提示Invalid driver specification。但所幸的是,畢竟可以啟動(dòng)機(jī)子,不認(rèn)硬盤(pán)沒(méi)關(guān)系,在A盤(pán)上用DOS的Debug仍然可以讀出硬盤(pán)0柱面0磁頭1扇區(qū)的內(nèi)容,修改后再寫(xiě)入0柱面0磁頭1扇區(qū),重新啟動(dòng)機(jī)子又沒(méi)問(wèn)題了。如果將分區(qū)表參數(shù)隨意改為其它參數(shù),則有可能不能用可以安裝DOS的DOS系統(tǒng)盤(pán)啟動(dòng),按F3退出后將出現(xiàn)內(nèi)存分配錯(cuò)誤,不能裝載DOS的命令解釋器COMMAND的提示,系統(tǒng)就死機(jī)了,筆者就曾碰見(jiàn)過(guò)這種情形。但用一張格式化成系統(tǒng)盤(pán)的軟盤(pán)則可以順利啟動(dòng),只要有Debug,你仍然可以將分區(qū)表參數(shù)修改回去。可怕的事情是,如果你不幸將分區(qū)表參數(shù)改成一個(gè)循環(huán)鏈,即C盤(pán)的下一個(gè)分區(qū)指向D驅(qū),D驅(qū)的下一個(gè)分區(qū)又指向C區(qū),這樣循環(huán)下去,DOS啟動(dòng)或WIN95啟動(dòng)時(shí)由于無(wú)休止的讀取邏輯驅(qū)動(dòng)器,就只有死機(jī)的份了。這是只要有硬盤(pán)存在,不管你用軟盤(pán)還是硬盤(pán)都沒(méi)法啟動(dòng)機(jī)子了,由于不能啟動(dòng)是由于硬盤(pán)造成的,即使你將硬盤(pán)下到其它計(jì)算機(jī)上,也沒(méi)法使用,這樣硬盤(pán)就徹底被鎖死了,筆者所遭遇就是此情形。不信,你只需將硬盤(pán)0柱面0磁頭1扇區(qū)的1D0H處改為1(如果你的D驅(qū)開(kāi)始柱面號(hào)不夠大,此處本來(lái)就為1),將1D1H處改為0,表示D盤(pán)的開(kāi)始柱面號(hào)跟C盤(pán)一樣,看看你的計(jì)算機(jī)還能不能啟動(dòng),不過(guò)你在沒(méi)有充分的準(zhǔn)備前絕不要試。
一個(gè)完整的硬盤(pán)鎖程序,不過(guò)是重新改寫(xiě)0柱面0磁頭1扇區(qū)的引導(dǎo)程序,并將分區(qū)表破壞或故意制造一個(gè)循環(huán)分區(qū)表,而將真正的硬盤(pán)分區(qū)表參數(shù)和引導(dǎo)程序放在其它隱藏扇區(qū)并保護(hù)起來(lái),如果啟動(dòng)時(shí)口令不對(duì),則不能啟動(dòng)機(jī)子,口令對(duì)了則順利啟動(dòng)。這種硬盤(pán)鎖程序,情形好的還可以用軟盤(pán)啟動(dòng);情形嚴(yán)重的就是連軟盤(pán)也不能啟動(dòng),硬盤(pán)真被鎖住。
三·解開(kāi)硬盤(pán)鎖的程序法
如果硬盤(pán)被鎖死,是否真的就無(wú)法解開(kāi)呢?當(dāng)然不是。看看問(wèn)題的癥結(jié)所在,根源在于DOS中的IO.SYS文件,它包含LOADER、IO1、IO2、IO3四個(gè)模塊,其中IO1中包含有一個(gè)很關(guān)鍵的程序SysInt_I,它在啟動(dòng)中很固執(zhí),非要去讀分區(qū)表,而且不把分區(qū)表讀完誓不罷休。如果碰上分區(qū)表是循環(huán)的,它就只有死機(jī)了。這是DOS的脆弱性和不完備性。其實(shí)這也不能怪DOS,因?yàn)镈OS為了獲得硬盤(pán)使用權(quán),就必需讀分區(qū)表參數(shù),而且DOS還約定驅(qū)動(dòng)器號(hào)不能超過(guò)26,只不過(guò)沒(méi)有考慮到此等循環(huán)分區(qū)表情形。一句話,機(jī)子不能啟動(dòng)不過(guò)是DOS操作系統(tǒng)造成的,如果另寫(xiě)一個(gè)操作系統(tǒng),或許就能啟動(dòng)機(jī)子。當(dāng)然這只是說(shuō)個(gè)笑話。
明白了病因在于DOS,問(wèn)題就好辦了。DOS啟動(dòng)中不是要讀硬盤(pán)分區(qū)表嗎?我不讓你讀分區(qū)表甚至連硬盤(pán)都不讓你讀,不就可以順利啟動(dòng)了。的確是這樣的,解開(kāi)硬盤(pán)鎖的程序?qū)崿F(xiàn)方法就是基于這個(gè)思想形成的。當(dāng)然,這只有從軟盤(pán)啟動(dòng)著手了。
看看計(jì)算機(jī)的啟動(dòng)過(guò)程,上電首先進(jìn)行的多項(xiàng)硬件自測(cè)跟我們沒(méi)有關(guān)系,我們關(guān)心的只是它最開(kāi)始和磁盤(pán)打交道時(shí)是干什么。如果選擇從硬盤(pán)啟動(dòng),則計(jì)算機(jī)和磁盤(pán)最開(kāi)始打交道是將硬盤(pán)0柱面0磁頭1扇區(qū)的內(nèi)容讀入內(nèi)存0000:7C00處并跳到0000:7C00處執(zhí)行;如果選擇從軟盤(pán)啟動(dòng),則計(jì)算機(jī)和磁盤(pán)最開(kāi)始打交道是將A盤(pán)0磁道0磁頭1扇區(qū)的內(nèi)容讀入內(nèi)存0000:7C00處并跳到0000:7C00處執(zhí)行,在執(zhí)行過(guò)程中,計(jì)算機(jī)并不檢查該扇區(qū)的內(nèi)容是什么,只機(jī)械地執(zhí)行讀命令,這使得許多系統(tǒng)型病毒得以生存。但利用這一點(diǎn),恰恰使我們的程序解鎖法有了用武之地。如果我們用DOS格式化一張可以啟動(dòng)機(jī)子的系統(tǒng)軟盤(pán),將該軟盤(pán)的0磁道0磁頭1扇區(qū)的內(nèi)容移到后面的空白扇區(qū)中,而重新寫(xiě)一段程序到該軟盤(pán)的0磁道0磁頭1扇區(qū),這樣用軟盤(pán)啟動(dòng)時(shí)首先執(zhí)行的是我們所寫(xiě)的程序了。在這段程序中,具備這樣一些功能:在DOS啟動(dòng)前搶先攔截INT 13H,駐留高端內(nèi)存并監(jiān)視INT 13H,判斷是否讀硬盤(pán),如果是讀硬盤(pán)就直接返回,這樣就禁止了讀硬盤(pán),也就避免了DOS讀硬盤(pán)循環(huán)分區(qū)表造成的死機(jī);同時(shí)攔截對(duì)軟盤(pán)的讀取,如果讀軟盤(pán)的0磁道0磁頭1扇區(qū),就改成讀真正有引導(dǎo)程序和磁盤(pán)參數(shù)表的扇區(qū),免得DOS在啟動(dòng)中找不到軟盤(pán)的磁盤(pán)參數(shù)表而死機(jī)。完成這些任務(wù)的同時(shí),還要讀取軟盤(pán)真正的引導(dǎo)程序并把控制權(quán)交給它。
該方法可以稱為萬(wàn)能的,因?yàn)樗谟密洷P(pán)啟動(dòng)中,始終不與硬盤(pán)打交道,這樣不管你硬盤(pán)用什么方法加鎖了,對(duì)DOS的啟動(dòng)都沒(méi)有影響。當(dāng)然,這樣啟動(dòng)的機(jī)子是不認(rèn)硬盤(pán)的,但這沒(méi)有關(guān)系。你可在機(jī)子啟動(dòng)后,用Debug調(diào)出駐留高端內(nèi)存的新INT 13H程序,將其改為只有一條直接執(zhí)行舊INT 13H的語(yǔ)句,這樣在Debug下可以用INT 13H讀取硬盤(pán)0柱面0磁頭1扇區(qū)的內(nèi)容,如果你有備份,將分區(qū)表參數(shù)恢復(fù)后再寫(xiě)入0柱面0磁頭1扇區(qū),重新啟動(dòng)計(jì)算機(jī)就可以了。如果實(shí)在沒(méi)有備份,去掉分區(qū)表中的循環(huán)鏈,用正常DOS啟動(dòng)盤(pán)重啟機(jī)子后至少也可以重新對(duì)硬盤(pán)分區(qū),不至于硬盤(pán)被鎖住打不開(kāi)了。
四·程序及說(shuō)明
1·下面是寫(xiě)入軟盤(pán)0磁道0頭1扇區(qū)的源程序key.com,程序用debug輸入。
C>debug
-a100
100 CLI
101 XOR AX,AX
103 MOV DS,AX
105 MOV ES,AX
107 MOV SS,AX
109 MOV AX,7C00
10C MOV SP,AX
10E STI
10F MOV SI,AX
111 MOV DI,7E00
114 CLD
115 MOV CX,0200
118 REPNZ
119 MOVSB
11A JMP 0000:7E1F
11F MOV CX,0003
122 PUSH CX
123 MOV AX,0201;讀啟動(dòng)軟盤(pán)的引導(dǎo)扇區(qū)
126 MOV BX,7C00
129 MOV CX,4F01
12C MOV DX,0100
12F INT 13
131 POP CX
132 DEC CX
133 JNZ 0122
135 MOV AX,[004C];搶先獲取INT 13H的位置
138 MOV [7E88],AX
13B MOV AX,[004E]
13E MOV [7E8A],AX
141 MOV AX,[0413]
144 DEC AX
145 MOV [0413],AX
148 MOV CL,06
14A SHL AX,CL
14C MOV ES,AX
14E XOR AX,AX
150 MOV DS,AX
152 MOV SI,7E6D;復(fù)制改寫(xiě)的INT 13H程序到高端內(nèi)存
155 MOV DI,0000
158 MOV CX,0030
15B REPNZ
015C MOVSB
015D MOV AX,0000;將新INT 13H位置寫(xiě)入中斷向量表
0160 MOV [004C],AX
0163 MOV AX,ES
0165 MOV [004E],AX
0168 JMP 0000:7C00
016D PUSHF;新INT 13H程序
016E CMP DX,0080;是否是硬盤(pán)
0172 JNZ 0176;不是硬盤(pán)則繼續(xù)
0174 POPF
0175 IRET;是硬盤(pán)則直接返回
0176 CMP DX,+00;是否讀軟盤(pán)BOOT區(qū)?
0179 JNZ 0186
017B CMP CX,+01
017E JNZ 0186
0180 MOV CX,4F01;是則讀79磁道1磁頭1扇區(qū)
0183 MOV DX,0100
0186 POPF
0187 JMP 0000:0000;此處跳轉(zhuǎn)去執(zhí)行舊INT 13,
;舊INT 13H的位置由前面程序獲得后寫(xiě)入。
N key.com
RCX
200
W
Q
2·程序的裝載
在進(jìn)行下面工作前,先用DOS格式化一張啟動(dòng)的系統(tǒng)盤(pán),并保證沒(méi)有壞扇區(qū),最好進(jìn)行啟動(dòng)測(cè)試,確保其可以啟動(dòng)機(jī)子。由于現(xiàn)在機(jī)子上大多只有3寸軟驅(qū),因此選擇1.44M的3.5寸軟盤(pán)。然后用debug key.com將程序key.com調(diào)入內(nèi)存偏移地址為100H,同時(shí)在400H處寫(xiě)入一段裝載程序。即:
C>debug key.com
-a400
400 MOV CX,0003
403 PUSH CX
404 MOV AX,0201;將A盤(pán)引導(dǎo)程序讀入內(nèi)存1000H處
407 MOV BX,1000;為確保成功,首次采用重復(fù)讀3次
40A MOV CX,0001
40D MOV DX,0000
410 INT 13
412 POP CX
413 DEC CX
414 JNZ 0403
416 MOV AX,0301;將已讀入內(nèi)存的軟盤(pán)引導(dǎo)程序?qū)懭胲洷P(pán)
419 MOV BX,1000;最后一個(gè)磁道的首扇區(qū)
41C MOV CX,4F01
41F MOV DX,0100
422 INT 13
424 MOV AX,0301;將key.com程序?qū)懭胲洷P(pán)0磁道0磁頭1扇區(qū)
427 MOV BX,0100
42A MOV CX,0001
42D MOV DX,0000
430 INT 13
432 INT 3
為保證萬(wàn)無(wú)一失,最好將軟盤(pán)這兩個(gè)扇區(qū)的內(nèi)容重新讀出來(lái)看一看,以保證寫(xiě)成功了。做好這一切,保險(xiǎn)的還是進(jìn)行一次測(cè)試,即用該軟盤(pán)啟動(dòng)一次機(jī)子,看能否成功,若成功啟動(dòng),你就可以用循環(huán)分區(qū)表法鎖住硬盤(pán),看從正常DOS下能否啟動(dòng),然后再用此軟盤(pán)啟動(dòng)機(jī)子試試,看看功效如何?
從該軟盤(pán)啟動(dòng)后,不認(rèn)硬盤(pán),并且在高端內(nèi)存駐留了新INT 13H程序,該段程序?qū)嶋H上是key.com中從16D到187部分。由于有此段程序存在,在debug下也無(wú)法讀硬盤(pán),也就沒(méi)法恢復(fù)硬盤(pán)分區(qū)表,因此機(jī)子啟動(dòng)后首先應(yīng)修改這段程序。現(xiàn)在的機(jī)子基本內(nèi)存通常都為640K,這樣這段程序就位于內(nèi)存中9FC0:0000處,在debug下,用U9FC0:0顯示這段程序,可以看到位于9FC0:001A處是一條跳轉(zhuǎn)指令,該跳轉(zhuǎn)指令即轉(zhuǎn)去執(zhí)行最原始的INT 13H。由于BIOS版本不一樣,跳轉(zhuǎn)指令指向的位置可能不一樣,如筆者機(jī)子上是一條JMP F000:A5D4語(yǔ)句。這時(shí)在在debug下編寫(xiě)這樣一語(yǔ)句:a9FC0:0 JMP F000:A5D4。這樣,對(duì)硬盤(pán)的禁寫(xiě)與禁讀都不再起作用了,在debug下用INT 13H的2號(hào)子功能可以讀出硬盤(pán)分區(qū)表,修改恢復(fù)后再用3號(hào)子功能將數(shù)據(jù)寫(xiě)回分區(qū)表。退出debug,重新用正常DOS啟動(dòng)計(jì)算機(jī),就可以了。
附帶提一下,在正常DOS下,該軟盤(pán)由于沒(méi)有BOOT區(qū),也就沒(méi)有磁盤(pán)參數(shù)表,從而不能使用,用DIR A:命令會(huì)出現(xiàn)General failure reading drive A提示。不要理睬它,這并不影響它作特殊啟動(dòng)盤(pán)。
五·建議
為更好的保護(hù)你的硬盤(pán),筆者建議你最好將你的硬盤(pán)分區(qū)表信息備份起來(lái)。備份有兩種方式,一種是以文件形式將硬盤(pán)每個(gè)邏輯盤(pán)的分區(qū)信息存儲(chǔ)起來(lái);另另一種是將分區(qū)信息備份在硬盤(pán)隱藏扇區(qū)里。比如可以將0柱面0磁頭1扇區(qū)備份在0柱面0磁頭3扇區(qū),將D盤(pán)開(kāi)始柱面號(hào)0磁頭1扇區(qū)備份在該柱面0磁頭3扇區(qū),其它邏輯盤(pán)也如此。這種方法簡(jiǎn)單、方便,也很可靠。用NORTAN中的DISKEDI很容易操作和實(shí)現(xiàn)。有了備份分區(qū)表信息,就不怕破壞分區(qū)表的病毒了;再加上我給你的程序,即使有人真鎖住了你的硬盤(pán),你也可以輕而易舉解開(kāi)了。