玉管通地理,朱笔点天文
        欢迎光临文天软件之家
 
全站搜索
联系方式


网 址:文天软件之家

    www.jh-lzf.com

联系人:文天(刘中甫)

邮 箱:jh-lzf@21cn.com

地 址:湖北·武汉

    中国石化·江汉油田

    石油工程技术研究院

    信息中心

  

天气信息
新闻详情
屏蔽CIH系列病毒发作日
来源:━━━━《电脑技术》1999第9期作者:刘中甫网址:http://www.jh-lzf.com浏览数:7

屏蔽CIH系列病毒发作日

一.CIH病毒与黑色26日

每月26日发作的CIH病毒,是一个既破坏硬盘数据,又破坏主板BIOS数据的恶性病毒,以至于每当26日来临之机,各类媒体竞相告诫用户:清除CIH病毒或修改系统日历或26日仃用一天。

清除CIH病毒,当属最佳举动,然而并非每个用户都有杀毒软件;26日仃用一天,实属消极之举;只有更改系统日历才是任何用户都可实现的既简单又方便的方法。但是由于CMOS电池不足或石英晶振频率不准等原因,导致计算机系统日历超前或滞后一段时间,而此时用户却全然不知,这便给CIH病毒带来了发作的时机。因此用程序自动屏蔽26日,便成为本文所探讨的话题。

二.程序框图

为了保证屏蔽26日后系统日历的准确性,我们必须建立一个校正日历的标志,这个标志可以是硬盘上一个特定文件的存在状况(即文件的存在与否)或特定CMOS单元的内容状态(即1或0)。

用户在26日第一次开机时,程序便将系统日历加一天,并在硬盘上建立一个特定文件或在CMOS某保留单元中写入1,表示日历曾经加过1天,此后在除26、27日以外的任一次进入系统时,若发现存在此特定的文件或特定的CMOS单元内容为1时,便将日历减一天,使系统日历恢复正常,同时删除磁盘上特定的文件或向CMOS特定单元写入0。

文件标志校正法适用于对日历准确性要求不高的用户,因为硬盘上特定的文件易被用户删除。事实上要求不高时,更简单的方法是只屏蔽26日而不必考虑恢复系统日历。

CMOS标志校正法可以准确地校正日历,因为CMOS单元的内容不会被用户清除,即使用户修改CMOS参数,亦不会修改CMOS保留单元内容。CMOS有64个单元地址(十六进制为0~3FH),其中未用的保留区通常为1BH~2DH及34H~3FH。由于用户主板上BIOS版本各不一样,因而CMOS的保留区稍有区别。笔者主板上的BIOS版本为AWARD 4.51PG,保留区为34H~3AH。签于此,笔者还设计了一个CMOS参数显示程序,运行此程序后,显示数据为255(十六进制为FFH,即全1字节)的一段连续地址即为CMOS保留区,用户可选其中任一地址作为状态标志单元。

三.程序清单

1、CMOS标志校正法

本程序用Qbasic编制并调试通过,在QB4.0中编译为可执行文件。

DECLARE SUB changedate (plus)

DIM SHARED year AS INTEGER, month AS INTEGER, day AS INTEGER

CLS

year = VAL(RIGHT$(DATE$, 4))

month = VAL(LEFT$(DATE$, 2))

day = VAL(MID$(DATE$, 4, 2))

IF day = 26 THEN

  plus = 1

  CALL changedate(plus)             '日历加1天

  OUT &H70, &H34                    '写CMOS标志1

  OUT &H71, 1

ELSEIF day <> 27 THEN

  OUT &H70, &H34                    '读CMOS标志

  flag = INP(&H71)

  IF flag = 1 THEN

  plus = -1

  CALL changedate(plus)          '日历减1天

  OUT &H70, &H34                 '写CMOS标志0

  OUT &H71, 0

  END IF

END IF

DATA 31,28,31,30,31,30,31,31,30,31,30,31


SUB changedate (plus)

DIM monthday(12) AS INTEGER

