反爬机制之验证setcookie

反爬表现

在使用python或rust进行爬虫的时候的有时会遇到请求返回一段含有只含有js代码的html页面如图:

分析及优化文件

首先解决转义字符\x63\x73\x4b\x48\x77\x71\x4d\x49这种,转义字符可以通过print直接控制台打印出来,例如:

 

 可以看出\x63\x73\x4b\x48\x77\x71\x4d\x49就是csKHwqMI
不过这样一个一个转换比较麻烦,可以到https://tool.lu/js去转换,转换后如下图

 经分析js文件大体分为四部分

1.全局变量arg1与_0x4818

其中变量arg1是是用来解密的一个参数,这个参数每次加载文件返回的该值都不一样,变量_0x4818是一个初始解密参数数据,该参数经过(function(_0x4c97f0, _0x1742fd) { } (_0x4818, 0x15b));初始化后会扩充调用 _0x4db1c函数来扩充_0x4818数组,用于后面的解密用相关代码如下

(function(_0x4c97f0, _0x1742fd) {        
var _0x4db1c = function(_0x48181e) {
            while (--_0x48181e) {
                _0x4c97f0['push'](_0x4c97f0['shift']());
            }
        };  
        略。。。。。。。
         } (_0x4818, 0x15b));

 2.初始化函数(function(param, number) { } (arrayParam, 0x15b));

      var _0x4a2aed = function() {
                var _0x124d17 = new RegExp("\\w+ *\\(\\) *{\\w+ *['|\"].+['|\"];? *}");
                return _0x124d17['test'](_0xb8360b['removeCookie']['toString']());
            };
            _0xb8360b['updateCookie'] = _0x4a2aed;
            var _0x2d67ec = '';
            var _0x120551 = _0xb8360b['updateCookie']();
            if (!_0x120551) {
                _0xb8360b['setCooki2e'](['*'], 'counter', 0x1);
            } else if (_0x120551) {
                _0x2d67ec = _0xb8360b['getCookie'](null, 'counter');
            } else {
                _0xb8360b['removeCookie']();
            }

通过中函数 _0x4a2aed中的正则表达式可以看出是一个代码格式检查,就是用于防代码格式化_0xb8360b[‘removeCookie’]'toString’就是对removeCookie函数直接格式化检查,如果进行了格式化那么_0x120551 值 为flase,这时程序会进入循环,至到浏览器崩溃,即然他只对removeCookie函数的格式进行了断判那么我们只需要把removeCookie函数放到一行就行:

 'removeCookie': function(){return 'dev';},

这样整个(function(_0x4c97f0, _0x1742fd) { } (arrayParam, 0x15b));初始函数就可以正常运行.

3.reload()与setCooki2e()函数

 function setCooki2e(name, value) {
        var expiredate = new Date();
        expiredate.setTime(expiredate.getTime() + (3600 * 1000));
        document.cookie = name + "=" + value + ";expires=" + expiredate.toGMTString() + ";max-age=3600;path=/";
    }

    function reload(x) {
        setCooki2e("acw_sc__v2", x);
        document.location.reload();
    }

这段代码很好理解就是reload调用setCooki2e设置了一个key为acw_sc__v2值为x的cookie值,那么问题来了谁调用了reload()函数,全文搜索reload,仅在l函数据中查到reload附图

显而易见,arg2参数是由arg1_0x23a392 与_0x5e8b26 算出,

其中变量_0x5e8b26内容如下var _0x5e8b26 = _0x55f3('0x3', 'jS1Y');也就是准确的说arg2是由 _0x55f3函数算出来的,而且数参数值已给出,即然这样我们直接写个函数调用l()函数就能得到arg2的值,也就是cookie acw_sc__v2的值.

(注:l()的第一句有个while函数,去掉即可while (window[_0x55f3('0x1', 'XMW^')] || window['__phantomas']) {};)

4._0x55f3涵数

_0x55f3的返回值 主要与如下参数有关 ,只保存与这两参数相关的代码其他内容删掉即可

var _0x48181e = _0x4818[_0x4c97f0];
  _0x55f3['rc4'] = _0x232678;

(注:如果嫌麻烦,就整个copy)

最后,通过调用js(推荐使用execjs),直接加载出acw_sc__v2,随后把这个参数加入到请求cookie中,就能正常请求到数据了

相关资料与参考:https://blog.csdn.net/m0_37696990/article/details/101704767

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章