瀏覽器反調試繞過無限debugger及代碼執行器檢測

背景

現在做數據爬蟲的朋友常有的方法就是利用瀏覽器的調試能力分析別人JS代碼邏輯。如果遇到複雜的代碼可能會第三方代碼執行功能。例如使用puppeteer的evalute方法執行代碼獲取結果。

而我們做反爬遇到這種情況就是進行調試干擾,例如加入定時器,重複調用debugger,那麼調試模式下就影響調試。

在這裏插入圖片描述

而對於類似通過evalute方法執行代碼進行抓取的爬蟲通過異常調用棧即可檢測。例如執行代碼中故意插入一段代碼,併產生錯誤,那麼通過調用棧可以檢測到函數名,這樣就可以進行識別。

           let checkFunc = function () {
               let detected = false;
               let stack;
               try {
                   (void 0).c;
               } catch (error) {
                   stack = (error || {}).stack;
                   detected = (stack && typeof stack === "string" && (stack.indexOf("eval") > -1));
               }
               return detected;
           };

解決辦法

我很久前也寫過一些文章,介紹了處理思路,“攔截及預處理”,任何場景下這些前端的具體問題都會想到解決辦法。第一個debugger問題。雖然很好的干擾調試者,但也暴露的自身的調用棧。通過定時器產生週期調用,最終通過concat拼接構成字符串,最後通過構造器來完成執行。

function e(t) {
    if ("string" == typeof t)
        return function(t) {}
        .constructor("while (true) {}").apply("counter");
    1 !== ("" + t / t).length || t % 20 == 0 ? function() {
        return !0
    }
    .constructor("".concat(y).concat(x).concat(b)).call("action") : function() {
        return !1
    }
    .constructor("".concat(y).concat(x).concat(b)).apply("stateObject"),
    e(++t)
}

那我們知道了這個問題,按照攔截及預處理的思路,只要在concat過程中干擾debugger生成,換成無關緊要的方法即可。我們將下面的代碼在瀏覽器控制檯中執行。隨後看到debugger干擾調試就不會再生效。

String.prototype.concat = new Proxy(String.prototype.concat,{
    apply:function(target,ctx,param) {
        let value = target.call(ctx,...param);
        if(value.indexOf("debugg") > -1) { 
          value = 'console';
        }
        return value;
    }
});

接着就可以舒服的看代碼了。這也不是唯一的辦法,替換文件,響應替換都可以。這裏僅是一個思路,對於不同人看到還會想到不同的思路。

此外我們會發現頁面刷新後代碼就會失效。只需要找一個在頁面加載前執行代碼的瀏覽器插件即可。

debugger這個問題清楚了,那麼對於evalute執行代碼被檢測的處理也就知道了如何應對了。思路有很多,當然也是可以修改框架代碼解決。

String.prototype.indexOf = (function(){
               let oIndexOf = String.prototype.indexOf;
               return function(value,from) {
                   if(value === 'eval') {
                       debugger;
                       return -1;
                   } else {
                       return oIndexOf.call(this,value,from);
                   }
               }
           })();

總結

攔截的方法也僅僅是對語言認知加深即可提升。當然自己思考過了有思路,也只是查手冊的問題。

我們遇到的很多這些問題google後,會發現很早很早以前已經有人提出,這些辦法不一定解決一個具體的問題,但是確是很好的思路,因此看到別人的思路,自己多思考就能想到擴展點。而不是記錄一大推實例,一但現象不同了,就懵了。

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