【Python3爬蟲】一次應對JS反調試的記錄


一、前言簡介

  在前面已經寫過關於 JS 反調試的博客了,地址為:https://www.cnblogs.com/TM0831/p/12154815.html。但這次碰到的網站就不一樣了,這個網站並不是通過不斷調試消耗內存以反調試的,而是直接將頁面替換修改掉,讓人無法調試頁面。

  

 

二、網頁分析

  本次爬取的網址為:https://www.aqistudy.cn/,但打開開發者工具后,頁面變成了下面這樣:

  

  很明顯這是觸發了反爬,頁面直接被替換掉了。當我們打開開發者工具時,程序檢測到了開發者工具被打開了,所以觸發反爬,將頁面修改成了上面的樣子。

  頁面被修改了,我們就沒辦法了嗎?自然是有對策的,我們可以查看一下網頁源碼,在開發者工具中切換到 Source 選項,找到首頁 index 的源碼,如下圖:

  

  往下翻找,可以找到如下內容,可以看到在 endebug() 方法中就是修改頁面的代碼:

  

  通過查看上面的代碼可以發現,debugflag 就是判斷條件,而 loadTad() 則是獲取數據的接口,當程序檢測到開發者工具被打開時,debugflag 的值改為 true,endebug() 函數執行,頁面也就被修改掉了。

  那么 endebug() 方法的具體內容是什么呢?全局搜索“endebug”,可以找到一個 JavaScript 文件(連接為:https://www.aqistudy.cn/js/jquery.min.js?v=1.2),在其中能找到如下代碼部分:

 1 // debug detect
 2 eval(function(p, a, c, k, e, d) {
 3     e = function(c) {
 4         return (c < a ? "" : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36))
 5     }
 6     ;
 7     if (!''.replace(/^/, String)) {
 8         while (c--)
 9             d[e(c)] = k[c] || e(c);
10         k = [function(e) {
11             return d[e]
12         }
13         ];
14         e = function() {
15             return '\\w+'
16         }
17         ;
18         c = 1;
19     }
20     ;while (c--)
21         if (k[c])
22             p = p.replace(new RegExp('\\b' + e(c) + '\\b','g'), k[c]);
23     return p;
24 }('2 M(g,y){h(!g){!2(e){2 n(e){2 n(){j u}2 o(){4.8&&4.8.m&&4.8.m.H?t("9"):(a="g",v.G(d),v.F(),t(a))}2 t(e){u!==e&&(u=e,"2"==7 c.5&&c.5(e))}2 r(){l||(l=!0,4.I("k",o),L(f))}"2"==7 e&&(e={5:e});3 i=(e=e||{}).K||J,c={};c.5=e.5;3 a,d=B z;d.D("C",2(){a="9"});3 u="E";c.A=n;3 f=s(o,i);4.S("k",o);3 l;j c.N=r,c}3 o=o||{};o.x=n,"2"==7 6?(6.P||6.R)&&6(2(){j o}):"O"!=7 b&&b.p?b.p=o:4.q=o}(),q.x(2(e){3 a=0;3 n=s(2(){h("9"==e){w(2(){h(a==0){a=1;w(y)}},Q)}},T)})}}', 56, 56, '||function|var|window|onchange|define|typeof|Firebug|on||module|||||off|if||return|resize||chrome|||exports|jdetects||setInterval|||console|setTimeout|create|code|Image|getStatus|new|id|__defineGetter__|unknown|clear|log|isInitialized|removeEventListener|500|delay|clearInterval|endebug|free|undefined|amd|200|cmd|addEventListener|100'.split('|'), 0, {}))

  解密出來可以發現這段代碼就是用於檢測開發者工具有沒有打開,若打開了,則觸發反調試,修改頁面。

 

三、解決方案

  首先在首頁的源碼中的如下位置打上斷點,然后刷新頁面,進入調試狀態。

  

   然后切換到 Console 選項頁,在其中對 endebug() 方法進行重新定義,輸入如下內容:

function endebug(){}

  如下圖所示,輸入完回車,然后繼續執行(Chrome 的快捷鍵是 F8):

  

   進行完上述步驟后,就能正常的抓包分析了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM