江民炸弹

江民炸弹




1997年6月24日王江民先生在其主页上发布了KV300L++版,内含逻辑炸弹。凡是在MK300V4制作的仿真盘(盗版盘)上执行KV300L++的用户硬盘数据均被破坏,同时硬盘被锁,软硬盘皆不能启动。KV300逻辑炸弹可以造成电脑软硬盘都不能启动的现象,当时在电脑界引起轰动。

中文名江民炸弹 时 间1997年7月23日
外文名jiangmin bomb 事 件硬盘无法启动
地 点北京

事件经过

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 dl,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个字节,其含义见表。

偏移量含 义
0x00-0x01引导标志(80h表示活动分区,00h表示非活动分区,其他值非法)
0x01-0x02本分区的起始磁头号
0x02-0x04本分区的起始扇区号和起始柱号
0x04-0x05分区类型(1-DOS,12位FAT;2-XENIX;4-DOS,16位FAT,小于32M;5-扩展DOS;
6-DOS,16位FAT,大于32M;0DBh-并发DOS.
0x05-0x06本分区的结束磁头号
0x06-0x08本分区的结束扇区号和结束柱号
0x08-0x0C本分区的相对扇区号
0x0C-0x10本分区的扇区数

各逻辑分区首隐藏扇区与主引导扇区类似,在偏移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驱。按如下输入:

-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设置硬盘为未安装 。

以上方法,已在多台机器上验证无误。

说点什么

avatar
  订阅  
提醒

扫码二维码快速访问本页

江民炸弹 – 起航天空