发信人: xmzw(小米粥)
整理人: fishy(2001-05-18 19:23:17), 站内信件
|
当我们发现自己的文件已感染宏病毒?,一般可以手工去除..但是,如果感染的文件数目很多的话,而且杀毒软件无能为力时,就可以考虑编程去除了..其实原理很简单,且代码重用性极高.
大部分宏病毒要寻找感染标记和感染别的文件.它如果未发现感染标记,则会去除原来的宏(如果有的话),取而代之的是自己宏代码.往往这些部分编得比较巧妙.我们编写宏来去除病毒时,恰恰也要寻找感染标记,再将病毒代码去除.从这一点来讲,大部分宏病毒也有这一功能(寻找感染标记,去除文件中原有的宏)来让其代码切实起作用.所以,我们可以利用这一点编写宏来去除宏病毒下面.就是我根据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中调试和通过. |
|