一種可以穿透還原卡和還原軟體的代碼
CVC/GB 風般的男人
還原卡和還原軟體被廣泛運用於各種公用場合的電腦上,比如學校機房和網吧。這些還原卡和還原軟體(以下我簡稱為虛擬還原技術)能夠記錄下一切對硬碟的寫操作,不論您對硬碟進行拷貝還是移動刪除甚至是格式化分區等操作,只要一重新啟動,一切都會恢複到這個操作之前的情況,因此有些虛擬還原廠商還會在廣告詞中加上一句“可以防範一切電腦病毒”。這種虛擬還原的方法在大部分時候的確可以對公用機房的電腦起到很好的保護作用,難道真的沒有一種方法能夠穿透這種保護機制嗎?答案是否定的,下面請聽我一一道來。
一、虛擬還原技術的原理
本文所說的是一種普遍運用於還原卡或還原軟體上的技術,當然,不同品牌不同廠商生產的可能不盡相同,但原理卻是相通的。
首先,還原卡和還原軟體會搶先奪取引導權,將原來的0頭0道1扇儲存在一個其他的扇區,(具體備份到那個扇區是不一定的),將自己的代碼寫入0頭0道1扇,從而能在作業系統之前得到執行權,這一點類似於一個引導型病毒;然後,我們來看看虛擬還原技術在作業系統之前都做了些什麼:
1.將中斷向量表中的INT13H的入口地址儲存;
2.把自己用於代替INT13H的代碼寫入記憶體,並記住入口地址,當然這種“寫入記憶體”並不是普通的“寫”,而是一種我們稱為“常駐”的方法,有關“常駐程式”的實現方法我們不另外花篇幅來描述了,如果你還不瞭解的話請自己找有關資料,也可以到www.hackart.org或www.lsky.net找風般的男人交流;
3.將中斷向量表中INT13H的入口地址改為這段常駐程式的入口地址。補充一點,虛擬還原程式在修改INT13H的入口後往往都會修改一些其他中斷入口,當然也是通過常駐程式來實現的,這些中斷用來實現對中斷向量表中INT13H入口地址監控,一旦發現被修改,就馬上把它改回,這樣做同樣是用來防止被有心人破解。
好了,你已經看出來了,這段用來替代BIOS提供的INT13H的代碼才是虛擬還原技術的關鍵,那麼這段代碼到底實現了些什麼了,以下是本人對此拙淺的理解:
1.攔截所有INT13H中對硬碟0頭0道1扇的操作
這些包括讀寫操作,把所有的對0頭0道1扇的操作改為對虛擬還原程式備份的那個扇區的操作,這樣做的目的是保護虛擬還原代碼不被破壞,並且不能被有心人讀出進行破解,即使你用扇區編輯工具查看主引導區,實際上你看到的是這個備份的主引導區。
2.攔截所有INT13H中的寫硬碟操作
這裡包括對8G以下的硬碟的普通通過磁頭、磁軌、扇區定位的INT13H中的寫操作,和擴充INT13H中基於扇區地址方式的對大硬碟的寫操作,甚至包括擴充INT13H中對一些非IDE介面的硬碟的寫操作。
至於攔截後做什麼是虛擬還原技術實現的關鍵,在早期的DOS系統當中完全可以“什麼都不做”,也就是說當使用者寫硬碟時實際上是什麼都沒做,但現在的作業系統都要對硬碟進行一些必要的寫操作,比如對虛擬記憶體的寫操作。眾所周知,虛擬記憶體實際上就是硬碟,而如果禁止作業系統寫硬碟的話顯然後果是不堪設想的。所以,大多數虛擬還原廠商用的方法是佔用一些硬碟空間,把硬碟所進行的寫操作做一個記錄,等系統重新啟動後還原這一記錄,但是怎樣科學記錄硬碟的寫操作,是我一直沒想通的問題,這種“科學”應該體現在時間上和硬碟空間的佔用量上的,也就是說怎麼樣用最少的時間和最少的硬碟空間來記錄硬碟的寫操作是實現關鍵,如果有這方面想法的朋友歡迎和我交流;
3.備份連接埠70H,71H中的內容,並把最後一次執行時連接埠70H,71H的內容和備份的內容做比較,不一樣就提示BIOS被修改,是否還原,並通過密碼驗證修改BIOS是否合法。
二、PC機的中斷機制
中斷提供了最基本的硬體和軟體的介面,它使得程式員不必瞭解硬體系統的細節,只要直接調用系統提供的中斷服務子程式,就可以完成相應功能,這樣能使得程式設計更為方便。其實現機制如下:當某一中斷源發出插斷要求時,CPU能夠決定是否響應這一插斷要求(當CPU在執行更為重要的工作時,可以暫不響應),如果允許響應該中斷,CPU會在現行的指令執行完後,把斷點處的下一條指令地址和各寄存器的內容和標誌位的狀態,推入堆棧進行保護,然後轉到中斷源服務程式的入口,進行中斷處理,當中斷處理完成後,再恢複被保留的各寄存器、標誌位狀態和指令指標,使CPU返回斷點,繼續執行下一條指令。
為了區別各個中斷,CPC系統給每個中斷都分配了一個中斷號N,比如INT 3H是斷點中斷,INT 10H是顯示中斷,我們今天要討論的主要是INT 13H磁碟讀寫中斷。
要說清楚PC機上的中斷機制,用這一點篇幅是完全不夠的,這裡我所說的只是一個大概,如果你不清楚的話,請查閱一些資料或和我交流,我們今天重要要說的就是以INT13H為例看看BIOS提供給我們的中斷到底都是在做什嗎?所謂BIOS中斷簡單說就是你機器上的BIOS提供的中斷,那麼在BIOS中斷的後面,到底是些什麼呢?實際上是一些對連接埠的輸入輸出操作,PC的每個連接埠都實現特定的功能,我們完全可以不調用BIOS提供的中斷而直接用輸入輸出指令對這些連接埠進行操作,從而可以實現象調用BIOS中斷一樣的功能,但是一個前提是你必須對這些連接埠有詳細的瞭解。反過來說,PC的中斷系統的一大好處就是能夠讓程式員無須瞭解系統底層的硬體知識的而能夠編程,從這點看,中斷有點象我們平時所說的“封裝”,我不知道這樣說對不對,但的確中斷為我們“封裝”了許多系統底層的細節。
三、硬碟讀寫連接埠的具體含義
對硬碟進行操作的常用連接埠是1f0h~1f7h號連接埠,各連接埠含義如下:
連接埠號碼 讀還是寫 具體含義
1F0H 讀/寫 用來傳送讀/寫的資料(其內容是正在傳輸的一個位元組的資料)
1F1H 讀 用來讀取錯誤碼
1F2H 讀/寫 用來放入要讀寫的扇區數量
1F3H 讀/寫 用來放入要讀寫的扇區號碼
1F4H 讀/寫 用來存放讀寫柱面的低8位位元組
1F5H 讀/寫 用來存放讀寫柱面的高2位位元組(其高6位恒為0)
1F6H 讀/寫 用來存放要讀/寫的磁碟號及磁頭號
第7位 恒為1
第6位 恒為0
第5位 恒為1
第4位 為0代表第一塊硬碟、為1代表第二塊硬碟
第3~0位 用來存放要讀/寫的磁頭號
1f7H 讀 用來存放讀操作後的狀態
第7位 控制器忙碌
第6位 磁碟機準備好了
第5位 寫入錯誤
第4位 搜尋完成
第3位 為1時扇區緩衝區沒有準備好
第2位 是否正確讀取磁碟資料
第1位 磁碟每轉一周將此位設為1,
第0位 之前的命令因發生錯誤而結束
寫 該位連接埠為命令連接埠,用來發出指定命令
為50h 格式化磁軌
為20h 嘗試讀取扇區
為21h 無須驗證扇區是否準備好而直接讀扇區
為22h 嘗試讀取長扇區(用於早期的硬碟,每扇可能不是512位元組,而是128位元組到1024之間的值)
為23h 無須驗證扇區是否準備好而直接讀長扇區
為30h 嘗試寫扇區
為31h 無須驗證扇區是否準備好而直接寫扇區
為32h 嘗試寫長扇區
為33h 無須驗證扇區是否準備好而直接寫長扇區
注:當然看完這個表你會發現,這種讀寫連接埠的方法其實是基於磁頭、柱面、扇區的硬碟讀寫方法,不過大於8G的硬碟的讀寫方法也是通過連接埠1F0H~1F7H來實現的^_^
四、一個通過對硬碟輸入輸出連接埠操作來讀寫硬碟的執行個體
讓我們來看一個關於INT13H讀寫硬碟程式執行個體。在例子中詳細說明了硬碟的讀寫操作所用到的連接埠,並且把通過INT13H讀出的主引導區得到的資料和通過輸入輸出讀主引導區得到的資料進行比較,從而證實這兩種操作功能相同,程式片段如下:
mov dx,1f6h ; 要讀入的磁碟號及磁頭號
mov al,0a0h ;磁碟0,磁頭0
out dx,al
mov dx,1f2h ;要讀入的扇區數量
mov al,1 ;讀一個扇區
out dx,al
mov dx,1f3h ;要讀的扇區號
mov al,1 ;扇區號為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 ; 嘗試讀取扇區
out dx,al
still_going:
in al,dx
test al,8 ;扇區緩衝是否準備好
jz still_going ;如果扇區緩衝沒有準備好的話則跳轉,直到準備好才向下執行。
mov cx,512/2 ;設定迴圈次數(512/2次)
mov di,offset buffer
mov dx,1f0h ;將要傳輸的一個位元組的資料
rep insw ;傳輸資料
; ------
mov ax,201h ;以下是用INT13H讀硬碟的0磁頭、0柱面、1扇區
mov dx,80h
mov cx,1
mov bx,offset buffer2
int 13h
mov cx,512 ;以下部分用來比較2種方法讀出的硬碟資料
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: ;以下部分用來結束程式
mov ax,4c00h ;退出程式
int 21h
readmsg db 'The buffers match. Hard disk read using ports.