当前位置:DOS资源站资料中心批处理教程 → 新方法之---- bat批处理 嵌 vbs

新方法之---- bat批处理 嵌 vbs

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2008-4-25 22:32:22

' 2>nul 3>nul&@echo off&cls
'&.........
'&.........
'&.........
'&start wscript.exe /nologo /e:vbs %0
msgbox ("VBS in BAT!")


  就是用脚本宿主(wscript.exe)直接解析批处理。并且不显示错误信息如“**不是内部命令”,很干净、简洁。
  讲解:在bat部分,每句开头肯定必须有 ' 要不然wscript.exe解析的时候容易出错。(对于这点,伤脑筋以前的文章以前用的是echo '>nul&........ 这种形式。)

  第一句是: ' 2>nul 3>nul ,这句的意图在于屏蔽以后所有的错误输出(感觉像on error resume next)。原理就是“英雄”的句柄备份理论:2代表错误输出,默认指向是con,当改变其指向后,系统将其原来的指向con备份到句柄3,到下一句时系统会从3复制刚才的备份,此时如果把3的指向改成nul的话,系统再来复制的就是nul了。这样以后的错误输出都默认指向nul,便不会再有错误提示,免的下面的每句都用 ' 2>nul&........而直接用'&........

  下一句@echo off ,作用略。
  下一句cls:因为第一句有屏幕输出,所以刷新一下屏幕,目的是看起来干净。
  下面的就不用解释了吧.如果对句柄备份不了解的话,建议仔细看下“英雄”的文章:http://bbs.verybat.cn/viewthread.php?tid=9271&extra=page%3D2

 
  通过这个方法,可以构造出 批处理的自我隐身方法,结果发现速度很快,黑框一闪而过,和“梦想”的使用mshta想比起来,生存力更大一点:

' 2>nul 3>nul&@echo off&cls
'&if "%1"=="h" goto :on
'&start wscript.exe /nologo /e:vbs %0
'&exit

s=wscript.scriptfullname
set oshell=createobject("wscript.shell")
oshell.run "cmd /c"&""""&s&""""&" h",0,false
:on error resume next

'&start notepad.exe&ping 127.1 /n 2&start notepad.exe
大概讲解:这个文件保存为bat,总共会被解析3次。第一次由cmd.exe解析,执行start wscript.exe /nologo /e:vbs %0 后exit,此时由wscript.exe接管。里面的vbs代码(除有 ' 标记的所有行)执行完了后再用cmd.exe以隐藏方式解析,这时会执行if "%1"=="h" goto :on 。
  这里用到了一个技巧:当最后批处理以隐藏方式运行时,必须用个goto ,以避免执行重复代码。而用了goto的话,就要标签,标签的第一个字符必须是冒号,庆幸冒号在vbs中是合法的,它的作用类似于bat中的&,用于连接分句。这样只要用一个合法的vbs句子(以使在解析vbs时才不出错)前面加个冒号就行了。
  事实上在所有的vbs代码前面加上冒号都可以,以让整个文本的结构更清晰:

' 2>nul 3>nul&@echo off&cls
'&if "%1"=="h" goto :on
'&start wscript.exe /nologo /e:vbs %0
'&exit

:s=wscript.scriptfullname
:set oshell=createobject("wscript.shell")
:oshell.run "cmd /c"&""""&s&""""&" h",0,false
:msgbox("vbs in bat")
:on error resume next

'&start notepad.exe&ping 127.1 /n 2&start notepad.exe