IT学习者 | 文章大全 | 技术文档 | 桌面壁纸 | 实用查询 | 网络电台 | 成语 | 歇后语 | 网址 | 下载 | 周公解梦 | 生日密码 | 电视剧365 | Flash
 您现在的位置: IT学习者 >> 文章大全 >> 网页制作 >> 网页特效代码

深入挖掘Windows脚本技术

【 来源:网络  更新时间:2008-2-27 | 字体:
【来做个后门】

在讨论脚本后门前,先要介绍一类很有用的WMI对象。事实上,这才是本节的关键。脚本后门不过是它的一个应用而已。

前面已经说过,WMI是事件驱动的。整个事件处理机制分为四个部分:

1,事件生产者(provider):负责产生事件。WMI包含大量的事件生产者。有性能计数器之类的具体的事件生产者,也有类、实例的创建、修改、删除等通用的事件生产者。

2,事件过滤器(filter):系统每时每刻都在产生大量的事件,通过自定义过滤器,脚本可以捕获感兴趣的事件进行处理。

3,事件消费者(consumer):负责处理事件。它可以是可执行程序、动态链接库(dll,由WMI服务加载)或者脚本。

4,事件绑定(binding):通过将过滤器和消费者绑定,明确什么事件由什么消费者负责处理。

事件消费者可以分为临时的和永久的两类。临时的事件消费者只在其运行期间关心特定事件并处理。永久消费者作为类的实例注册在WMI名字空间中,一直有效直到它被注销。显然,永久事件消费者更具实用性。还是来看个例子:

nslink="winmgmts:\\.\root\cimv2:"         '只需要本地连接,所以用这种语法,不用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)默认没有被安装到root\cimv2名字空间。

用记事本打开%windir%\system32\wbem\scrcons.mof,将第一行“#pragma namespace ("\\\\.\\Root\\Default")”删除,或者修改为“#pragma namespace ("\\\\.\\Root\\cimv2")”。XP/2003没有这一行,不用修改。

然后执行下面这个命令:

C:\WINNT\system32\wbem>mofcomp.exe -N:root\cimv2 scrcons.mof

Microsoft (R) 32-bit MOF 汇编器版本 1.50.1085.0007

版权所有 (c) Microsoft Corp. 1997-1999。保留所有权利。

正在分析 MOF 文件: scrcons.mof

MOF 文件分析成功

将数据储存到储备库中...

已完成!

这样就把ASEC安装到root\cimv2了。mofcomp.exe和scrcons.mof都是系统自带的。

2000默认将ASEC安装到root\default名字空间,而XP/2003默认已经安装到root\subscription名字空间,但由于事件过滤器不能跨名字空间捕捉事件(XP/2003可以),事件绑定也不能跨名字空间,而大部分事件都在root\cimv2产生,所以需要重新安装ASEC到事件源所在的名字空间。下面这个脚本自动完成ASEC重安装任务。

set shl=createobject("WScript.Shell")

set fso=createobject("Scripting.FileSystemObject")

path=shl.expandenvironmentstrings("%windir%\system32\wbem\")

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:root\cimv2 "&mofp,0,true      '安装到root\cimv2'

fso.deletefile(mofp)

wscript.echo "安装完成"

注销永久事件:

nslink="winmgmts:\\.\root\cimv2:"

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里当然更全面。我就点到为止了。

(看累了吧,喝口水,休息一下 ^_^)

文章共6页,当前在第4页 9 7 [1] [2] [3] [4] [5] [6] 8 :
相 关 文 章
没有相关文章
相 关 软 件

音乐
画心 放生 天亮了 牡丹江 那滋味 擦肩而过 放手去爱 北京欢迎你 依然在一起 吻得太逼真 牵手的右前方 坐上火车去拉萨 如果爱能早些说出来
心碎 稻香 从新爱 别碰我 魔杰座 红楼梦中 为你而活 一定要爱你 等爱的玫瑰 失落非主流 越单纯越幸福 最后一次的温柔 孤独的时候可以抱你
光荣 火花 下雨天 小酒窝 樱花草 为你写诗 无可取代 无情的温柔 寂寞才说爱 忘不掉的伤 爱上你是个错 陪你一起看草原 地球人都知道我爱你
假如 相思 女儿红 有缘人 舍不得 我的答铃 如何是好 外滩十八号 我们的纪念 摇滚怎么了 和寂寞说分手 爱上你是我的错 爱情里没有谁对谁错
加入收藏留言建议自助友情链接普通友情链接站长的Blog
版权所有   COPYRIGHT 2002-2008 ★IT学习者★ ALL RIGHTS RESERVED.