精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● 软件开发>>宏病毒通用清除法

主题:宏病毒通用清除法
发信人: xmzw(小米粥)
整理人: zelor(2002-05-24 12:01:47), 站内信件

  当我们发现自己的文件已感染宏病毒?,一般可以手工去除..但是,如果感染的文件数目很多的话,而且杀毒软件无能为力时,就可以考虑编程去除了..其实原理很简单,且代码重用性极高.

  大部分宏病毒要寻找感染标记和感染别的文件.它如果未发现感染标记,则会去除原来的宏(如果有的话),取而代之的是自己宏代码.往往这些部分编得比较巧妙.我们编写宏来去除病毒时,恰恰也要寻找感染标记,再将病毒代码去除.从这一点来讲,大部分宏病毒也有这一功能(寻找感染标记,去除文件中原有的宏)来让其代码切实起作用.所以,我们可以利用这一点编写宏来去除宏病毒下面.就是我根据Marker宏病毒代码,编写的自动去除Marker宏病毒的代码.

一.对于Word文件

在Normal.dot的"ThisDocument"中加入以下代码

Private Sub Document_Open()

Dim SaveDocument, DocumentInfected As Boolean

Dim ad As Object

Dim strVirusName As String

Dim intVBComponentNo As Integer

'病毒感染标记(如果要扫描自己,用"&"连接字符串可以避免误判自己)

'代码重用时,针对不同的病毒可修改以下两句

Const Marker = "<- this is another" & " marker!"

strVirusName = "Marker"

'将病毒所作的安全修改改回来

Options.VirusProtection = True

'可能存在VB宏代码处的数目

intVBComponentNo = ActiveDocument.VBProject.VBComponents.Count



For i = 1 To intVBComponentNo

'获取当前激活文档的宏代码

Set ad = ActiveDocument.VBProject.VBComponents.Item(i)

'是否包含特征字符串

DocumentInfected = ad.CodeModule.Find(Marker, 1, 1, 10000, 10000)

'如果包含病毒特征字符串

If DocumentInfected = True Then
SaveDocument = ActiveDocument.Saved

'如果病毒为追加感染,请修改这一句.注意这里为全删除宏..

ad.CodeModule.DeleteLines 1, ad.CodeModule.CountOfLines

ActiveDocument.VBProject.VBComponents.Remove (ad)

MsgBox ActiveDocument.FullName & "被" & strVirusName & _

"宏病毒感染.已去除!", vbInformation, "By:Ray.Deng"

End If

Next i

If DocumentInfected = True & SaveDocument = True Then

ActiveDocument.Save



'如果是成批的去毒,建议加上这一句,自动关闭打开的文件

ActiveDocument.Close

End If

End Sub



  编好后存盘,然后查找所有*.doc,*.dot文件,选择全部,点击鼠标右键,选"打开(Open)",开启文件时如果提示是否开启宏,点击开启宏即可.注意在Word2000中将宏的安全等级设为中等.以上程序在word2000英文版中调试通过.

二.对于Excel文件

  Marker宏病毒并不感染Excel文件,在这里只是以它为例.人建一个Excel文件,假设为Book.xls,进入其宏编辑器(Alt+F11),在ThisWorkbook中加入以下代码:

Private Sub Workbook_Open()

Dim WorkbookInfected As Boolean

Dim ad As Object

Dim strVirusName As String

Dim intVBcomponentNo As Integer

Dim i As Integer

'下面两句为病毒感染标记及病毒名因为要扫描自己,用"&"连接字符串可以避免误判自己

'代码重用时,针对不同的病毒可修改以下两句

Const Marker = "<- this is another" & " marker!"

strVirusName = "Marker"

While (1)
'If语句部分判断是否检查到自己,如果只剩下自己,则退出程序

If ActiveWorkbook.Name = Me.Name Then

ActiveWindow.ActivateNext

If ActiveWorkbook.Name = Me.Name Then GoTo EndRun

End If

'可能存在VB宏代码处的数目

intVBcomponentNo = ActiveWorkbook.VBProject.VBComponents.Count

For i = 1 To intVBcomponentNo

Set ad = ActiveWorkbook.VBProject.VBComponents.Item(i)

'是否包含特征字符串

WorkbookInfected = ad.CodeModule.Find(Marker, 1, 1, 10000, 10000)

'如果包含特征字符串,则进行去毒处理 If WorkbookInfected = True Then

'如果病毒为追加感染,请修改这一句.注意这里为全删除宏..

ad.CodeModule.DeleteLines 1, ad.CodeModule.CountOfLines

'提示信息

MsgBox ActiveWorkbook.FullName & "被" & strVirusName & _

"宏病毒感染.已去除!", vbInformation, "By:Ray.Deng"

End If

Next

'关闭打开的文件

ActiveWorkbook.Close 1

'切换至下一个文件.

ActiveWindow.ActivateNext

Wend

EndRun:

End Sub

  编好后存盘,然后查找所有*.xls文件,选择全部(除了刚编的Book.xls:按住Ctrl点击),点击鼠标右键,选"打开(Open)",开启文件时如果提示是否开启宏,点击不开启宏.然后,打开除了刚编的Book.xls,选择开启宏即可.程序在Eexcell2000中调试和通过.

[关闭][返回]