1997年6月24日
王江民先生在其主页上发布了KV300L++版,内含
逻辑炸弹。凡是在MK300V4制作的仿真盘(盗版盘)上执行KV300L++的用户硬盘数据均被破坏,同时硬盘被锁,软硬盘皆不能启动。KV300逻辑炸弹可以造成电脑软硬盘都不能启动的现象,当时在电脑界引起轰动。
事件经过
1997年6月24日
王江民先生在其主页上发布了KV300L++版,内含
逻辑炸弹。
凡是在MK300V4制作的仿真盘(盗版盘)上执行KV300L++的用户硬盘数据均被破坏,
同时硬盘被锁,软硬盘皆不能启动。
KV300逻辑炸弹可以造成电脑软硬盘都不能启动的现象,
当时在电脑界引起轰动。这是用常规原理不能解释的现象。
逻辑炸弹表现
1.先破坏
文件分配表,然后修改
分区表造成硬盘被锁。
2.不做任何备份。
3.没有任何提示。
4.在特定条件下激发(盗版盘)。
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
mov cx,ds:[3d0h]
mov [3ceh],0
mov bx,210h
mov ax,301h
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
执行完后,将软盘从
驱动器系统盘,不能真正启动“病”计算机,但待这张盘“启动”完后(硬盘灯亮了一下,显示器上无任何显示),再插入真正的系统盘,关机,再重新启动,就可以了。
当然,明白了这一道理后,可能会有更好的方法,以上就算是抛砖引玉吧。
注意:不要修改CMOS。软错误当然软解决,千万不能将CMOS设置硬盘为未安装 。
以上方法,已在多台机器上验证无误。