https://www.browserscan.net/zh/bot-detection
首先,打開devtools后訪問網址,檢測結果網頁顯示紅色Robot,標簽插入位置,確定斷點位置可以hook該方法,也可以使用插件等方式找到這個位置,本篇不討論.
Robot標簽是通過insertBefore插入的.
再往上追棧可以發現一個32長度數組,里面存在的都是標簽
再往上追棧找到32位數組產生的地方,會發現Eo的函數
再追進Eo函數,是由ge產生,ge里面傳的參數又是個函數名稱是個下劃線,這個位置被反復調用感覺比較難調試,分別進ge函數和下劃線函數看看
進ge函數后,再跟進幾個函數會發現en這個函數,會發現數組構建模版
進入下滑線函數會發現三木表達式i(d)如果是真就創建normal標簽,如果是假就創建robot標簽
到這里其實是比較明確了的,就看i(d),i比較不重要,就是個判斷,主要看d的值為什么是個false;
接著分析d,往上找可以找到d = S(!0),進入S函數,再進一兩層簡單函數,S(!0)就是new了一個hp類
d要false,那么我們就在set的地方打一個條件斷點,看什么時候設置的false,一番調試后發現,其實就在初始化下面一些代碼,這里繞了遠路不用點斷點去找的
這里關鍵就看這個qe為什么是個true了,導致執行了后面的d.value=!1,進入qe函數分析下
首先定義了一個Error對象,重寫了get方法,只要被調用那么變量e就會賦值true,最終返回的就是true,這里是使用console.debug調用的這個函數,只要devtools打開,控制臺也就打開,這是debug函數就會生效.
接下來就是過檢測,修改chromium瀏覽器源碼,把console.debug函數的定義里面的內容注釋,那么即使是定義的Error對象重寫了get方法,執行debug函數的時候也不會被調用get方法,最終也就不會被檢測到devtools打開
最后放一張修改后的chromium瀏覽器達到過檢測的效果,直接置空debug,log等函數,在添加自己的logv函數打印日志;
總結:
第一次看這個網站,在逆向過程中也并不是很順利
該網站存在大量的混淆,函數全部重使用簡單別名,es6的語法下,大量使用import和export關鍵字進行重命名干擾變量的追蹤,使用&符號進行流程控制,導致走錯了很多分支;
js中有log等日志輸出的函數被置空,在沒有自己的函數l日志輸出方法logv之前,直接在腳本開始之前保存號log函數,這樣日志斷點也是可以正常使用