解開硬碟邏輯死鎖的一種有效方法 (轉貼) (10千字)
一・序言
不知道你是否曾碰到過從軟盤和硬碟都啟動不了計算機的情形?一般計算機的硬碟分割槽表被病毒感染後,若不能啟動機子,通常從軟盤可以啟動。但在嚴重的情形下,不但從硬碟不能啟動機子,就是從軟盤也不能啟動。有的惡毒的病毒就能使硬碟被死鎖。筆者一次在自己機子上玩弄硬碟鎖時,就被鎖住過一次。結果在硬碟下選擇DOS或WIN95模式啟動機子都當機,在軟盤下用DOS啟動也當機;在COMS中將硬碟型別選擇None,雖然可以從軟盤啟動,但啟動後沒有硬碟,使用軟盤上的FDISK命令,想重新分割槽或格式化都沒門。弄得我一籌莫展。
本來,硬碟被鎖住時,可以採用3.0以下的DOS版本啟動機子,機子啟動後雖然也不認硬碟,但其不認的原因在於其管理不了現在的大硬碟,因此可以用Debug修改硬碟分割槽表,修改後可以啟動。但在已進入WINDOWS的年代,3.0以下的DOS實難找到,即使找到,你的機子上恐怕也因沒有5寸軟碟機而不能使用。因此,最好的辦法是編制一個程式來解決這個問題。筆者透過嘗試和思考,找到一種比較實用的方法,可以輕鬆解開死鎖的硬碟,當然也把自己的硬碟解開了。下面,我將這種方法介紹出來。
二・硬碟鎖住原理
硬碟鎖住通常是對硬碟的分割槽表做手腳,因此首先應該瞭解硬碟的分割槽表。硬碟分割槽表位於0柱面0磁頭1扇區,這個扇區的前面200多個位元組是主載入程式,後面從01BEH開始的64個位元組是分割槽表。分割槽表共64位元組,分為4欄,每欄16位元組,用來描述一個分割槽。如果是用DOS的FDISK程式分割槽後,最多隻用兩欄,第一欄描述基本的DOS分割槽,第二欄描述擴充套件的DOS分割槽。
分割槽表一欄的結構與各位元組的含義如下:
00H―標誌活動位元組,活動DOS分割槽為80H,其它為00H。
01H―本分割槽邏輯0扇區所在的磁頭號。
02H―邏輯0扇區所在柱面中的扇區號。
03H―邏輯0扇區所在的柱面號。
04H―分割槽型別標誌。
05H―本分割槽最後一個扇區的磁頭號。
06H―最後一個扇區的扇區號。
07H―最後一個柱面的柱面號。
08H―硬碟上在本分割槽之前的扇區總數,用雙字表示。
0CH―本分割槽的扇區總數,從邏輯0扇區計數,不含隱藏扇區,用雙字表示。
在上面的介紹中給出的柱面號與扇區號雖然各佔一個位元組,但實際上扇區號用6位表示,柱面號用10位表示,扇區號所在位元組的最高兩位實際上是柱面號的最高兩位。
分割槽表的最後兩個位元組是分割槽表的有效標誌,如果將其改變,將不能從硬碟啟動,這是一種簡單的鎖住硬碟的方法。解決的辦法是從軟盤啟動,啟動後硬碟仍然可以使用。用Debug或Noratn中的Diskedit軟體將硬碟該分割槽表中的標誌恢復,則從硬碟啟動也沒有問題了。鎖住硬碟的另一種方法是對分割槽引數做手腳,如果將分割槽引數全部變為0,則啟動時由於找不到分割槽引數,從硬碟是沒法啟動,從軟盤啟動後也不認硬碟,如果你敲入磁碟機代號C並回車,將出現提示Invalid
driver specification。但所幸的是,畢竟可以啟動機子,不認硬碟沒關係,在A盤上用DOS的Debug仍然可以讀出硬碟0柱面0磁頭1扇區的內容,修改後再寫入0柱面0磁頭1扇區,重新啟動機子又沒問題了。如果將分割槽表引數隨意改為其它引數,則有可能不能用可以安裝DOS的DOS系統盤啟動,按F3退出後將出現記憶體分配錯誤,不能裝載DOS的命令直譯器COMMAND的提示,系統就當機了,筆者就曾碰見過這種情形。但用一張格式化成系統盤的軟盤則可以順利啟動,只要有Debug,你仍然可以將分割槽表引數修改回去。可怕的事情是,如果你不幸將分割槽表引數改成一個迴圈鏈,即C盤的下一個分割槽指向D驅,D驅的下一個分割槽又指向C區,這樣迴圈下去,DOS啟動或WIN95啟動時由於無休止的讀取邏輯驅動器,就只有當機的份了。這是隻要有硬碟存在,不管你用軟盤還是硬碟都沒法啟動機子了,由於不能啟動是由於硬碟造成的,即使你將硬碟下到其它計算機上,也沒法使用,這樣硬碟就徹底被鎖死了,筆者所遭遇就是此情形。不信,你只需將硬碟0柱面0磁頭1扇區的1D0H處改為1(如果你的D驅開始柱面號不夠大,此處本來就為1),將1D1H處改為0,表示D盤的開始柱面號跟C盤一樣,看看你的計算機還能不能啟動,不過你在沒有充分的準備前絕不要試。
一個完整的硬碟鎖程式,不過是重新改寫0柱面0磁頭1扇區的載入程式,並將分割槽表破壞或故意製造一個迴圈分割槽表,而將真正的硬碟分割槽表引數和載入程式放在其它隱藏扇區並保護起來,如果啟動時口令不對,則不能啟動機子,口令對了則順利啟動。這種硬碟鎖程式,情形好的還可以用軟盤啟動;情形嚴重的就是連軟盤也不能啟動,硬碟真被鎖住。
三・解開硬碟鎖的程式法
如果硬碟被鎖死,是否真的就無法解開呢?當然不是。看看問題的癥結所在,根源在於DOS中的IO.SYS檔案,它包含LOADER、IO1、IO2、IO3四個模組,其中IO1中包含有一個很關鍵的程式SysInt_I,它在啟動中很固執,非要去讀分割槽表,而且不把分割槽表讀完誓不罷休。如果碰上分割槽表是迴圈的,它就只有當機了。這是DOS的脆弱性和不完備性。其實這也不能怪DOS,因為DOS為了獲得硬碟使用權,就必需讀分割槽表引數,而且DOS還約定驅動器號不能超過26,只不過沒有考慮到此等迴圈分割槽表情形。一句話,機子不能啟動不過是DOS作業系統造成的,如果另寫一個作業系統,或許就能啟動機子。當然這只是說個笑話。
明白了病因在於DOS,問題就好辦了。DOS啟動中不是要讀硬碟分割槽表嗎?我不讓你讀分割槽表甚至連硬碟都不讓你讀,不就可以順利啟動了。的確是這樣的,解開硬碟鎖的程式實現方法就是基於這個思想形成的。當然,這隻有從軟盤啟動著手了。
看看計算機的啟動過程,上電首先進行的多項硬體自測跟我們沒有關係,我們關心的只是它最開始和磁碟打交道時是幹什麼。如果選擇從硬碟啟動,則計算機和磁碟最開始打交道是將硬碟0柱面0磁頭1扇區的內容讀入記憶體0000:7C00處並跳到0000:7C00處執行;如果選擇從軟盤啟動,則計算機和磁碟最開始打交道是將A盤0磁軌0磁頭1扇區的內容讀入記憶體0000:7C00處並跳到0000:7C00處執行,在執行過程中,計算機並不檢查該扇區的內容是什麼,只機械地執行讀命令,這使得許多系統型病毒得以生存。但利用這一點,恰恰使我們的程式解鎖法有了用武之地。如果我們用DOS格式化一張可以啟動機子的系統軟盤,將該軟盤的0磁軌0磁頭1扇區的內容移到後面的空白扇區中,而重新寫一段程式到該軟盤的0磁軌0磁頭1扇區,這樣用軟盤啟動時首先執行的是我們所寫的程式了。在這段程式中,具備這樣一些功能:在DOS啟動前搶先攔截INT
13H,駐留高階記憶體並監視INT 13H,判斷是否讀硬碟,如果是讀硬碟就直接返回,這樣就禁止了讀硬碟,也就避免了DOS讀硬碟迴圈分割槽表造成的當機;同時攔截對軟盤的讀取,如果讀軟盤的0磁軌0磁頭1扇區,就改成讀真正有載入程式和磁碟參數列的扇區,免得DOS在啟動中找不到軟盤的磁碟參數列而當機。完成這些任務的同時,還要讀取軟盤真正的載入程式並把控制權交給它。
該方法可以稱為萬能的,因為它在用軟盤啟動中,始終不與硬碟打交道,這樣不管你硬碟用什麼方法加鎖了,對DOS的啟動都沒有影響。當然,這樣啟動的機子是不認硬碟的,但這沒有關係。你可在機子啟動後,用Debug調出駐留高階記憶體的新INT
13H程式,將其改為只有一條直接執行舊INT 13H的語句,這樣在Debug下可以用INT 13H讀取硬碟0柱面0磁頭1扇區的內容,如果你有備份,將分割槽表引數恢復後再寫入0柱面0磁頭1扇區,重新啟動計算機就可以了。如果實在沒有備份,去掉分割槽表中的迴圈鏈,用正常DOS啟動盤重啟機子後至少也可以重新對硬碟分割槽,不至於硬碟被鎖住打不開了。
四・程式及說明
1・下面是寫入軟盤0磁軌0頭1扇區的源程式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;讀啟動軟盤的引導扇區
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;複製改寫的INT 13H程式到高階記憶體
155 MOV DI,0000
158 MOV CX,0030
15B REPNZ
015C MOVSB
015D MOV AX,0000;將新INT 13H位置寫入中斷向量表
0160 MOV [004C],AX
0163 MOV AX,ES
0165 MOV [004E],AX
0168 JMP 0000:7C00
016D PUSHF;新INT 13H程式
016E CMP DX,0080;是否是硬碟
0172 JNZ 0176;不是硬碟則繼續
0174 POPF
0175 IRET;是硬碟則直接返回
0176 CMP DX,+00;是否讀軟盤BOOT區?
0179 JNZ 0186
017B CMP CX,+01
017E JNZ 0186
0180 MOV CX,4F01;是則讀79磁軌1磁頭1扇區
0183 MOV DX,0100
0186 POPF
0187 JMP 0000:0000;此處跳轉去執行舊INT 13,
;舊INT 13H的位置由前面程式獲得後寫入。
N key.com
RCX
200
W
Q
2・程式的裝載
在進行下面工作前,先用DOS格式化一張啟動的系統盤,並保證沒有壞扇區,最好進行啟動測試,確保其可以啟動機子。由於現在機子上大多隻有3寸軟碟機,因此選擇1.44M的3.5寸軟盤。然後用debug
key.com將程式key.com調入記憶體偏移地址為100H,同時在400H處寫入一段裝載程式。即:
C>debug key.com
-a400
400 MOV CX,0003
403 PUSH CX
404 MOV AX,0201;將A盤載入程式讀入記憶體1000H處
407 MOV BX,1000;為確保成功,首次採用重複讀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;將已讀入記憶體的軟盤載入程式寫入軟盤
419 MOV BX,1000;最後一個磁軌的首扇區
41C MOV CX,4F01
41F MOV DX,0100
422 INT 13
424 MOV AX,0301;將key.com程式寫入軟盤0磁軌0磁頭1扇區
427 MOV BX,0100
42A MOV CX,0001
42D MOV DX,0000
430 INT 13
432 INT 3
為保證萬無一失,最好將軟盤這兩個扇區的內容重新讀出來看一看,以保證寫成功了。做好這一切,保險的還是進行一次測試,即用該軟盤啟動一次機子,看能否成功,若成功啟動,你就可以用迴圈分割槽表法鎖住硬碟,看從正常DOS下能否啟動,然後再用此軟盤啟動機子試試,看看功效如何?
從該軟盤啟動後,不認硬碟,並且在高階記憶體駐留了新INT 13H程式,該段程式實際上是key.com中從16D到187部分。由於有此段程式存在,在debug下也無法讀硬碟,也就沒法恢復硬碟分割槽表,因此機子啟動後首先應修改這段程式。現在的機子基本記憶體通常都為640K,這樣這段程式就位於記憶體中9FC0:0000處,在debug下,用U9FC0:0顯示這段程式,可以看到位於9FC0:001A處是一條跳轉指令,該跳轉指令即轉去執行最原始的INT
13H。由於BIOS版本不一樣,跳轉指令指向的位置可能不一樣,如筆者機子上是一條JMP F000:A5D4語句。這時在在debug下編寫這樣一語句:a9FC0:0
JMP F000:A5D4。這樣,對硬碟的禁寫與禁讀都不再起作用了,在debug下用INT 13H的2號子功能可以讀出硬碟分割槽表,修改恢復後再用3號子功能將資料寫回分割槽表。退出debug,重新用正常DOS啟動計算機,就可以了。
附帶提一下,在正常DOS下,該軟盤由於沒有BOOT區,也就沒有磁碟參數列,從而不能使用,用DIR A:命令會出現General
failure reading drive A提示。不要理睬它,這並不影響它作特殊啟動盤。
五・建議
為更好的保護你的硬碟,筆者建議你最好將你的硬碟分割槽表資訊備份起來。備份有兩種方式,一種是以檔案形式將硬碟每個邏輯盤的分割槽資訊儲存起來;另另一種是將分割槽資訊備份在硬碟隱藏扇區裡。比如可以將0柱面0磁頭1扇區備份在0柱面0磁頭3扇區,將D盤開始柱面號0磁頭1扇區備份在該柱面0磁頭3扇區,其它邏輯盤也如此。這種方法簡單、方便,也很可靠。用NORTAN中的DISKEDI很容易操作和實現。有了備份分割槽表資訊,就不怕破壞分割槽表的病毒了;再加上我給你的程式,即使有人真鎖住了你的硬碟,你也可以輕而易舉解開了。
相關文章
- 解開硬碟邏輯死鎖的一種有效方法 (轉)2007-12-04硬碟
- N000013解開硬碟邏輯死鎖(轉)2007-09-19硬碟
- oracle 死鎖解決方法一例2009-03-07Oracle
- 解決Oracle死鎖的快捷方法2014-01-21Oracle
- 實戰:併發轉賬業務中避免死鎖的各種方法2022-06-13
- SQ死鎖及死鎖的解決2015-11-07
- 查詢處理死鎖會話的sql語句(轉貼)2011-01-12會話SQL
- 故障分析 | 從 Insert 併發死鎖分析 Insert 加鎖原始碼邏輯2023-04-26原始碼
- 經驗心得:騙駭客的一種很有效的方法(轉)2007-08-12
- 鎖的種類,阻塞,死鎖產生與解決辦法。2016-12-22
- Oracle資料表死鎖的解決方法2016-02-19Oracle
- 提高程式設計邏輯的7種方法 - DEV2021-11-09程式設計dev
- 常見的死鎖情況及解決方法2018-06-06
- MySQL鎖(一)全域性鎖:如何做全庫的邏輯備份?2020-12-15MySql
- 掌握 Promise 的邏輯方法2020-12-05Promise
- 例項詳解 Java 死鎖與破解死鎖2022-02-28Java
- 面試:什麼是死鎖,如何避免或解決死鎖;MySQL中的死鎖現象,MySQL死鎖如何解決2024-11-10面試MySql
- MySQL:一個死鎖分析 (未分析出來的死鎖)2018-10-16MySql
- 這種死鎖怎麼理解2009-12-31
- ORACLE中殺死鎖程式的方法2006-11-22Oracle
- 減少SQL Server死鎖的方法2009-12-14SQLServer
- oracle 死鎖表解決方法2016-06-17Oracle
- MySQL 死鎖解決2019-02-28MySql
- MySQL解決死鎖2024-06-09MySql
- linux邏輯卷方式管理硬碟資源2011-04-15Linux硬碟
- iPhone完美變無鎖方法教程 蘋果機有鎖卡貼怎麼解鎖?2018-07-25iPhone蘋果
- 轉貼:破解時間限制的老文章(一) (2千字)2000-10-23
- 批次殺死MySQL連線的四種方法詳解2021-09-09MySql
- 批量殺死MySQL連線的幾種方法詳解2017-08-27MySql
- oracle死鎖的檢視及kill方法2009-11-13Oracle
- Java鎖的邏輯(結合物件頭和ObjectMonitor)2022-11-26Java物件Object
- ios10鎖屏怎麼解鎖ios10鎖屏介面解鎖方法2016-06-15iOS
- oracle 10g 物理備庫轉換邏輯備庫ORA-19953故障解決方法2015-06-28Oracle 10g
- ORACLE10G 物理standby轉為邏輯standby2014-06-05Oracle
- FC5硬碟安裝的兩種方法介紹(轉)2007-08-16硬碟
- iPhone X怎麼解鎖?幾種蘋果iPhone X解鎖方法2017-11-15iPhone蘋果
- 圖解:人性的7種兵器(網際網路商業邏輯)2017-11-16圖解
- 作業系統(5) 死鎖的概念 死鎖產生的必要條件 死鎖的處理策略 預防死鎖 避免死鎖 死鎖的檢測和解除 銀行家演算法2020-12-27作業系統演算法