
提示:
本文不会写出详细分析过程,只是会大略的提一下,这方面的东西比较敏感,我本人也很痛恨伸手党,相关内容点到为止,具体的自己看一下就知道了,如果肯你花时间自己研究半个小时,你会理解的比我还透彻!
(PS:以前也可能有人写过此类文章吧 ,内行看门道,外行看热闹吧……)
因某些业务需要,需要开发一套与百度知道相关的软件(功能你懂的),其中某个环节需要分析百度知道提问数据格式及算法,以下是分析过程……
首先通过某些方法得到百度知道提问时网页提交的数据,以及对应的加密方法,其实就是一个js脚本,流程如下(部分分析日志):
<!--
--------------------------------------------------------------
重要代码:
--------------------------------------------------------------
1、页面底部载入了关键 js 脚本:
<script src="http://iknow.bdimg.com/new/js/new.js?@=1dbeamp" type="text/javascript"></script>
2、http://iknow.bdimg.com/new/js/new.js 载入了关键提问算法:
document.write('<script type="text/javascript" src="http://iknow.bdimg.com/base/js/ut.js"><\/script>');
3、base/js/ut.js 为关键参数“utdata”的加密算法。
…… 省略 ……
--------------------------------------------------------------
ut.js 算法核心代码:
--------------------------------------------------------------
1、行数:2,代码:var START=new Date().getTime()
时间戳,当前时间距1970年1月1日午夜(GMT时间)之间的毫秒数。
功能:记录页面运行的起始时间,并加入最后提交的参数之中,在函数 N() 中:(new Date()).getTime()-START
用来判断用户在页面停留了多久,区分****************,这是影响***及***的关键参数!!!!
2、行数:11,代码:var J=(new Date()).getTime();
时间戳,当前时间距1970年1月1日午夜(GMT时间)之间的毫秒数。
功能:用来做校验值,并用于最后参数加密操作,此值为关键数值。
3、关键运算函数:N()、D(Z)
…… 省略 ……
-->
加密算法函数为“D(Z)”,其实是很简单的一个加密算法:
function D(Z){//最终加密函数var U=[];var X={};var Y=J%100;//时间戳除以100,取余数for(var W=0,V=Z.length; W<V; W++){var a=Z.charCodeAt(W)^Y;
U.push(a);if(!X[a]){
X[a]=[]}
X[a].push(W)}return U
}
核心算法代码只有一行,重点不在这里,在对其原始明文数据分析之后,得出了一个很狗血的结论……
提交的原始数据包:
------------------------------------------------------------------------------------提交数据:------------------------------------------------------------------------------------
POST /submit/ajax?jasmine=1 HTTP/1.1Host: zhidao.baidu.com
User-Agent:Mozilla/5.0(Windows NT 6.1; rv:9.0)Gecko/20100101Firefox/9.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://zhidao.baidu.com/new?word=
Content-Length: 【425】
Cookie: **************************
Pragma: no-cache
Cache-Control: no-cache
cm=100001&query=&title=【问题内容,长度50字节】&detail=<p><br%20%2F><%2Fp>&cid=【问题分类ID】&pid=&wealth=【财富悬赏】&team=&teamid=&anoy=0&fix=&utdata=101,106,106,126,103,106,107,91,96,126,96,126,96,126,96,126,96,126,96,126,97,126,102,126,102,126,102,91,102,96,97,99,97,91,99,102,102,98,126,107,98,98,13439812833821&fr=&querytype=&psquery=&rich=1&testcase=1&usnsqflag=
------------------------------------------------------------------------------------
返回数据:
------------------------------------------------------------------------------------
HTTP/1.1 200 OK
Content-type: text/html;charset=GBK
Content-Length: 249
Connection: Keep-Alive
Date: Fri, 03 Aug 2012 08:08:46 GMT
Server: apache
{"errorNo" : "0"
,"data" : {
"cm" : "100001"
,"qid" : "*********"
,"cid" : "440"
,"check" : ""
,"image" : ""
,"title" : "********************"
}}
都是一些很简单的参数,文中有部分说明……
重要的参数是:utdata,收集了一组测试数据之后,进行了解密(见上图),然后狗血了……
例如:
//密文109,111,110,118,108,104,98,83,105,118,105,118,105,118,105,118,104,118,104,118,104,118,104,118,104,118,110,83,105,105,108,107,110,83,107,110,110,106,118,99,106,106,13442338918901
M =1//某个防机器人参数,不解释Key=90//加密密匙//很有意思的明文754,6283,3,3,3,2,2,2,2,2,4336141440,900
明文:754,628 3,3,3,3,2,2,2,2,2,4 33614 1440,900
格式:鼠标运行轨迹坐标 chr(9) 网页某些元素排序 chr(9) 用户在页面停留的毫秒数 chr(9) 用户屏幕分辨率
呵呵,这其中隐藏着一个很“牛逼”的防机器人策略……
可以自己思考一下……
(第一回合:百度某工程师彻底败北)