反爬 JavaScript加密混淆

当爬取网站时,网站会返回5XX响应码和一段JavaScript响应报文,浏览器会加载该段js ,往往在这些js中会包含定时刷新重定向、cookie等信息,刷新后,浏览器自动会使用新的cookie访问服务器获取真正的请求。

如下示例:

HTTP/1.1 521

仔细分析上述js代码, 其定义了变量x,y ,z ,真正有用的是后面eval里的代码,但具体什么鬼我们看不出来。 最好的方式是加载改段js ,看看其返回的真正信息。

    soup = BeautifulSoup(resstr, "lxml")
    
    fstr = soup.script.string
    print(fstr)
    fstr = fstr.replace('try{eval(','try{return(')

    pjsctx = execjs.get("Phantomjs")
    
    c1=pjsctx.compile(fstr)
    
    evaled_func=c1.call('f') 

使用BeautifulSoup解析响应报文, 取js代码, 将eval替换为return , 使用execjs的Phantomjs环境编译并执行之。

结果如下:

var _1w=function(){setTimeout('location.href=location.pathname+location.search.replace(/[\?|&]captcha-challenge/,\'\')',1500);document.cookie='__jsl_clearance=1528423274.136|0|'+(function(){var _2a=[function(_1w){return eval('String.fromCharCode('+_1w+')')},(function(){var _1w=document.createElement('div');_1w.innerHTML='_d';_1w=_1w.firstChild.href;var _2a=_1w.match(/https?:\/\//)[0];_1w=_1w.substr(_2a.length).toLowerCase();return function(_2a){for(var _d=0;_d<_2a.length;_d++){_2a[_d]=_1w.charAt(_2a[_d])};return _2a.join('')}})()],_d=[[[(+!'')]+(~~{}+[])+[-~(-~[]-~[[(+!'')+(+!'')]*(((+!'')+[-~-~[]]>>-~-~[]))])],(4+[]+[])+[-~(-~[]-~[[(+!'')+(+!'')]*(((+!'')+[-~-~[]]>>-~-~[]))])],[((+!'')+[(-~{}<<-~{})])/[(-~{}<<-~{})]]+[-~(-~[]-~[[(+!'')+(+!'')]*(((+!'')+[-~-~[]]>>-~-~[]))])],[((+!'')+[(-~{}<<-~{})])/[(-~{}<<-~{})]]+[((+!'')+[(-~{}<<-~{})])/[(-~{}<<-~{})]],(-~[-~[[(+!'')+(+!'')]*(((+!'')+[-~-~[]]>>-~-~[]))]]+[]+[[]][0])+[-~(-~[]-~[[(+!'')+(+!'')]*(((+!'')+[-~-~[]]>>-~-~[]))])],[(+!'')]+[2]+[(+!'')],[(+!'')]+(~~{}+[])+[2],(-~[-~[[(+!'')+(+!'')]*(((+!'')+[-~-~[]]>>-~-~[]))]]+[]+[[]][0])+[-~(-~[]-~[[(+!'')+(+!'')]*(((+!'')+[-~-~[]]>>-~-~[]))])],(((+!'')+[-~-~[]]>>-~-~[])+(+!'')+(+!'')+(+!'')+(+!'')+[])+[((+!'')+[(-~{}<<-~{})])/[(-~{}<<-~{})]]],[[(+!'')]+(4+[]+[])],[[(+!'')]+[2]+[2],(-~[-~[[(+!'')+(+!'')]*(((+!'')+[-~-~[]]>>-~-~[]))]]+[]+[[]][0])+((2^-~[])+[]),(-~[-~[[(+!'')+(+!'')]*(((+!'')+[-~-~[]]>>-~-~[]))]]+[]+[[]][0])+[-~!/!/+(+!'')+((-~{}<<-~{})^-~[])],[-~!/!/+(+!'')+((-~{}<<-~{})^-~[])]+(~~{}+[]),[-~!/!/+(+!'')+((-~{}<<-~{})^-~[])]+(4+[]+[]),[-~(-~[]-~[[(+!'')+(+!'')]*(((+!'')+[-~-~[]]>>-~-~[]))])]+(~~{}+[]),(-~[-~[[(+!'')+(+!'')]*(((+!'')+[-~-~[]]>>-~-~[]))]]+[]+[[]][0])+(~~{}+[]),((2^-~[])+[])+(((+!'')+[-~-~[]]>>-~-~[])+(+!'')+(+!'')+(+!'')+(+!'')+[]),[-~!/!/+(+!'')+((-~{}<<-~{})^-~[])]+(~~{}+[]),[((+!'')+[(-~{}<<-~{})])/[(-~{}<<-~{})]]+[((+!'')+[(-~{}<<-~{})])/[(-~{}<<-~{})]],[(+!'')]+[2]+[2],[(+!'')]+(~~{}+[])+[-~(-~[]-~[[(+!'')+(+!'')]*(((+!'')+[-~-~[]]>>-~-~[]))])]],[(4+[]+[])],[(((+!'')+[-~-~[]]>>-~-~[])+(+!'')+(+!'')+(+!'')+(+!'')+[])+[-~(-~[]-~[[(+!'')+(+!'')]*(((+!'')+[-~-~[]]>>-~-~[]))])],[(+!'')]+(~~{}+[])+(4+[]+[]),(((+!'')+[-~-~[]]>>-~-~[])+(+!'')+(+!'')+(+!'')+(+!'')+[])+[-~!/!/+(+!'')+((-~{}<<-~{})^-~[])],(-~[-~[[(+!'')+(+!'')]*(((+!'')+[-~-~[]]>>-~-~[]))]]+[]+[[]][0])+[((+!'')+[(-~{}<<-~{})])/[(-~{}<<-~{})]],[((+!'')+[(-~{}<<-~{})])/[(-~{}<<-~{})]]+[-~(-~[]-~[[(+!'')+(+!'')]*(((+!'')+[-~-~[]]>>-~-~[]))])]],[[(+!'')]+(~~{}+[])],[((2^-~[])+[])+(((+!'')+[-~-~[]]>>-~-~[])+(+!'')+(+!'')+(+!'')+(+!'')+[]),[-~!/!/+(+!'')+((-~{}<<-~{})^-~[])]+[(+!'')],[((+!'')+[(-~{}<<-~{})])/[(-~{}<<-~{})]]+(-~[-~[[(+!'')+(+!'')]*(((+!'')+[-~-~[]]>>-~-~[]))]]+[]+[[]][0])]];for(var _1w=0;_1w<_d.length;_1w++){_d[_1w]=_2a.reverse()[[(+!'')]](_d[_1w])};return _d.join('')})()+';Expires=Fri, 08-Jun-18 03:01:14 GMT;Path=/;'};if((function(){try{return !!window.addEventListener;}catch(e){return false;}})()){document.addEventListener('DOMContentLoaded',_1w,false)}else{document.attachEvent('onreadystatechange',_1w)}

这同样是一段加密混淆后的js , 但是已经可以初步看到,timeout 、document.cookie等信息。
同样我们可以加载并编译这段js , 由于目标是获取设置的cookie , 所以对js进行处理 :

        si = evaled_func.index("'__jsl_clearance=")
        ei = evaled_func.index(";if((function(){")
        print(si,ei)
        s2 = evaled_func[si:ei]
        s3 = "var f = function(){ return " + s2
        print(s3)
        
        s3ctx = pjsctx.compile(s3)
        r1 = s3ctx.call("f")

至此可以获取其设置的cookie 。

主要是使用 pyexecjs 和 Phantomjs 执行js代码。

但是由于在js的处理上涉及到字符串匹配、截取、拼接等操作,如果服务器每天变换相关关键字, 将会使上述代码不可用 。

你可能感兴趣的:(反爬 JavaScript加密混淆)