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