由于时间紧迫,要为一个小公司建立站点,迫不得已用了风讯4.0 sp7
看来是国内比较好的免费CMS了,拿下来那当然要修改了,但是在我改代码的过程中发现了太多奇怪的代码,很多垃圾代码(暂时姑且说是垃圾代码吧),很多大段大段注释掉的代码.我看不明白,因为程序相当的不具可读性...
偶然间我发现管理后台有个JS 发送我的服务器信息等到风讯,这引起了我的高度重视
于是我开始查找里面的变量 包括 MF_Site_lock FoosunMFEmail COOKIES等..这一找不要紧,发现 SYSINFO.asp里面检测版本的函数找不到,接着我就一个一个函数的倒推,让我发现了风讯代码的 无聊之处,就是隐藏部分代码从而悄悄发送信息到他服务器,尤其email 要知道站长的email是很重要的,现在我把这些部分代码贴出来,
首先在 sysinfo.asp里面检测版本的这段JS
它没有直接写文件名字,而是办ASIIC 代码中 getinfo的地址转换出来就是SysCheckVer.asp
这个AJax传递数据的文件找到了,打开SysCheckVer.asp一看: OH..GOD 这么长的代码 首先是Function Replace_MF_default_Flag 这个干什么的,定义了大堆的变量,但是找不到和版本相关的东西,代码拉到最后才发现,上面这些都是没有用的,风讯骗人的玩意儿...
Str_Act = Trim(Request.Form("Act"))
If Str_Act = "" Then Str_Act = "Ver"
Select Case Str_Act
Case "Ver"
StrInfo = Str_get(1)
Case "News"
StrInfo = Str_get(2)
Case Else
StrInfo = "||"
End Select
StrInfo = Split(StrInfo,"||")
If StrInfo(0)="True" Then
Response.Write "True||"&Str_Act&"||"&StrInfo(1)
ElseIf StrInfo(0)="False" Then
Response.Write "False||"&Str_Act&"||"
End If
这里才是关键,检测版本了,那么回到上面那个
tring.fromCharCode(65,99,116,61,86,101,114)是Act=Ver,String.fromCharCode(65,99,116,61,78,101,119,115)是Act=News
现在分析这个运作过程.FS_InterFace/MF_Function.asp里找到
噢噢...这里就是收集信息的东东了, 那么这几个 SESSION值就有得解释了..
它会收集服务器的IP、服务器域名、服务器端口、序列号。调用GetInfo()过程,
GetInfo()在FS_Inc/Function.asp里
Function GetInfo(GetPath)
Dim http,ErrContentLength,Report,ContentLength,ErrContent
ErrContent = ""
On Error Resume Next
Response.Clear
Set http=Server.CreateObject("Microsoft.XMLHTTP")
If Err Then
Err.Clear
Set http = Server.CreateObject("Msxml2.XMLHTTP")
If Err Then
ErrContent = "服务器不支持XML对象"
Err.Clear
End If
End If
If ErrContent<>"" Then
GetInfo = "False||"&ErrContent
Else
http.Open "GET",GetPath,False
http.Send
If http.readyState<>4 Then
GetInfo = "False||读取失败"
Else
GetInfo = "True||"&http.ResponseText
End If
End If
End Function
这个GetInfo(GetPath)就是使用XML通过GET方式访问,然后返回信息。参数GetPath就是要访问的地址,再往回看Str_get(Number)调用GetInfo()是这样的Str_get = GetInfo(Recv(a)&Recv(b)&Str_Para),再查找过程Recv(),也是在FS_Inc/Function.asp里
Function Recv(Str_Number)
Dim Arr_Number,Str_Return,Temp_i
Arr_Number = Split(Str_Number,chr(108))
Str_Return = ""
For Temp_i = LBound(Arr_Number) To UBound(Arr_Number)
Str_Return = Str_Return & Chr(Arr_Number(Temp_i)+31)
Next
Recv = Str_Return
End Function
Recv(Str_Number)就是还原字符串,通过ASCII码加31。现在主要就是要知道Str_get(Number)里的Session("SessionCode")、Session("SessionComm")、Session("SessionComV")、Session("SessionComN")里什么值了,使用Response.Write写出来,得到
Session("SessionCode")="111-1111111111111"
Session("SessionComm")="73l85l85l81l27l16l16l81l66l84l84l81l80l83l85l15l71l80l80l84l86l79l15l79l70l85l16"
Session("SessionComV")="87l70l83l15l66l84l81"
Session("SessionComN")="79l70l88l84l15l66l84l81"
这些值通过Recv(Str_Number)还原,得到
Recv(Session("SessionComm"))="http://passport.foosun.net/"
Recv( Session("SessionComV"))="ver.asp"
Recv( Session("SessionComN"))="news.asp"
而且大家都知道 小写"L" 和"1"长得很像,想让人看到迷惑就放弃分析...哎
累人啊 .
同时我还发现了一个检测SESSION的地方 真不知道风讯程序员是干什么这么无聊
当然我要说这代码还是有一定的技术含量,但是我们写程序是为了要程序的执行效率高,而不是绕过去绕过来的增加服务器的负荷,在风讯的代码里面 这样绕来绕去的代码太多了,还有大量的代码由于什么问题注释掉了 也不说明,或者直接删除,代码巨大. 在数据库里面有些表直接没有用到..... 几个public里面大量重复代码. 我不知道为什么这样一个 私下悄悄收集用户信息的程序,一个绕来绕去增加服务器负担的程序,一个有着大量垃圾代码的程序,一个说着开源却故意让人看不懂的程序,可以如此招摇的走到今天,
我是一个新手,或许我还不会怎么写程序,但是我们写一个程序的原则是要具备可读性,高效性这道理我知道.记得N年前上学的时候老师就告诉我们,别人用几十行代码可以解决的你如果用了几百行代码,执行通过了你也是失败的,一个程序不仅要达到功能 还要满足效率...
算了,51休息随便写两句...工作又要开始忙了.....