FOR i = 1 TO 12

   READ monthday(i)

   IF (month=2) AND (year MOD 100<>0) AND (year MOD 4=0) OR ((year MOD 100=0) AND (year MOD 400=0)) THEN            '闰年2月为29天

      monthday(2) = 29

   END IF

NEXT

IF plus > 0 THEN

  IF day = monthday(month) THEN

     day = 1

     month = month + 1

     IF month >= 12 THEN

     month = 1

     year = year + 1

     END IF

  ELSE

     day = day + 1

  END IF

ELSE

  IF day = 1 THEN

     IF month - 1 <= 0 THEN

    year = year - 1

    month = 12

    day = monthday(12)

     ELSE

    month = month - 1

    day = monthday(month)

     END IF

  ELSE

     day = day - 1

  END IF

END IF

IF month < 10 THEN

  cmonth$ = "0" + MID$(STR$(month), 2, 1)

ELSE

  cmonth$ = RIGHT$(STR$(month), 2)

END IF

IF day < 10 THEN

  cday$ = "0" + MID$(STR$(day), 2, 1)

ELSE

  cday$ = RIGHT$(STR$(day), 2)

END IF

dates$ = cmonth$ + "-" + cday$ + "-" + RIGHT$(STR$(year), 4)

OPEN "day.26" FOR OUTPUT AS #1

PRINT #1, dates$

CLOSE #1

SHELL "date < day.26"                 '修改日历

END SUB

2、文件标志校正法

由于Qbasic没有日期运算函数而显程序太长,故本程序用Foxpro2.5编制并调试通过。

CLEAR

SET TALK OFF

SET CENTURY ON

SET DATE TO MDY

SET MARK TO '-'

SET SAFETY OFF

DO CASE

  CASE DAY(DATE())=26

       SET TEXTMERGE TO c:\date.26

       SET TEXTMERGE ON

       \\<<DATE()+1>>

       \<<>>

       SET TEXTMERGE TO

       RUN "date<c:\date.26"

       =FCREATE("c:\day-26")      && c:\day-26文件作为修改日历的标志

  CASE DAY(DATE())=27

       RETURN

  OTHERWISE

       IF FILE("c:\day-26")

          SET TEXTMERGE TO c:\date.26

          SET TEXTMERGE ON

          \\<<DATE()-1>>

          \<<>>

          SET TEXTMERGE TO

          RUN "date<c:\date.26"

          RUN "del c:\day-26"

      ENDIF

ENDCASE

3、CMOS数据显示程序

本程序用QB4.0编制,稍加修改后可作为保存和恢复CMOS数据的程序。

CLS

FOR I=1 TO &h3F STEP 3

OUT &H70,I

Flag1=INP(&H71)

OUT &H70,I+1

Flag2=INP(&H71)

OUT &H70,I+2

Flag3=INP(&H71)

PRINT HEX$(I);flag1, HEX$(I+1);flag2, HEX$(i+2);flag3

k$=INKEY$

NEXT

四.运行说明:

1、最好将屏蔽程序设为只读属性并放于autoexec.bat 的首行,将config.sys中所涉及到的可执行文件也设为只读属性,以免运行本程序前其它先行程序被感染。

2、据笔者了解,CIH病毒好象仅感染EXE可执行文件(不敢肯定),因此,建议将编译后的EXE文件用EXE2COM转换为COM文件(如果EXE文件长度小于64K的话),以增强安全性,而且,运行COM程序较运行EXE程序速度要快些。

3、据说CIH病毒有十多个变种,感染日期不限于26日,如果将上述程序稍加修改即可屏蔽其它日期, 以防新版CIH病毒发作,但修改程序不是一种好方法,因此如果读者有兴趣的话,可完善本程序,使之具有如下功能:

①.可屏蔽任意某几日,且屏蔽的日历由用户任意选定,这样不仅可防止CIH病毒发作,也可防止黑色星期五及6.4等其它以日历作触发条件的病毒发作。

②.屏蔽程序应在系统自举后,WIN9X引导前执行。