反爬機制之驗證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

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