深入挖掘Windows脚本技术
在讨论脚本后门前,先要介绍一类很有用的WMI对象。事实上,这才是本节的关键。脚本后门不过是它的一个应用而已。
前面已经说过,WMI是事件驱动的。整个事件处理机制分为四个部分:
1,事件生产者(provider):负责产生事件。WMI包含大量的事件生产者。有性能计数器之类的具体的事件生产者,也有类、实例的创建、修改、删除等通用的事件生产者。
2,事件过滤器(filter):系统每时每刻都在产生大量的事件,通过自定义过滤器,脚本可以捕获感兴趣的事件进行处理。
3,事件消费者(consumer):负责处理事件。它可以是可执行程序、动态链接库(dll,由WMI服务加载)或者脚本。
4,事件绑定(binding):通过将过滤器和消费者绑定,明确什么事件由什么消费者负责处理。
事件消费者可以分为临时的和永久的两类。临时的事件消费者只在其运行期间关心特定事件并处理。永久消费者作为类的实例注册在WMI名字空间中,一直有效直到它被注销。显然,永久事件消费者更具实用性。还是来看个例子:
nslink="winmgmts:\. ootcimv2:" '只需要本地连接,所以用这种语法,不用swbemlocator对象'
set asec=getobject(nslink&"ActiveScriptEventConsumer").spawninstance_ '创建“活动脚本事件消费者”'
asec.name="stopped_spooler_restart_consumer" '定义消费者的名字'
asec.scriptingengine="vbscript" '定义脚本语言(只能是vbscript)'
asec.scripttext="getobject(""winmgmts:win32_service='spooler'"").startservice" '脚本代码'
set asecpath=asec.put_ '注册消费者,返回其链接'
set evtflt=getobject(nslink&"__EventFilter").spawninstance_ '创建事件过滤器'
evtflt.name="stopped_spooler_filter" '定义过滤器的名字'
qstr="select * from __instancemodificationevent within 5 " '每5秒查询一次“实例修改事件”'
qstr=qstr&"where targetinstance isa ""win32_service"" and " '目标实例的类是win32_service'
qstr=qstr&"targetinstance.name=""spooler"" " '实例名是spooler'
qstr=qstr&"and targetinstance.state=""stopped""" '实例的state属性是stopped'
evtflt.query=qstr '定义查询语句'
evtflt.querylanguage="wql" '定义查询语言(只能是wql)'
set fltpath=evtflt.put_ '注册过滤器,返回其链接'
set fcbnd=getobject(nslink&"__FilterToConsumerBinding").spawninstance_ '创建过滤器和消费者的绑定'
fcbnd.consumer=asecpath.path '指定消费者'
fcbnd.filter=fltpath.path '指定过滤器'
fcbnd.put_ '执行绑定'
wscript.echo "安装完成"
这个脚本的效果是:当“后台打印”服务(spooler)状态改变为停止时,消费者将进行处理——重启spooler。
先net start spooler,然后net stop spooler。最多5秒钟,spooler又会启动。
直接运行上面的脚本会出错,因为“活动脚本事件消费者”(ActiveScriptEventConsumer ASEC)默认没有被安装到rootcimv2名字空间。
用记事本打开%windir%system32wbemscrcons.mof,将第一行“#pragma namespace ("\\.\Root\Default")”删除,或者修改为“#pragma namespace ("\\.\Root\cimv2")”。XP/2003没有这一行,不用修改。
然后执行下面这个命令:
C:WINNTsystem32wbem>mofcomp.exe -N:rootcimv2 scrcons.mof
Microsoft (R) 32-bit MOF 汇编器版本 1.50.1085.0007
版权所有 (c) Microsoft Corp. 1997-1999。保留所有权利。
正在分析 MOF 文件: scrcons.mof
MOF 文件分析成功
将数据储存到储备库中...
已完成!
这样就把ASEC安装到rootcimv2了。mofcomp.exe和scrcons.mof都是系统自带的。
2000默认将ASEC安装到rootdefault名字空间,而XP/2003默认已经安装到rootsubscription名字空间,但由于事件过滤器不能跨名字空间捕捉事件(XP/2003可以),事件绑定也不能跨名字空间,而大部分事件都在rootcimv2产生,所以需要重新安装ASEC到事件源所在的名字空间。下面这个脚本自动完成ASEC重安装任务。
set shl=createobject("WScript.Shell")
set fso=createobject("Scripting.FileSystemObject")
path=shl.expandenvironmentstrings("%windir%system32wbem"")
set mof=fso.opentextfile(path&"scrcons.mof",1,false,-1) 'mof都是Unicode格式的'
mofs=mof.readall
mof.close
mofs=replace(mofs,"\Default","\cimv2",1,1) '替换默认的名字空间'
mofp=path&"asecimv2.mof"
set mof=fso.createtextfile(mofp,false,true) '创建临时mof文件'
mof.write mofs
mof.close
shl.run path&"mofcomp.exe -N:rootcimv2 "&mofp,0,true '安装到rootcimv2'
fso.deletefile(mofp)
wscript.echo "安装完成"
注销永久事件:
nslink="winmgmts:\. ootcimv2:"
myconsumer="stopped_spooler_restart_consumer" '指定消费者的名字'
myfilter="stopped_spooler_filter" '指定过滤器的名字'
set binds=getobject(nslink&"__FilterToConsumerBinding").instances_
for each bind in binds
if strcomp(right(bind.consumer,len(myconsumer)+1),myconsumer&chr(34),1)=0 _
and strcomp(right(bind.filter,len(myfilter)+1),myfilter&chr(34),1)=0 then
getobject("winmgmts:"&bind.consumer).delete_ '删除消费者'
getobject("winmgmts:"&bind.filter).delete_ '删除过滤器'
bind.delete_ '删除绑定'
exit for
end if
next
wscript.echo "卸载完成"
除了ASEC,WMI还提供其他永久事件消费者,比如SMTPEventConsumer。当系统出现异常时,可以通过它自动给管理员的信箱发信。WMITools里的WMI Event Registration用于创建、修改、删除指定名字空间里的永久事件消费者、事件过滤器和计时器事件源的实例,以及绑定或解除绑定它们。
关于事件处理机制的各个部分,在《WMI技术指南》里有详细的讲述,MSDN里当然更全面。我就点到为止了。
(看累了吧,喝口水,休息一下 ^_^)
- 转载请注明来源:IT学习网 网址:http://www.t086.com/ 向您的朋友推荐此文章
- 特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系我们,我们会尽快予以更正。
- 上一篇:刷人气代码
- 下一篇:阿飞:百度还应该收购谁?
- 查看2008年02月的文章归档