加速乐反爬虫机制剖析笔记+php内部执行js

今天搞了个采集,发现返回一直是521刚开始没注意,刷新了几次一直提示521,第一感觉就是做了反爬虫,简单的处理了一下发现用的是加速乐的。

下面是破解的详细过程。

第一次请求的时候会返回下面这段js,这是一段加了密的js.

除了这段果还有一个cookie  array([__jsluid] => 1ddebc26aa4439d2d558974a441233ab )差不多是这样的,先要把这个保存起来;后面请求的时候要加上这个cookie

<script>var x="@@644@@captcha@return@@1@@bgUR@@split@@@function@if@challenge@hantom@GMT@search@rOm9XFMtA3QKV7nYsPGT4lifyWwkq5vcjH2IdxUoCbhERLaz81DNB6@@@12@createElement@@d@for@@@08@e@36@div@new@@0xEDB88320@@__jsl_clearance@g@href@@Path@O7@f@chars@@toLowerCase@2@Nov@fromCharCode@@charCodeAt@window@0@eval@@4@DOMContentLoaded@@cookie@match@replace@@@@1500@@@@catch@@@@@toString@Expires@location@@length@parseInt@var@09@https@@onreadystatechange@@@callP@@a@attachEvent@RegExp@charAt@7@8@document@setTimeout@false@JgSe0upZ@join@D@34N@43@pathname@H@18@substr@qH3@0xFF@@@@Array@reverse@else@@try@1541664763@@while@addEventListener@g0@Thu@String@firstChild@3@innerHTML".replace(/@*$/,"").split("@"),y="3a 31=f(){42('36.1h=36.49+36.k.2f(/[\\?|&]5-h/,\\'\\')',2j);41.2d='1f=4n.3|27|'+(f(){3a 12=[f(31){6 31},f(12){6 12},f(31){6 28('55.23('+31+')')}],4g=[[-~[]]+(~~[]+[[]][27]),[-~[]]+(-~-~~~!/!/+((-~[]<<-~[]))*[(-~[]<<-~[])]+[]),[-~[]]+[-~[]],(~~[]+[[]][27]),[-~[]]+[-~!/!/-~-~~~!/!/-~-~~~!/!/],[-~[]],(2a+[]+[]),[40],[-~-~~~!/!/],(-~-~~~!/!/+((-~[]<<-~[]))*[(-~[]<<-~[])]+[]),[-~[]]+(2a+[]+[]),[-~[]]+((-~[]|(-~[]<<-~[]))-~((-~[]|(-~[]<<-~[])))+[]),(-~-~~~!/!/+3n+[]),[(-~[]|(-~[]<<-~[]))],[-~[]]+[-~-~~~!/!/],((-~[]|(-~[]<<-~[]))-~((-~[]|(-~[]<<-~[])))+[]),[-~[]]+[(-~[]|(-~[]<<-~[]))],[-~!/!/-~-~~~!/!/-~-~~~!/!/]];14(3a 31=27;31<4g.38;31++){4g[31]=12[[8,27,8,21,8,27,21,8,21,8,21,8,27,21,27,8,27,8][31]]([[[-~[]]+[-~[]]+[-~-~~~!/!/],(-~-~~~!/!/+((-~[]<<-~[]))*[(-~[]<<-~[])]+[])+(-~-~~~!/!/+3n+[])],[{}+[]][27].3m(((-~[]<<-~[]))*[-~[]+57])+[-~[]],[[40]+(-~-~~~!/!/+((-~[]<<-~[]))*[(-~[]<<-~[])]+[])],[((-~[]|(-~[]<<-~[]))-~((-~[]|(-~[]<<-~[])))+[])+[-~[]]],[[40]+(~~[]+[[]][27])],'46','1k','%','4d',({}+[]+[[]][27]).3m(-~[-~(-~((-~[]|(-~[]<<-~[]))))]),'4a','53',[!!26['3h'+'i']+[]+[[]][27]][27].3m(-~[21]),[(-~[]|(-~[]<<-~[]))],[((-~[]|(-~[]<<-~[]))-~((-~[]|(-~[]<<-~[])))+[])+[-~-~~~!/!/],[40]+((-~[]|(-~[]<<-~[]))-~((-~[]|(-~[]<<-~[])))+[])],'47',(![]+[[]][27]).3m(-~[]),'a'][4g[31]])};6 4g.45('')})()+';35=54, 17-22-4b 3b:10:48 j;1j=/;'};g((f(){4m{6 !!26.52;}2n(18){6 43;}})()){41.52('2b',31,43)}4k{41.3k('3e',31)}",f=function(x,y){var a=0,b=0,c=0;x=x.split("");y=y||99;while((a=x.shift())&&(b=a.charCodeAt(0)-77.5))c=(Math.abs(b)<13?(b+48.5):parseInt(a,36))+y*c;return c},z=f(y.match(/\w/g).sort(function(x,y){return f(x)-f(y)}).pop());while(z++)try{eval(y.replace(/\b\w+\b/g, function(y){return x[f(y,z)-1]||("_"+y)}));break}catch(_){}</script>

