一種可以穿透還原卡和還原軟件的代碼
更新時(shí)間:2007年01月16日 00:00:00 作者:
一種可以穿透還原卡和還原軟件的代碼
CVC/GB 風(fēng)般的男人
還原卡和還原軟件被廣泛運(yùn)用于各種公共場(chǎng)合的電腦上,比如學(xué)校機(jī)房和網(wǎng)吧。這些還原卡和還原軟件(以下我簡(jiǎn)稱(chēng)為虛擬還原技術(shù))能夠記錄下一切對(duì)硬盤(pán)的寫(xiě)操作,不論您對(duì)硬盤(pán)進(jìn)行拷貝還是移動(dòng)刪除甚至是格式化分區(qū)等操作,只要一重新啟動(dòng),一切都會(huì)恢復(fù)到這個(gè)操作之前的情況,因此有些虛擬還原廠商還會(huì)在廣告詞中加上一句“可以防范一切電腦病毒”。這種虛擬還原的方法在大部分時(shí)候的確可以對(duì)公共機(jī)房的電腦起到很好的保護(hù)作用,難道真的沒(méi)有一種方法能夠穿透這種保護(hù)機(jī)制么?答案是否定的,下面請(qǐng)聽(tīng)我一一道來(lái)。
一、虛擬還原技術(shù)的原理
本文所說(shuō)的是一種普遍運(yùn)用于還原卡或還原軟件上的技術(shù),當(dāng)然,不同品牌不同廠商生產(chǎn)的可能不盡相同,但原理卻是相通的。
首先,還原卡和還原軟件會(huì)搶先奪取引導(dǎo)權(quán),將原來(lái)的0頭0道1扇保存在一個(gè)其他的扇區(qū),(具體備份到那個(gè)扇區(qū)是不一定的),將自己的代碼寫(xiě)入0頭0道1扇,從而能在操作系統(tǒng)之前得到執(zhí)行權(quán),這一點(diǎn)類(lèi)似于一個(gè)引導(dǎo)型病毒;然后,我們來(lái)看看虛擬還原技術(shù)在操作系統(tǒng)之前都做了些什么:
1.將中斷向量表中的INT13H的入口地址保存;
2.把自己用于代替INT13H的代碼寫(xiě)入內(nèi)存,并記住入口地址,當(dāng)然這種“寫(xiě)入內(nèi)存”并不是普通的“寫(xiě)”,而是一種我們稱(chēng)為“常駐”的方法,有關(guān)“常駐程序”的實(shí)現(xiàn)方法我們不另外花篇幅來(lái)描述了,如果你還不了解的話請(qǐng)自己找有關(guān)資料,也可以到www.hackart.org或www.lsky.net找風(fēng)般的男人交流;
3.將中斷向量表中INT13H的入口地址改為這段常駐程序的入口地址。補(bǔ)充一點(diǎn),虛擬還原程序在修改INT13H的入口后往往都會(huì)修改一些其他中斷入口,當(dāng)然也是通過(guò)常駐程序來(lái)實(shí)現(xiàn)的,這些中斷用來(lái)實(shí)現(xiàn)對(duì)中斷向量表中INT13H入口地址監(jiān)控,一旦發(fā)現(xiàn)被修改,就馬上把它改回,這樣做同樣是用來(lái)防止被有心人破解。
好了,你已經(jīng)看出來(lái)了,這段用來(lái)替代BIOS提供的INT13H的代碼才是虛擬還原技術(shù)的關(guān)鍵,那么這段代碼到底實(shí)現(xiàn)了些什么了,以下是本人對(duì)此拙淺的理解:
1.?dāng)r截所有INT13H中對(duì)硬盤(pán)0頭0道1扇的操作
這些包括讀寫(xiě)操作,把所有的對(duì)0頭0道1扇的操作改為對(duì)虛擬還原程序備份的那個(gè)扇區(qū)的操作,這樣做的目的是保護(hù)虛擬還原代碼不被破壞,并且不能被有心人讀出進(jìn)行破解,即使你用扇區(qū)編輯工具查看主引導(dǎo)區(qū),實(shí)際上你看到的是這個(gè)備份的主引導(dǎo)區(qū)。
2.?dāng)r截所有INT13H中的寫(xiě)硬盤(pán)操作
這里包括對(duì)8G以下的硬盤(pán)的普通通過(guò)磁頭、磁道、扇區(qū)定位的INT13H中的寫(xiě)操作,和擴(kuò)展INT13H中基于扇區(qū)地址方式的對(duì)大硬盤(pán)的寫(xiě)操作,甚至包括擴(kuò)展INT13H中對(duì)一些非IDE接口的硬盤(pán)的寫(xiě)操作。
至于攔截后做什么是虛擬還原技術(shù)實(shí)現(xiàn)的關(guān)鍵,在早期的DOS系統(tǒng)當(dāng)中完全可以“什么都不做”,也就是說(shuō)當(dāng)用戶(hù)寫(xiě)硬盤(pán)時(shí)實(shí)際上是什么都沒(méi)做,但現(xiàn)在的操作系統(tǒng)都要對(duì)硬盤(pán)進(jìn)行一些必要的寫(xiě)操作,比如對(duì)虛擬內(nèi)存的寫(xiě)操作。眾所周知,虛擬內(nèi)存實(shí)際上就是硬盤(pán),而如果禁止操作系統(tǒng)寫(xiě)硬盤(pán)的話顯然后果是不堪設(shè)想的。所以,大多數(shù)虛擬還原廠商用的方法是占用一些硬盤(pán)空間,把硬盤(pán)所進(jìn)行的寫(xiě)操作做一個(gè)記錄,等系統(tǒng)重新啟動(dòng)后還原這一記錄,但是怎樣科學(xué)記錄硬盤(pán)的寫(xiě)操作,是我一直沒(méi)想通的問(wèn)題,這種“科學(xué)”應(yīng)該體現(xiàn)在時(shí)間上和硬盤(pán)空間的占用量上的,也就是說(shuō)怎么樣用最少的時(shí)間和最少的硬盤(pán)空間來(lái)記錄硬盤(pán)的寫(xiě)操作是實(shí)現(xiàn)關(guān)鍵,如果有這方面想法的朋友歡迎和我交流;
3.備份端口70H,71H中的內(nèi)容,并把最后一次執(zhí)行時(shí)端口70H,71H的內(nèi)容和備份的內(nèi)容做比較,不一樣就提示BIOS被修改,是否還原,并通過(guò)密碼驗(yàn)證修改BIOS是否合法。
二、PC機(jī)的中斷機(jī)制
中斷提供了最基本的硬件和軟件的接口,它使得程序員不必了解硬件系統(tǒng)的細(xì)節(jié),只要直接調(diào)用系統(tǒng)提供的中斷服務(wù)子程序,就可以完成相應(yīng)功能,這樣能使得程序設(shè)計(jì)更為方便。其實(shí)現(xiàn)機(jī)制如下:當(dāng)某一中斷源發(fā)出中斷請(qǐng)求時(shí),CPU能夠決定是否響應(yīng)這一中斷請(qǐng)求(當(dāng)CPU在執(zhí)行更為重要的工作時(shí),可以暫不響應(yīng)),如果允許響應(yīng)該中斷,CPU會(huì)在現(xiàn)行的指令執(zhí)行完后,把斷點(diǎn)處的下一條指令地址和各寄存器的內(nèi)容和標(biāo)志位的狀態(tài),推入堆棧進(jìn)行保護(hù),然后轉(zhuǎn)到中斷源服務(wù)程序的入口,進(jìn)行中斷處理,當(dāng)中斷處理完成后,再恢復(fù)被保留的各寄存器、標(biāo)志位狀態(tài)和指令指針,使CPU返回?cái)帱c(diǎn),繼續(xù)執(zhí)行下一條指令。
為了區(qū)別各個(gè)中斷,CPC系統(tǒng)給每個(gè)中斷都分配了一個(gè)中斷號(hào)N,比如INT 3H是斷點(diǎn)中斷,INT 10H是顯示中斷,我們今天要討論的主要是INT 13H磁盤(pán)讀寫(xiě)中斷。
要說(shuō)清楚PC機(jī)上的中斷機(jī)制,用這一點(diǎn)篇幅是完全不夠的,這里我所說(shuō)的只是一個(gè)大概,如果你不清楚的話,請(qǐng)查閱一些資料或和我交流,我們今天重要要說(shuō)的就是以INT13H為例看看BIOS提供給我們的中斷到底都是在做什么?所謂BIOS中斷簡(jiǎn)單說(shuō)就是你機(jī)器上的BIOS提供的中斷,那么在BIOS中斷的后面,到底是些什么呢?實(shí)際上是一些對(duì)端口的輸入輸出操作,PC的每個(gè)端口都實(shí)現(xiàn)特定的功能,我們完全可以不調(diào)用BIOS提供的中斷而直接用輸入輸出指令對(duì)這些端口進(jìn)行操作,從而可以實(shí)現(xiàn)象調(diào)用BIOS中斷一樣的功能,但是一個(gè)前提是你必須對(duì)這些端口有詳細(xì)的了解。反過(guò)來(lái)說(shuō),PC的中斷系統(tǒng)的一大好處就是能夠讓程序員無(wú)須了解系統(tǒng)底層的硬件知識(shí)的而能夠編程,從這點(diǎn)看,中斷有點(diǎn)象我們平時(shí)所說(shuō)的“封裝”,我不知道這樣說(shuō)對(duì)不對(duì),但的確中斷為我們“封裝”了許多系統(tǒng)底層的細(xì)節(jié)。
三、硬盤(pán)讀寫(xiě)端口的具體含義
對(duì)硬盤(pán)進(jìn)行操作的常用端口是1f0h~1f7h號(hào)端口,各端口含義如下:
端口號(hào) 讀還是寫(xiě) 具體含義
1F0H 讀/寫(xiě) 用來(lái)傳送讀/寫(xiě)的數(shù)據(jù)(其內(nèi)容是正在傳輸?shù)囊粋€(gè)字節(jié)的數(shù)據(jù))
1F1H 讀 用來(lái)讀取錯(cuò)誤碼
1F2H 讀/寫(xiě) 用來(lái)放入要讀寫(xiě)的扇區(qū)數(shù)量
1F3H 讀/寫(xiě) 用來(lái)放入要讀寫(xiě)的扇區(qū)號(hào)碼
1F4H 讀/寫(xiě) 用來(lái)存放讀寫(xiě)柱面的低8位字節(jié)
1F5H 讀/寫(xiě) 用來(lái)存放讀寫(xiě)柱面的高2位字節(jié)(其高6位恒為0)
1F6H 讀/寫(xiě) 用來(lái)存放要讀/寫(xiě)的磁盤(pán)號(hào)及磁頭號(hào)
第7位 恒為1
第6位 恒為0
第5位 恒為1
第4位 為0代表第一塊硬盤(pán)、為1代表第二塊硬盤(pán)
第3~0位 用來(lái)存放要讀/寫(xiě)的磁頭號(hào)
1f7H 讀 用來(lái)存放讀操作后的狀態(tài)
第7位 控制器忙碌
第6位 磁盤(pán)驅(qū)動(dòng)器準(zhǔn)備好了
第5位 寫(xiě)入錯(cuò)誤
第4位 搜索完成
第3位 為1時(shí)扇區(qū)緩沖區(qū)沒(méi)有準(zhǔn)備好
第2位 是否正確讀取磁盤(pán)數(shù)據(jù)
第1位 磁盤(pán)每轉(zhuǎn)一周將此位設(shè)為1,
第0位 之前的命令因發(fā)生錯(cuò)誤而結(jié)束
寫(xiě) 該位端口為命令端口,用來(lái)發(fā)出指定命令
為50h 格式化磁道
為20h 嘗試讀取扇區(qū)
為21h 無(wú)須驗(yàn)證扇區(qū)是否準(zhǔn)備好而直接讀扇區(qū)
為22h 嘗試讀取長(zhǎng)扇區(qū)(用于早期的硬盤(pán),每扇可能不是512字節(jié),而是128字節(jié)到1024之間的值)
為23h 無(wú)須驗(yàn)證扇區(qū)是否準(zhǔn)備好而直接讀長(zhǎng)扇區(qū)
為30h 嘗試寫(xiě)扇區(qū)
為31h 無(wú)須驗(yàn)證扇區(qū)是否準(zhǔn)備好而直接寫(xiě)扇區(qū)
為32h 嘗試寫(xiě)長(zhǎng)扇區(qū)
為33h 無(wú)須驗(yàn)證扇區(qū)是否準(zhǔn)備好而直接寫(xiě)長(zhǎng)扇區(qū)
注:當(dāng)然看完這個(gè)表你會(huì)發(fā)現(xiàn),這種讀寫(xiě)端口的方法其實(shí)是基于磁頭、柱面、扇區(qū)的硬盤(pán)讀寫(xiě)方法,不過(guò)大于8G的硬盤(pán)的讀寫(xiě)方法也是通過(guò)端口1F0H~1F7H來(lái)實(shí)現(xiàn)的^_^
四、一個(gè)通過(guò)對(duì)硬盤(pán)輸入輸出端口操作來(lái)讀寫(xiě)硬盤(pán)的實(shí)例
讓我們來(lái)看一個(gè)關(guān)于INT13H讀寫(xiě)硬盤(pán)程序?qū)嵗?。在例子中詳?xì)說(shuō)明了硬盤(pán)的讀寫(xiě)操作所用到的端口,并且把通過(guò)INT13H讀出的主引導(dǎo)區(qū)得到的數(shù)據(jù)和通過(guò)輸入輸出讀主引導(dǎo)區(qū)得到的數(shù)據(jù)進(jìn)行比較,從而證實(shí)這兩種操作功能相同,程序片段如下:
mov dx,1f6h ; 要讀入的磁盤(pán)號(hào)及磁頭號(hào)
mov al,0a0h ;磁盤(pán)0,磁頭0
out dx,al
mov dx,1f2h ;要讀入的扇區(qū)數(shù)量
mov al,1 ;讀一個(gè)扇區(qū)
out dx,al
mov dx,1f3h ;要讀的扇區(qū)號(hào)
mov al,1 ;扇區(qū)號(hào)為1
out dx,al
mov dx,1f4h ;要讀的柱面的低8位
mov al,0 ; 柱面低8位為0
out dx,al
mov dx,1f5h ; 柱面高2位
mov al,0 ; 柱面高2位為0(通過(guò)1F4H和1F5H端口我們可以確定
; 用來(lái)讀的柱面號(hào)是0)
out dx,al
mov dx,1f7h ;命令端口
mov al,20h ; 嘗試讀取扇區(qū)
out dx,al
still_going:
in al,dx
test al,8 ;扇區(qū)緩沖是否準(zhǔn)備好
jz still_going ;如果扇區(qū)緩沖沒(méi)有準(zhǔn)備好的話則跳轉(zhuǎn),直到準(zhǔn)備好才向下執(zhí)行。
mov cx,512/2 ;設(shè)置循環(huán)次數(shù)(512/2次)
mov di,offset buffer
mov dx,1f0h ;將要傳輸?shù)囊粋€(gè)字節(jié)的數(shù)據(jù)
rep insw ;傳輸數(shù)據(jù)
; ------
mov ax,201h ;以下是用INT13H讀硬盤(pán)的0磁頭、0柱面、1扇區(qū)
mov dx,80h
mov cx,1
mov bx,offset buffer2
int 13h
mov cx,512 ;以下部分用來(lái)比較2種方法讀出的硬盤(pán)數(shù)據(jù)
mov si,offset buffer
mov di,offset buffer2
repe cmpsb
jne failure
mov ah,9
mov dx,offset readmsg
int 21h
jmp good_exit
failure:
mov ah,9
mov dx,offset failmsg
int 21h
good_exit: ;以下部分用來(lái)結(jié)束程序
mov ax,4c00h ;退出程序
int 21h
readmsg db 'The buffers match. Hard disk read using ports.
CVC/GB 風(fēng)般的男人
還原卡和還原軟件被廣泛運(yùn)用于各種公共場(chǎng)合的電腦上,比如學(xué)校機(jī)房和網(wǎng)吧。這些還原卡和還原軟件(以下我簡(jiǎn)稱(chēng)為虛擬還原技術(shù))能夠記錄下一切對(duì)硬盤(pán)的寫(xiě)操作,不論您對(duì)硬盤(pán)進(jìn)行拷貝還是移動(dòng)刪除甚至是格式化分區(qū)等操作,只要一重新啟動(dòng),一切都會(huì)恢復(fù)到這個(gè)操作之前的情況,因此有些虛擬還原廠商還會(huì)在廣告詞中加上一句“可以防范一切電腦病毒”。這種虛擬還原的方法在大部分時(shí)候的確可以對(duì)公共機(jī)房的電腦起到很好的保護(hù)作用,難道真的沒(méi)有一種方法能夠穿透這種保護(hù)機(jī)制么?答案是否定的,下面請(qǐng)聽(tīng)我一一道來(lái)。
一、虛擬還原技術(shù)的原理
本文所說(shuō)的是一種普遍運(yùn)用于還原卡或還原軟件上的技術(shù),當(dāng)然,不同品牌不同廠商生產(chǎn)的可能不盡相同,但原理卻是相通的。
首先,還原卡和還原軟件會(huì)搶先奪取引導(dǎo)權(quán),將原來(lái)的0頭0道1扇保存在一個(gè)其他的扇區(qū),(具體備份到那個(gè)扇區(qū)是不一定的),將自己的代碼寫(xiě)入0頭0道1扇,從而能在操作系統(tǒng)之前得到執(zhí)行權(quán),這一點(diǎn)類(lèi)似于一個(gè)引導(dǎo)型病毒;然后,我們來(lái)看看虛擬還原技術(shù)在操作系統(tǒng)之前都做了些什么:
1.將中斷向量表中的INT13H的入口地址保存;
2.把自己用于代替INT13H的代碼寫(xiě)入內(nèi)存,并記住入口地址,當(dāng)然這種“寫(xiě)入內(nèi)存”并不是普通的“寫(xiě)”,而是一種我們稱(chēng)為“常駐”的方法,有關(guān)“常駐程序”的實(shí)現(xiàn)方法我們不另外花篇幅來(lái)描述了,如果你還不了解的話請(qǐng)自己找有關(guān)資料,也可以到www.hackart.org或www.lsky.net找風(fēng)般的男人交流;
3.將中斷向量表中INT13H的入口地址改為這段常駐程序的入口地址。補(bǔ)充一點(diǎn),虛擬還原程序在修改INT13H的入口后往往都會(huì)修改一些其他中斷入口,當(dāng)然也是通過(guò)常駐程序來(lái)實(shí)現(xiàn)的,這些中斷用來(lái)實(shí)現(xiàn)對(duì)中斷向量表中INT13H入口地址監(jiān)控,一旦發(fā)現(xiàn)被修改,就馬上把它改回,這樣做同樣是用來(lái)防止被有心人破解。
好了,你已經(jīng)看出來(lái)了,這段用來(lái)替代BIOS提供的INT13H的代碼才是虛擬還原技術(shù)的關(guān)鍵,那么這段代碼到底實(shí)現(xiàn)了些什么了,以下是本人對(duì)此拙淺的理解:
1.?dāng)r截所有INT13H中對(duì)硬盤(pán)0頭0道1扇的操作
這些包括讀寫(xiě)操作,把所有的對(duì)0頭0道1扇的操作改為對(duì)虛擬還原程序備份的那個(gè)扇區(qū)的操作,這樣做的目的是保護(hù)虛擬還原代碼不被破壞,并且不能被有心人讀出進(jìn)行破解,即使你用扇區(qū)編輯工具查看主引導(dǎo)區(qū),實(shí)際上你看到的是這個(gè)備份的主引導(dǎo)區(qū)。
2.?dāng)r截所有INT13H中的寫(xiě)硬盤(pán)操作
這里包括對(duì)8G以下的硬盤(pán)的普通通過(guò)磁頭、磁道、扇區(qū)定位的INT13H中的寫(xiě)操作,和擴(kuò)展INT13H中基于扇區(qū)地址方式的對(duì)大硬盤(pán)的寫(xiě)操作,甚至包括擴(kuò)展INT13H中對(duì)一些非IDE接口的硬盤(pán)的寫(xiě)操作。
至于攔截后做什么是虛擬還原技術(shù)實(shí)現(xiàn)的關(guān)鍵,在早期的DOS系統(tǒng)當(dāng)中完全可以“什么都不做”,也就是說(shuō)當(dāng)用戶(hù)寫(xiě)硬盤(pán)時(shí)實(shí)際上是什么都沒(méi)做,但現(xiàn)在的操作系統(tǒng)都要對(duì)硬盤(pán)進(jìn)行一些必要的寫(xiě)操作,比如對(duì)虛擬內(nèi)存的寫(xiě)操作。眾所周知,虛擬內(nèi)存實(shí)際上就是硬盤(pán),而如果禁止操作系統(tǒng)寫(xiě)硬盤(pán)的話顯然后果是不堪設(shè)想的。所以,大多數(shù)虛擬還原廠商用的方法是占用一些硬盤(pán)空間,把硬盤(pán)所進(jìn)行的寫(xiě)操作做一個(gè)記錄,等系統(tǒng)重新啟動(dòng)后還原這一記錄,但是怎樣科學(xué)記錄硬盤(pán)的寫(xiě)操作,是我一直沒(méi)想通的問(wèn)題,這種“科學(xué)”應(yīng)該體現(xiàn)在時(shí)間上和硬盤(pán)空間的占用量上的,也就是說(shuō)怎么樣用最少的時(shí)間和最少的硬盤(pán)空間來(lái)記錄硬盤(pán)的寫(xiě)操作是實(shí)現(xiàn)關(guān)鍵,如果有這方面想法的朋友歡迎和我交流;
3.備份端口70H,71H中的內(nèi)容,并把最后一次執(zhí)行時(shí)端口70H,71H的內(nèi)容和備份的內(nèi)容做比較,不一樣就提示BIOS被修改,是否還原,并通過(guò)密碼驗(yàn)證修改BIOS是否合法。
二、PC機(jī)的中斷機(jī)制
中斷提供了最基本的硬件和軟件的接口,它使得程序員不必了解硬件系統(tǒng)的細(xì)節(jié),只要直接調(diào)用系統(tǒng)提供的中斷服務(wù)子程序,就可以完成相應(yīng)功能,這樣能使得程序設(shè)計(jì)更為方便。其實(shí)現(xiàn)機(jī)制如下:當(dāng)某一中斷源發(fā)出中斷請(qǐng)求時(shí),CPU能夠決定是否響應(yīng)這一中斷請(qǐng)求(當(dāng)CPU在執(zhí)行更為重要的工作時(shí),可以暫不響應(yīng)),如果允許響應(yīng)該中斷,CPU會(huì)在現(xiàn)行的指令執(zhí)行完后,把斷點(diǎn)處的下一條指令地址和各寄存器的內(nèi)容和標(biāo)志位的狀態(tài),推入堆棧進(jìn)行保護(hù),然后轉(zhuǎn)到中斷源服務(wù)程序的入口,進(jìn)行中斷處理,當(dāng)中斷處理完成后,再恢復(fù)被保留的各寄存器、標(biāo)志位狀態(tài)和指令指針,使CPU返回?cái)帱c(diǎn),繼續(xù)執(zhí)行下一條指令。
為了區(qū)別各個(gè)中斷,CPC系統(tǒng)給每個(gè)中斷都分配了一個(gè)中斷號(hào)N,比如INT 3H是斷點(diǎn)中斷,INT 10H是顯示中斷,我們今天要討論的主要是INT 13H磁盤(pán)讀寫(xiě)中斷。
要說(shuō)清楚PC機(jī)上的中斷機(jī)制,用這一點(diǎn)篇幅是完全不夠的,這里我所說(shuō)的只是一個(gè)大概,如果你不清楚的話,請(qǐng)查閱一些資料或和我交流,我們今天重要要說(shuō)的就是以INT13H為例看看BIOS提供給我們的中斷到底都是在做什么?所謂BIOS中斷簡(jiǎn)單說(shuō)就是你機(jī)器上的BIOS提供的中斷,那么在BIOS中斷的后面,到底是些什么呢?實(shí)際上是一些對(duì)端口的輸入輸出操作,PC的每個(gè)端口都實(shí)現(xiàn)特定的功能,我們完全可以不調(diào)用BIOS提供的中斷而直接用輸入輸出指令對(duì)這些端口進(jìn)行操作,從而可以實(shí)現(xiàn)象調(diào)用BIOS中斷一樣的功能,但是一個(gè)前提是你必須對(duì)這些端口有詳細(xì)的了解。反過(guò)來(lái)說(shuō),PC的中斷系統(tǒng)的一大好處就是能夠讓程序員無(wú)須了解系統(tǒng)底層的硬件知識(shí)的而能夠編程,從這點(diǎn)看,中斷有點(diǎn)象我們平時(shí)所說(shuō)的“封裝”,我不知道這樣說(shuō)對(duì)不對(duì),但的確中斷為我們“封裝”了許多系統(tǒng)底層的細(xì)節(jié)。
三、硬盤(pán)讀寫(xiě)端口的具體含義
對(duì)硬盤(pán)進(jìn)行操作的常用端口是1f0h~1f7h號(hào)端口,各端口含義如下:
端口號(hào) 讀還是寫(xiě) 具體含義
1F0H 讀/寫(xiě) 用來(lái)傳送讀/寫(xiě)的數(shù)據(jù)(其內(nèi)容是正在傳輸?shù)囊粋€(gè)字節(jié)的數(shù)據(jù))
1F1H 讀 用來(lái)讀取錯(cuò)誤碼
1F2H 讀/寫(xiě) 用來(lái)放入要讀寫(xiě)的扇區(qū)數(shù)量
1F3H 讀/寫(xiě) 用來(lái)放入要讀寫(xiě)的扇區(qū)號(hào)碼
1F4H 讀/寫(xiě) 用來(lái)存放讀寫(xiě)柱面的低8位字節(jié)
1F5H 讀/寫(xiě) 用來(lái)存放讀寫(xiě)柱面的高2位字節(jié)(其高6位恒為0)
1F6H 讀/寫(xiě) 用來(lái)存放要讀/寫(xiě)的磁盤(pán)號(hào)及磁頭號(hào)
第7位 恒為1
第6位 恒為0
第5位 恒為1
第4位 為0代表第一塊硬盤(pán)、為1代表第二塊硬盤(pán)
第3~0位 用來(lái)存放要讀/寫(xiě)的磁頭號(hào)
1f7H 讀 用來(lái)存放讀操作后的狀態(tài)
第7位 控制器忙碌
第6位 磁盤(pán)驅(qū)動(dòng)器準(zhǔn)備好了
第5位 寫(xiě)入錯(cuò)誤
第4位 搜索完成
第3位 為1時(shí)扇區(qū)緩沖區(qū)沒(méi)有準(zhǔn)備好
第2位 是否正確讀取磁盤(pán)數(shù)據(jù)
第1位 磁盤(pán)每轉(zhuǎn)一周將此位設(shè)為1,
第0位 之前的命令因發(fā)生錯(cuò)誤而結(jié)束
寫(xiě) 該位端口為命令端口,用來(lái)發(fā)出指定命令
為50h 格式化磁道
為20h 嘗試讀取扇區(qū)
為21h 無(wú)須驗(yàn)證扇區(qū)是否準(zhǔn)備好而直接讀扇區(qū)
為22h 嘗試讀取長(zhǎng)扇區(qū)(用于早期的硬盤(pán),每扇可能不是512字節(jié),而是128字節(jié)到1024之間的值)
為23h 無(wú)須驗(yàn)證扇區(qū)是否準(zhǔn)備好而直接讀長(zhǎng)扇區(qū)
為30h 嘗試寫(xiě)扇區(qū)
為31h 無(wú)須驗(yàn)證扇區(qū)是否準(zhǔn)備好而直接寫(xiě)扇區(qū)
為32h 嘗試寫(xiě)長(zhǎng)扇區(qū)
為33h 無(wú)須驗(yàn)證扇區(qū)是否準(zhǔn)備好而直接寫(xiě)長(zhǎng)扇區(qū)
注:當(dāng)然看完這個(gè)表你會(huì)發(fā)現(xiàn),這種讀寫(xiě)端口的方法其實(shí)是基于磁頭、柱面、扇區(qū)的硬盤(pán)讀寫(xiě)方法,不過(guò)大于8G的硬盤(pán)的讀寫(xiě)方法也是通過(guò)端口1F0H~1F7H來(lái)實(shí)現(xiàn)的^_^
四、一個(gè)通過(guò)對(duì)硬盤(pán)輸入輸出端口操作來(lái)讀寫(xiě)硬盤(pán)的實(shí)例
讓我們來(lái)看一個(gè)關(guān)于INT13H讀寫(xiě)硬盤(pán)程序?qū)嵗?。在例子中詳?xì)說(shuō)明了硬盤(pán)的讀寫(xiě)操作所用到的端口,并且把通過(guò)INT13H讀出的主引導(dǎo)區(qū)得到的數(shù)據(jù)和通過(guò)輸入輸出讀主引導(dǎo)區(qū)得到的數(shù)據(jù)進(jìn)行比較,從而證實(shí)這兩種操作功能相同,程序片段如下:
mov dx,1f6h ; 要讀入的磁盤(pán)號(hào)及磁頭號(hào)
mov al,0a0h ;磁盤(pán)0,磁頭0
out dx,al
mov dx,1f2h ;要讀入的扇區(qū)數(shù)量
mov al,1 ;讀一個(gè)扇區(qū)
out dx,al
mov dx,1f3h ;要讀的扇區(qū)號(hào)
mov al,1 ;扇區(qū)號(hào)為1
out dx,al
mov dx,1f4h ;要讀的柱面的低8位
mov al,0 ; 柱面低8位為0
out dx,al
mov dx,1f5h ; 柱面高2位
mov al,0 ; 柱面高2位為0(通過(guò)1F4H和1F5H端口我們可以確定
; 用來(lái)讀的柱面號(hào)是0)
out dx,al
mov dx,1f7h ;命令端口
mov al,20h ; 嘗試讀取扇區(qū)
out dx,al
still_going:
in al,dx
test al,8 ;扇區(qū)緩沖是否準(zhǔn)備好
jz still_going ;如果扇區(qū)緩沖沒(méi)有準(zhǔn)備好的話則跳轉(zhuǎn),直到準(zhǔn)備好才向下執(zhí)行。
mov cx,512/2 ;設(shè)置循環(huán)次數(shù)(512/2次)
mov di,offset buffer
mov dx,1f0h ;將要傳輸?shù)囊粋€(gè)字節(jié)的數(shù)據(jù)
rep insw ;傳輸數(shù)據(jù)
; ------
mov ax,201h ;以下是用INT13H讀硬盤(pán)的0磁頭、0柱面、1扇區(qū)
mov dx,80h
mov cx,1
mov bx,offset buffer2
int 13h
mov cx,512 ;以下部分用來(lái)比較2種方法讀出的硬盤(pán)數(shù)據(jù)
mov si,offset buffer
mov di,offset buffer2
repe cmpsb
jne failure
mov ah,9
mov dx,offset readmsg
int 21h
jmp good_exit
failure:
mov ah,9
mov dx,offset failmsg
int 21h
good_exit: ;以下部分用來(lái)結(jié)束程序
mov ax,4c00h ;退出程序
int 21h
readmsg db 'The buffers match. Hard disk read using ports.
相關(guān)文章
網(wǎng)吧破解:讓你在網(wǎng)吧上霸王網(wǎng)
網(wǎng)吧破解:讓你在網(wǎng)吧上霸王網(wǎng)...2007-01-01Byshell后門(mén):無(wú)進(jìn)程無(wú)DLL無(wú)硬盤(pán)文件
Byshell后門(mén):無(wú)進(jìn)程無(wú)DLL無(wú)硬盤(pán)文件...2007-01-01