T086学习网 | 站长学院 | 技术文档 | 成语 | 歇后语 | 帝国时代 | 代码收藏 | IP地址查询 | 生活百科 | 生日密码 | CSS压缩 | 用户评论 | 欣欣百宝箱

深入挖掘Windows脚本技术

【 网络作者:佚名 更新时间:2008-02-27 | 字体:
[导读]【目录】 1,前言 2,回顾WSH对象 3,WMI服务 4,脚本也有GUI 5,反查杀 6,来做个后门 7,结语 8,参考资料 【前言】 本文讲述一些Windows脚本编程的知识和技巧。这里的Windows脚本是指 Windows Script Host (WSH W...
【来做个后门】

在讨论脚本后门前,先要介绍一类很有用的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里当然更全面。我就点到为止了。

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

上一页 [1] [2] [3] 4 [5] [6] 下一页
  • 转载请注明来源:IT学习网 网址:http://www.t086.com/ 向您的朋友推荐此文章
  • 特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系我们,我们会尽快予以更正。
  • 了解这些字:
  • 更多
    留言建议ASP探针PHP探针站长Enjoy的Blog
    © 2017 T086学习网 - T086.com(原itlearner.com)
    RunTime:19.42ms QueryTime:7