淘特ASP木马扫描器的代码
2018-09-06 10:09
  +-----------------+ 
|淘特ASP木马扫描器| 
+-----------------+ 
本程序可以扫描服务器上的所有指定类型(asp,cer,asa,cdx)的文件,查出可疑的木马程序。系统采用扫描程序与病毒库分离的形式, 
以后升级只需像杀毒软件那样升级病毒库就可以了。目前可以查杀所有流行的ASP木马程序。 
系统提供了全站扫描、按文件夹和指定文件扫描三种扫描方式,如果网站文件比较少的话,推荐使用全站扫描,如果文件比较多,推荐 
使用按文件夹扫描。扫描过程,系统会记录被扫描过的文件列表,同时对怀疑是木马程序的文件以列表的形式展现,为了便于比较最近有可能 
被上传过ASP木马程序,系统特别对当前时间7日内修改、创建的文件以加红显示;系统会对怀疑是木马的文件作出级别判断,并加以颜色区分 
;建议对级别为一般的程序作手动检查后,再作处理,对级别为严重的文件,可以点击文件名称下的文件链接,一般打开后木马程序都会 
有一个登录提示,这时就点击文件名称下的删除链接,直接将文件从服务器中删除即可。如果担心会误删除,可以先点击下载将文件备份。 
使用方法: 
将本程序解压后的文件上传至服务器中。执行:的网址/scan.asp 
+-----------------+ 
|登录密码:totscan| 
+-----------------+
virus_lib.asp
复制代码 代码如下:
<% 
dimvirus(1,7),virus_Regx(1,4) 
定义木马组件 
virus(0,0)=WScript 
virus(1,0)=级别:<fontcolor=green>严重!</font><br>WScript多为木马关键字 
virus(0,1)=Shell 
virus(1,1)=级别:<fontcolor=green>严重!</font><br>Shell多为木马关键字 
virus(0,2)=Shell.Application 
virus(1,2)=级别:<fontcolor=green>严重!</font><br>asp组件,一般多为木马所用 
海阳组件 
virus(0,3)=clsid:72C24DD5-D70A-438B-8A42-98424B88AFB8 
virus(1,3)=级别:<fontcolor=green>严重!</font><br>aspWScript组件,一般多为木马所用 
virus(0,4)=clsid:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B 
virus(1,4)=级别:<fontcolor=green>严重!</font><br>aspwscript组件,一般多为木马所用 
virus(0,5)=clsid:093FF999-1EA0-4079-9525-9614C3504B74 
virus(1,5)=级别:<fontcolor=green>严重!</font><br>aspnet组件,一般多为木马所用 
virus(0,6)=clsid:F935DC26-1CF0-11D0-ADB9-00C04FD58A0B 
virus(1,6)=级别:<fontcolor=green>严重!</font><br>aspnet组件,一般多为木马所用 
virus(0,7)=clsid:0D43FE01-F093-11CF-8940-00A0C9054228 
virus(1,7)=级别:<fontcolor=green>严重!</font><br>aspfso组件,一般多为木马所用 
定义木马关键字 
virus_Regx(0,0)=@\s*LANGUAGE\s*=\s*[]?\s*(vbscriptjscriptjavascript).encode\b 
virus_Regx(1,0)=级别:<fontcolor=green>严重!</font><br>脚本被加密了,一般ASP文件是不会加密的。 
virus_Regx(0,1)=\bEval\b 
virus_Regx(1,1)=级别:<fontcolor=gray>一般!</font><br>eval()函数可以执行任意ASP代码,被一些后门利用。其形式一般是:ev&al(X)<br>但是javascript代码中也可以使用,有可能是误报。 
virus_Regx(0,2)=[^.]\bExecute\b 
virus_Regx(1,2)=级别:<fontcolor=gray>一般!</font><br>execute()函数可以执行任意ASP代码,被一些后门利用。其形式一般是:ex&ecute(X)。 
virus_Regx(0,3)=Server.(ExecuteTransfer)([\t]*\()[^]\) 
virus_Regx(1,3)=级别:<fontcolor=gray>一般!</font><br>不能跟踪检查Server.e&xecute()函数执行的文件。请管理员自行检查。 
virus_Regx(0,4)=CreateObject[\t]*\(.*\)$[^adodb.recordset] 
virus_Regx(1,4)=级别:<fontcolor=gray>一般!</font><br>Crea&teObject函数使用了变形技术,仔细复查 
%>
scan.asp
复制代码 代码如下:
<%@LANGUAGE=VBSCRIPTCODEPAGE=936%> 
<!--#includefile=virus_lib.asp--> 
<% 
server.ScriptTimeout=90000 
dimact 
act=request.QueryString(act) 
ConstPASSWORD=totscan 
ifact=loginthen 
ifrequest.Form(pwd)=PASSWORDthensession(login)=ok 
endif 
%> 
<!DOCTYPEHTMLPUBLIC-//W3C//DTDHTML4.01Transitional//EN
<html> 
<head> 
<metahttp-equiv=Content-Typecontent=text/html;charset=gb2312> 
<title>Asp木马扫描器</title> 
<scriptlanguage=JavaScripttype=text/JavaScript> 
functionConfirmDel() 
{ 
if(confirm(确认删除?并且不能恢复!)) 
returntrue; 
else 
returnfalse; 
} 
</script> 
</head> 
<body> 
<divalign=center><h2>Asp木马扫描器</h2></div> 
<hr> 
<% 
IfSession(login)<>okthen 
callLoginForm() 
else 
dimpathStr 
ifrequest(path)<>then 
pathStr=request(path) 
else 
pathStr=server.MapPath(/) 
endif 
response.Write(<ahref=javascript:history.back();>←返回</a><br>&Chr(10)) 
ifact=scanthen 
dimScanFileType,Suspect,ScanFileNum,ScanFolderNum,BeginTime,EndTime,TmpPath,Report 
ScanFileType=asp,cer,asa,cdx 
Suspect=0 
ScanFileNum=0 
ScanFolderNum=0 
BeginTime=timer 
response.Write(<textareaname=textareastyle=width:100%rows=5>&Chr(10)) 
response.Write(扫描日志:&vbcrlf) 
if(request.QueryString(file)<>)then 
CallScanFile(request.QueryString(file),) 
else 
CallScanFolder(pathStr) 
endif 
response.Write(</textarea>) 
CallShowResult() 
EndTime=timer 
response.write<br><fontsize=2>执行时间:&cstr(int(((EndTime-BeginTime)*10000)+0.5)/10)&毫秒</font> 
elseifact=delthen 
CallDelFile(request.QueryString(file)) 
response.Write(<br><ahref=&request.ServerVariables(HTTP_REFERER)&>返回</a>) 
elseifact=downthen 
CallDownload(request.QueryString(file)) 
else 
callFileList(pathStr) 
callScanForm() 
endif 
endif 
%> 
<hr> 
</body> 
</html> 
<% 
SubLoginForm 
%> 
<formname=form1method=postaction=?act=login> 
<divalign=center>Password: 
<inputname=pwdtype=passwordsize=15> 
<inputtype=submitname=Submitvalue=提交> 
</div> 
</form> 
<% 
endSub 
SubScanForm 
%> 
<formaction=?act=scanmethod=post> 
<inputtype=submitvalue=全站扫描style=background:#fff;border:1pxsolid#999;padding:2px2px0px2px;margin:4px;border-width:1px3px1px3px/> 
</form> 
<% 
endsub 
遍历处理path及其子目录所有文件 
SubFileList(Path) 
SetFSO=CreateObject(Scripting.FileSystemObject) 
ifnotfso.FolderExists(path)thenexitsub 
Setfolders=FSO.GetFolder(Path)目录下所有对象 
Setfiles=folders.files 
Setsubfolders=folders.SubFolders 
列表文件夹 
ForEachflinsubfolders 
response.Write(<ahref=?act=scan&path=&Path&\&fl.name&>扫描</a><br>&Chr(10)) 
Next 
列表文件 
ForEachfile_finfiles 
response.Write(<imgsrc=images/file.gif>&file_f.name&&Chr(10)) 
response.Write(<ahref=?act=scan&file=&Path&\&file_f.name&>扫描</a><br>&Chr(10)) 
Next 
setfolders=nothing 
setfiles=nothing 
setsubfolders=nothing 
SetFSO=Nothing 
EndSub 
SubShowResult 
%> 
<tablewidth=100%border=0cellpadding=0cellspacing=0class=CContent> 
<tr> 
<tdclass=CPanelstyle=padding:5px;line-height:170%;clear:both;font-size:12px> 
扫描完毕!一共检查文件夹<fontcolor=#FF0000><%=ScanFolderNum%></font>个,文件<fontcolor=#FF0000><%=ScanFileNum%></font>个,发现可疑点<fontcolor=#FF0000><%=Suspect%></font>个 
</td></tr></table> 
<tablewidth=100%border=0cellpadding=0cellspacing=1style=padding:5px;background-color:#666666;line-height:18px;clear:both;font-size:12px> 
<tr> 
<tdwidth=30%bgcolor=#FFFFFF>文件名称</td> 
<tdwidth=20%bgcolor=#FFFFFF>特征码</td> 
<tdwidth=30%bgcolor=#FFFFFF>描述</td> 
<tdwidth=20%bgcolor=#FFFFFF>创建/修改时间</td> 
</tr> 
<p> 
<%=Report%> 
<br/> 
</p> 
</table> 
<% 
endSub 
遍历处理path及其子目录所有文件 
SubScanFolder(Path) 
dimfolders,files,subfolders 
ScanFolderNum=ScanFolderNum+1 
SetFSO=CreateObject(Scripting.FileSystemObject) 
ifnotfso.FolderExists(path)thenexitsub 
Setfolders=FSO.GetFolder(Path) 
Setfiles=folders.files 
ForEachmyfileinfiles 
IfCheckExt(FSO.GetExtensionName(path&\&myfile.name))Then 
CallScanFile(Path&\&myfile.name,) 
EndIf 
Next 
Setsubfolders=folders.SubFolders 
ForEachf1insubfolders 
ScanFolderpath&\&f1.name 
Next 
setfolders=nothing 
setfiles=nothing 
setsubfolders=nothing 
SetFSO=Nothing 
EndSub 
检测文件 
SubScanFile(FilePath,InFile) 
dimFSOs,ofile,filetxt,fileUri,vi 
ScanFileNum=ScanFileNum+1 
response.Write(扫描文件:&FilePath&vbcrlf) 
response.Flush() 
IfInFile<>Then 
Infiles=该文件被<ahref=文件包含执行 
EndIf 
SetFSOs=CreateObject(Scripting.FileSystemObject) 
onerrorresumenext 
setofile=fsos.OpenTextFile(FilePath) 
filetxt=Lcase(ofile.readall()) 
IferrThenExitSubendif 
iflen(filetxt)>0then 
特征码检查 
fileUri=<ahref=
fileUri=fileUri&操作:<ahref=?act=del&file=&FilePath&onClick=returnConfirmDel()>删除</a> 
fileUri=fileUri&<ahref=?act=down&file=&FilePath&>下载</a> 
forvi=0toubound(virus,2) 
Ifinstr(filetxt,Lcase(virus(0,vi)))then 
Report=Report&<trbgcolor=#FFFFFF><td>&fileUri&</td><td>&virus(0,vi)&</td><td>&virus(1,vi)&infiles&</td><td>创建:&GetDateCreate(filepath)&<br>修改:&GetDateModify(filepath)&</td></tr> 
Suspect=Suspect+1 
Endif 
next 
forvi=0toubound(virus_Regx,2) 
SetregEx=NewRegExp 
regEx.IgnoreCase=True 
regEx.Global=True 
regEx.Pattern=virus_Regx(0,vi) 
IfregEx.Test(filetxt)Then 
Report=Report&<trbgcolor=#FFFFFF><td>&fileUri&</td><td>&virus_Regx(0,vi)&</td><td>&virus_Regx(1,vi)&infiles&</td><td>创建:&GetDateCreate(filepath)&<br>修改:&GetDateModify(filepath)&</td></tr> 
Suspect=Suspect+1 
EndIf 
next 
Checkincludefile 
SetregEx=NewRegExp 
regEx.IgnoreCase=True 
regEx.Global=True 
regEx.Pattern=<!--\s*#include\s*file\s*=\s*.* 
SetMatches=regEx.Execute(filetxt) 
ForEachMatchinMatches 
tFile=Replace(Mid(Match.Value,Instr(Match.Value,)+1,Len(Match.Value)-Instr(Match.Value,)-1),/,\) 
IfNotCheckExt(FSOs.GetExtensionName(tFile))Then 
CallScanFile(Mid(FilePath,1,InStrRev(FilePath,\))&tFile,replace(FilePath,server.MapPath(\)&\,,1,1,1)) 
SumFiles=SumFiles+1 
EndIf 
Next 
SetMatches=Nothing 
SetregEx=Nothing 
Checkincludevirtual 
SetregEx=NewRegExp 
regEx.IgnoreCase=True 
regEx.Global=True 
regEx.Pattern=<!--\s*#include\s*virtual\s*=\s*.* 
SetMatches=regEx.Execute(filetxt) 
ForEachMatchinMatches 
tFile=Replace(Mid(Match.Value,Instr(Match.Value,)+1,Len(Match.Value)-Instr(Match.Value,)-1),/,\) 
IfNotCheckExt(FSOs.GetExtensionName(tFile))Then 
CallScanFile(Server.MapPath(\)&\&tFile,replace(FilePath,server.MapPath(\)&\,,1,1,1)) 
EndIf 
Next 
SetMatches=Nothing 
SetregEx=Nothing 
CheckServer&.ExecuteTransfer 
SetregEx=NewRegExp 
regEx.IgnoreCase=True 
regEx.Global=True 
regEx.Pattern=Server.(Exec&uteTransfer)([\t]*\().* 
SetMatches=regEx.Execute(filetxt) 
ForEachMatchinMatches 
tFile=Replace(Mid(Match.Value,Instr(Match.Value,)+1,Len(Match.Value)-Instr(Match.Value,)-1),/,\) 
IfNotCheckExt(FSOs.GetExtensionName(tFile))Then 
CallScanFile(Mid(FilePath,1,InStrRev(FilePath,\))&tFile,replace(FilePath,server.MapPath(\)&\,,1,1,1)) 
EndIf 
Next 
SetMatches=Nothing 
SetregEx=Nothing 
endif 
setofile=nothing 
setfsos=nothing 
EndSub 
检查文件后缀,如果与预定的匹配即返回TRUE 
FunctionCheckExt(FileExt) 
IfScanFileType=*ThenCheckExt=True 
Ext=Split(ScanFileType,,) 
Fori=0ToUbound(Ext) 
IfLcase(FileExt)=Ext(i)Then 
CheckExt=True 
ExitFunction 
EndIf 
Next 
EndFunction 
删除文件 
SubDelFile(FilePath) 
Setfso=Server.CreateObject(Scripting.FileSystemObject) 
iffso.FileExists(FilePath)then 
fso.DeleteFile(FilePath) 
Response.Write(<h2>成功删除文件:</h2>&FilePath) 
else 
response.Write(<h2>删除失败!文件:&FilePath&没有找到!</2>) 
endif 
setfso=nothing 
endSub 
下载文件 
subDownload(FilePath) 
dimoStream 
SetFSO=Server.CreateObject(Scripting.FileSystemObject) 
ifFSO.FileExists(FilePath)then 
setoStream=Server.CreateObject(ADODB.Stream) 
oStream.Type=1 
oStream.Open 
onerrorresumenext 
oStream.LoadFromFile(FilePath) 
ifErr.Number=0then 
Response.AddHeaderContent-Disposition,attachment;filename=&FSO.GetFileName(FilePath) 
Response.AddHeaderContent-Length,oStream.Size 
Response.BinaryWriteoStream.Read 
endif 
oStream.Close 
setoStream=nothing 
endif 
setFSO=nothing 
endsub 
FunctionGetDateModify(filepath) 
dims,days 
Setfso=CreateObject(Scripting.FileSystemObject) 
Setf=fso.GetFile(filepath) 
s=f.DateLastModified 
setf=nothing 
setfso=nothing 
days=DateDiff(d,Cdate(s),now()) 
if(days>-7anddays<7)then 
s=<fontcolor=red>&s&</font> 
endif 
GetDateModify=s 
EndFunction 
FunctionGetDateCreate(filepath) 
dims,days 
Setfso=CreateObject(Scripting.FileSystemObject) 
Setf=fso.GetFile(filepath) 
s=f.DateCreated 
setf=nothing 
setfso=nothing 
days=DateDiff(d,Cdate(s),now()) 
if(days>-7anddays<7)then 
s=<fontcolor=red>&s&</font> 
endif 
GetDateCreate=s 
EndFunction 
%>