仔细分析后发现一句最重要的代码:

#就是用的这一句来解密
eval(y.replace(/\b\w+\b/g, function(y){return x[f(y,z)-1]||("_"+y)}));

这里就需要用到一个扩展v8js 用这个来在php内部运行js ;

在运行前先处理一下这段代码

$js = <<<EOT
    <script>var x="@@644@@captcha@return@@1@@bgUR@@split@@@function@if@challenge@hantom@GMT@search@rOm9XFMtA3QKV7nYsPGT4lifyWwkq5vcjH2IdxUoCbhERLaz81DNB6@@@12@createElement@@d@for@@@08@e@36@div@new@@0xEDB88320@@__jsl_clearance@g@href@@Path@O7@f@chars@@toLowerCase@2@Nov@fromCharCode@@charCodeAt@window@0@eval@@4@DOMContentLoaded@@cookie@match@replace@@@@1500@@@@catch@@@@@toString@Expires@location@@length@parseInt@var@09@https@@onreadystatechange@@@callP@@a@attachEvent@RegExp@charAt@7@8@document@setTimeout@false@JgSe0upZ@join@D@34N@43@pathname@H@18@substr@qH3@0xFF@@@@Array@reverse@else@@try@1541664763@@while@addEventListener@g0@Thu@String@firstChild@3@innerHTML".replace(/@*$/,"").split("@"),y="3a 31=f(){42('36.1h=36.49+36.k.2f(/[\\?|&]5-h/,\\'\\')',2j);41.2d='1f=4n.3|27|'+(f(){3a 12=[f(31){6 31},f(12){6 12},f(31){6 28('55.23('+31+')')}],4g=[[-~[]]+(~~[]+[[]][27]),[-~[]]+(-~-~~~!/!/+((-~[]<<-~[]))*[(-~[]<<-~[])]+[]),[-~[]]+[-~[]],(~~[]+[[]][27]),[-~[]]+[-~!/!/-~-~~~!/!/-~-~~~!/!/],[-~[]],(2a+[]+[]),[40],[-~-~~~!/!/],(-~-~~~!/!/+((-~[]<<-~[]))*[(-~[]<<-~[])]+[]),[-~[]]+(2a+[]+[]),[-~[]]+((-~[]|(-~[]<<-~[]))-~((-~[]|(-~[]<<-~[])))+[]),(-~-~~~!/!/+3n+[]),[(-~[]|(-~[]<<-~[]))],[-~[]]+[-~-~~~!/!/],((-~[]|(-~[]<<-~[]))-~((-~[]|(-~[]<<-~[])))+[]),[-~[]]+[(-~[]|(-~[]<<-~[]))],[-~!/!/-~-~~~!/!/-~-~~~!/!/]];14(3a 31=27;31<4g.38;31++){4g[31]=12[[8,27,8,21,8,27,21,8,21,8,21,8,27,21,27,8,27,8][31]]([[[-~[]]+[-~[]]+[-~-~~~!/!/],(-~-~~~!/!/+((-~[]<<-~[]))*[(-~[]<<-~[])]+[])+(-~-~~~!/!/+3n+[])],[{}+[]][27].3m(((-~[]<<-~[]))*[-~[]+57])+[-~[]],[[40]+(-~-~~~!/!/+((-~[]<<-~[]))*[(-~[]<<-~[])]+[])],[((-~[]|(-~[]<<-~[]))-~((-~[]|(-~[]<<-~[])))+[])+[-~[]]],[[40]+(~~[]+[[]][27])],'46','1k','%','4d',({}+[]+[[]][27]).3m(-~[-~(-~((-~[]|(-~[]<<-~[]))))]),'4a','53',[!!26['3h'+'i']+[]+[[]][27]][27].3m(-~[21]),[(-~[]|(-~[]<<-~[]))],[((-~[]|(-~[]<<-~[]))-~((-~[]|(-~[]<<-~[])))+[])+[-~-~~~!/!/],[40]+((-~[]|(-~[]<<-~[]))-~((-~[]|(-~[]<<-~[])))+[])],'47',(![]+[[]][27]).3m(-~[]),'a'][4g[31]])};6 4g.45('')})()+';35=54, 17-22-4b 3b:10:48 j;1j=/;'};g((f(){4m{6 !!26.52;}2n(18){6 43;}})()){41.52('2b',31,43)}4k{41.3k('3e',31)}",f=function(x,y){var a=0,b=0,c=0;x=x.split("");y=y||99;while((a=x.shift())&&(b=a.charCodeAt(0)-77.5))c=(Math.abs(b)<13?(b+48.5):parseInt(a,36))+y*c;return c},z=f(y.match(/\w/g).sort(function(x,y){return f(x)-f(y)}).pop());while(z++)try{eval(y.replace(/\b\w+\b/g, function(y){return x[f(y,z)-1]||("_"+y)}));break}catch(_){}</script>
EOT;
//$js就是$curl->response 的内容,这里最好是用正则提取script标签里的内容 下面的替换就不用替换标签了,因为响应的内容除了js外后面还有一串其他的乱码.
    $js = "function ts(){" . $js."}";
    $js = str_replace('<script>','',$js);
    $js = str_replace('{eval','{return',$js);
    $js = str_replace('</script>','',$js);
    
    $v8 = new V8Js();
    $rs = $v8->executeString($js, 'basic.js');


用这段php把响应的js替换一下,把这段js放到ts函数里去,然后把这个函数,用php来执行它,就得到以下代码:

#$rs的结果
var _31=function(){setTimeout('location.href=location.pathname+location.search.replace(/[?|&]captcha-challenge/,'')',1500);document.cookie='__jsl_clearance=1541664763.644|0|'+(function(){var _12=[function(_31){return _31},function(_12){return _12},function(_31){return eval('String.fromCharCode('+_31+')')}],_4g=[[-~[]]+(~~[]+[[]][0]),[-~[]]+(-~-~~~!/!/+((-~[]<<-~[]))*[(-~[]<<-~[])]+[]),[-~[]]+[-~[]],(~~[]+[[]][0]),[-~[]]+[-~!/!/-~-~~~!/!/-~-~~~!/!/],[-~[]],(4+[]+[]),[8],[-~-~~~!/!/],(-~-~~~!/!/+((-~[]<<-~[]))*[(-~[]<<-~[])]+[]),[-~[]]+(4+[]+[]),[-~[]]+((-~[]|(-~[]<<-~[]))-~((-~[]|(-~[]<<-~[])))+[]),(-~-~~~!/!/+7+[]),[(-~[]|(-~[]<<-~[]))],[-~[]]+[-~-~~~!/!/],((-~[]|(-~[]<<-~[]))-~((-~[]|(-~[]<<-~[])))+[]),[-~[]]+[(-~[]|(-~[]<<-~[]))],[-~!/!/-~-~~~!/!/-~-~~~!/!/]];for(var _31=0;_31<_4g.length;_31++){_4g[_31]=_12[[1,0,1,2,1,0,2,1,2,1,2,1,0,2,0,1,0,1][_31]]([[[-~[]]+[-~[]]+[-~-~~~!/!/],(-~-~~~!/!/+((-~[]<<-~[]))*[(-~[]<<-~[])]+[])+(-~-~~~!/!/+7+[])],[{}+[]][0].charAt(((-~[]<<-~[]))*[-~[]+3])+[-~[]],[[8]+(-~-~~~!/!/+((-~[]<<-~[]))*[(-~[]<<-~[])]+[])],[((-~[]|(-~[]<<-~[]))-~((-~[]|(-~[]<<-~[])))+[])+[-~[]]],[[8]+(~~[]+[[]][0])],'D','O7','%','qH3',({}+[]+[[]][0]).charAt(-~[-~(-~((-~[]|(-~[]<<-~[]))))]),'H','g0',[!!window['callP'+'hantom']+[]+[[]][0]][0].charAt(-~[2]),[(-~[]|(-~[]<<-~[]))],[((-~[]|(-~[]<<-~[]))-~((-~[]|(-~[]<<-~[])))+[])+[-~-~~~!/!/],[8]+((-~[]|(-~[]<<-~[]))-~((-~[]|(-~[]<<-~[])))+[])],'34N',(![]+[[]][0]).charAt(-~[]),'bgUR'][_4g[_31]])};return _4g.join('')})()+';Expires=Thu, 08-Nov-18 09:12:43 GMT;Path=/;'};if((function(){try{return !!window.addEventListener;}catch(e){return false;}})()){document.addEventListener('DOMContentLoaded',_31,false)}else{document.attachEvent('onreadystatechange',_31)}

这一下就看到这段加密代码的真面目了,采集的时候如果cookie验证不通过就会不停的刷新当前页面。

接下来我们仔细分析一下代码,找出我们要要的内容;如下:

#这个代码就是我们要要的,用正则把它提取出来,这里我给它格式化了一下
'__jsl_clearance=1541664763.644|0|' + (function() {
        var _12 = [function(_31) {
            return _31
        },
        function(_12) {
            return _12
        },
        function(_31) {
            return eval('String.fromCharCode(' + _31 + ')')
        }],
        _4g = [[ - ~ []] + (~~ [] + [[]][0]), [ - ~ []] + ( - ~ - ~~~ ! /!/ + (( - ~ [] << -~ [])) * [( - ~ [] << -~ [])] + []), [ - ~ []] + [ - ~ []], (~~ [] + [[]][0]), [ - ~ []] + [ - ~ ! /!/ - ~ - ~~~ ! /!/ - ~ - ~~~ ! /!/], [ - ~ []], (4 + [] + []), [8], [ - ~ - ~~~ ! /!/], ( - ~ - ~~~ ! /!/ + (( - ~ [] << -~ [])) * [( - ~ [] << -~ [])] + []), [ - ~ []] + (4 + [] + []), [ - ~ []] + (( - ~ [] | ( - ~ [] << -~ [])) - ~ (( - ~ [] | ( - ~ [] << -~ []))) + []), ( - ~ - ~~~ ! /!/ + 7 + []), [( - ~ [] | ( - ~ [] << -~ []))], [ - ~ []] + [ - ~ - ~~~ ! /!/], (( - ~ [] | ( - ~ [] << -~ [])) - ~ (( - ~ [] | ( - ~ [] << -~ []))) + []), [ - ~ []] + [( - ~ [] | ( - ~ [] << -~ []))], [ - ~ ! /!/ - ~ - ~~~ ! /!/ - ~ - ~~~ ! /!/]];
        for (var _31 = 0; _31 < _4g.length; _31++) {
            _4g[_31] = _12[[1, 0, 1, 2, 1, 0, 2, 1, 2, 1, 2, 1, 0, 2, 0, 1, 0, 1][_31]]([[[ - ~ []] + [ - ~ []] + [ - ~ - ~~~ ! /!/], ( - ~ - ~~~ ! /!/ + (( - ~ [] << -~ [])) * [( - ~ [] << -~ [])] + []) + ( - ~ - ~~~ ! /!/ + 7 + [])], [{} + []][0].charAt((( - ~ [] << -~ [])) * [ - ~ [] + 3]) + [ - ~ []], [[8] + ( - ~ - ~~~ ! /!/ + (( - ~ [] << -~ [])) * [( - ~ [] << -~ [])] + [])], [(( - ~ [] | ( - ~ [] << -~ [])) - ~ (( - ~ [] | ( - ~ [] << -~ []))) + []) + [ - ~ []]], [[8] + (~~ [] + [[]][0])], 'D', 'O7', '%', 'qH3', ({} + [] + [[]][0]).charAt( - ~ [ - ~ ( - ~ (( - ~ [] | ( - ~ [] << -~ []))))]), 'H', 'g0', [ !! window['callP' + 'hantom'] + [] + [[]][0]][0].charAt( - ~ [2]), [( - ~ [] | ( - ~ [] << -~ []))], [(( - ~ [] | ( - ~ [] << -~ [])) - ~ (( - ~ [] | ( - ~ [] << -~ []))) + []) + [ - ~ - ~~~ ! /!/], [8] + (( - ~ [] | ( - ~ [] << -~ [])) - ~ (( - ~ [] | ( - ~ [] << -~ []))) + [])], '34N', (![] + [[]][0]).charAt( - ~ []), 'bgUR'][_4g[_31]])
        };
        return _4g.join('')
    })()

拿到这个代码基本上就大功告成了, 把这段代码放到php里去执行一下就得到这个cookie键值对

__jsl_clearance=1541664763.644|0|Hag0pE34NO1PqH3VO7HWbgURtGs%3D

上面这段字符串就是我们要要的东西了,现在把这个cookie带上再带上开头的cookie __jsluid = 1ddebc26aa4439d2d558974a441233ab ,再去请求就能顺利过关咯。


Tags php javascript 建站

留言(0)

评论