python爬蟲 - js逆向之突破某網的debug檢測


前言

朋友給了我一個網站,他說這個網站的debug檢測有點東西,於是我准備研究一下

網址:aHR0cHM6Ly93d3cuYXFpc3R1ZHkuY24vaGlzdG9yeWRhdGEvZGF5ZGF0YS5waHA/Y2l0eT0lRTYlOUQlQUQlRTUlQjclOUUmbW9udGg9MjAyMTA5 (請不要問我什么東西,懂的都懂)

 

分析

打開網站,只能給一部分了,看出來的就懂,看不出來的也不要問我是啥

 

 

打開確實是正常顯示哈,好,我們按右鍵,打開控制台看看,當我按鼠標右鍵的時候:

 

 

牛逼啊,有按鍵檢測

 

那直接按f12吧:

 

 

 

有點意思哈,f12也被警用了

 

那行,我在打開這個網站之前就把瀏覽器調試工具按住來了,把地址放上去,回車:

 

 

網站數據頁面本來有展示,但是在一瞬間突然變成如下頁面:

 

 

然后還出來了個這個:

 

 

根據常規經驗,鼠標放到這一行,右鍵,然后選擇:

 

 然后再按右邊的斷點繼續鍵:

 

 

現在網頁變成這樣:

 

 

 

回車刷新頁面,看到有數據頁面,但是一瞬間又變回剛才那個檢測頁面:

 

 

是哪里的問題呢?直接搜相關的字段:

 

 找到這個js文件:

 

 

 

源碼:

var debugflag = false; document.onkeydown = function() { if ((e.ctrlKey) && (e.keyCode == 83)) { alert("檢測到非法調試,CTRL + S被管理員禁用"); return false } } ; document.onkeydown = function() { var e = window.event || arguments[0]; if (e.keyCode == 123) { alert("檢測到非法調試,F12被管理員禁用"); return false } } ; document.oncontextmenu = function() { alert('檢測到非法調試,右鍵被管理員禁用'); return false } ; !function() { if (window.outerWidth - window.innerWidth > 210 || window.outerHeight - window.innerHeight > 210) { $('#body').html('檢測到非法調試, 請關閉調試終端后刷新本頁面重試!<br/>Welcome for People, Not Welcome for Machine!<br/>'); debugflag = true } let handler = setInterval(()=>{ if (window.outerWidth - window.innerWidth > 210 || window.outerHeight - window.innerHeight > 210) { $('#body').html('檢測到非法調試, 請關閉調試終端后刷新本頁面重試!<br/>Welcome for People, Not Welcome for Machine!<br/>'); debugflag = true } let before = new Date(); (function() {} ["constructor"]("debugger")()); let after = new Date(); let cost = after.getTime() - before.getTime(); if (cost > 50) { debugflag = true; try { $('#body').html('檢測到非法調試, 請關閉調試終端后刷新本頁面重試!<br/>Welcome for People, Not Welcome for Machine!<br/>'); document.write('檢測到非法調試, 請關閉調試終端后刷新本頁面重試!<br/>'); document.write("Welcome for People, Not Welcome for Machine!<br/>") } catch (err) { alert('檢測到非法調試, 請關閉調試終端后刷新本頁面重試!') } } } , 2000) }();

 

 

有點意思哈

一段一段的看,先看這一段

 

 

意思就是防止整個頁面被保存到本地,所以禁用了ctrl+s鍵

再看第二段:

 

 

首先keyCode這個對於前端的老哥來說就很熟悉了,可以這么說,你鍵盤的所有按鍵,js都是有對應的數字編碼的,123剛好就是f12i鍵的編碼,這里的意思就是禁用f12,防止你打開調試窗口調試該網站接口

 

鍵盤編碼表:

/* 鍵盤編碼列表 8: BackSpace BackSpace 79: o O 133: F22 9: Tab Tab 80: p P 134: F23 12: Clear 81: q Q at 135: F24 13: Enter 82: r R 136: Num_Lock 16: Shift_L 83: s S 137: Scroll_Lock 17: Control_L 84: t T 187: acute grave 18: Alt_L 85: u U 188: comma semicolon 19: Pause 86: v V 189: minus underscore 20: Caps_Lock 87: w W 190: period colon 27: Escape Escape 88: x X 192: numbersign apostrophe 32: space 89: y Y 210: plusminus hyphen macron 33: Prior 90: z Z 211: 34: Next 96: KP_0 KP_0 212: copyright registered 35: End 97: KP_1 KP_1 213: guillemotleft guillemotright 36: Home 98: KP_2 KP_2 214: masculine ordfeminine 37: Left 99: KP_3 KP_3 215: ae AE 38: Up 100: KP_4 KP_4 216: cent yen 39: Right 101: KP_5 KP_5 217: questiondown exclamdown 40: Down 102: KP_6 KP_6 218: onequarter onehalf threequarters 41: Select 103: KP_7 KP_7 220: less greater bar 42: Print 104: KP_8 KP_8 221: plus asterisk asciitilde 43: Execute 105: KP_9 KP_9 227: multiply division 45: Insert 106: KP_Multiply KP_Multiply 228: acircumflex Acircumflex 46: Delete 107: KP_Add KP_Add 229: ecircumflex Ecircumflex 47: Help 108: KP_Separator KP_Separator 230: icircumflex Icircumflex 48: 0 equal braceright 109: KP_Subtract KP_Subtract 231: ocircumflex Ocircumflex 49: 1 exclam onesuperior 110: KP_Decimal KP_Decimal 232: ucircumflex Ucircumflex 50: 2 quotedbl twosuperior 111: KP_Divide KP_Divide 233: ntilde Ntilde 51: 3 section threesuperior 112: F1 234: yacute Yacute 52: 4 dollar 113: F2 235: oslash Ooblique 53: 5 percent 114: F3 236: aring Aring 54: 6 ampersand 115: F4 237: ccedilla Ccedilla 55: 7 slash braceleft 116: F5 238: thorn THORN 56: 8 parenleft bracketleft 117: F6 239: eth ETH 57: 9 parenright bracketright 118: F7 240: diaeresis cedilla currency 65: a A 119: F8 241: agrave Agrave atilde Atilde 66: b B 120: F9 242: egrave Egrave 67: c C 121: F10 243: igrave Igrave 68: d D 122: F11 244: ograve Ograve otilde Otilde 69: e E EuroSign 123: F12 245: ugrave Ugrave 70: f F 124: F13 246: adiaeresis Adiaeresis 71: g G 125: F14 247: ediaeresis Ediaeresis 72: h H 126: F15 248: idiaeresis Idiaeresis 73: i I 127: F16 249: odiaeresis Odiaeresis 74: j J 128: F17 250: udiaeresis Udiaeresis 75: k K 129: F18 251: ssharp question backslash 76: l L 130: F19 252: asciicircum degree 77: m M mu 131: F20 253: 3 sterling 78: n N 132: F21 254: Mode_switch */

 

再接着看這一段:

 

 

 

 

這個,說白了,鼠標的左鍵,右鍵,中鍵也是可以被js檢測到的,所以,當檢測你按了鼠標右鍵,也不讓用,怕你按右鍵-檢查 也進行調試

 

 

再看下面這一段:

 

 

 這里就是檢測你的電腦的實際寬度和高度分別跟瀏覽器顯示寬度和高度相減,如果大於210,那說明你開了調試工具,什么意思,看下圖:

 

第一個大框,你姑且認為我畫的就是最外層的顯示寬度和高度,內層的大框,姑且任務就是瀏覽器顯示的實際寬度和高度,因為這個截圖工具,不太好控制邊距,各位老哥將就看了,所以,你看到就是這樣,而比較明顯的就是,電腦實際高度跟瀏覽器顯示高度相肯定大於210了,所以它就覺得你肯定開了調試工具,所以也顯示那個提示

 

再看最后一段:

 

 這段的意思就是,先記錄一個時間before,然后啟動debugger,此時就是上面我們已經跳過debugger那里,然后再生成一個時間after,用這兩個時間相減,如果大於50,它就任務你還是在嘗試調試,所以仍然出現同樣的提示

 

方法一:

 

整段代碼就是這樣,那么它既然檢測那么多,那這樣,我們打開調試窗口之后,點這個:

 

 

讓調試窗口作為一個單獨頁面窗口,就可以規避掉上面的好多層檢測,同時剛才的never pasue here也繼續保持,刷新頁面:

 

方法二:

 還是找到debugger這里,右鍵,選擇如下:

 

 

 

 

然后輸入false:

 

 

 

 

但是,這里要注意,如果這段js,是寫在一行的,而不是向上面一樣分行寫的話,以上兩個方法都不行,都沒法跳過debugger,如下:

 

 

 

 

 

 

 

 (base62編碼,沒打錯字,就是base62,不是base64)

 

方法三

在控制台重寫該方法,置空

 

同時網頁不要刷新,因為在console.log里是臨時,一刷新就沒了

然后放開斷點看不行:

 

 

 發現這里並不太實用,那這個方法不行嗎,不是,只是這里不適用,當然上面設置的其實已經生效了,因為上圖都不是在同一個虛擬js空間里斷上的,而是新開了好幾個vm然后斷上的,所以,它應該有個循環,而且這個循環體應該有個調用函數,所以這個調用函數就是執行這個debugger的上級,只要找到它,然后給他一個空即可

 

搜索相關關鍵詞:

 

找到了一個叫endedug的函數,不出意外就是它了,給它置空看看就知道了:

 

 此時方法可行,完畢

 

 方法四

在控制台里輸入如下,回車,切忌不要刷新頁面

//去除無限debugger
Function.prototype.__constructor_back = Function.prototype.constructor;
Function.prototype.constructor = function() {
    if(arguments && typeof arguments[0]==='string'){
        //alert("new function: "+ arguments[0]);
        if("debugger" === arguments[0]){
            //arguments[0]="console.log(\"anti debugger\");";
            //arguments[0]=";";
            return
        }
    }
   return Function.prototype.__constructor_back.apply(this,arguments);
}

  

 

網址終於正常顯示,然后就可以進行下面的接口分析了

 

 

而其實,你還有很多方法,比如直接hook,把里面那個debugflag改為false之類的,或者直接在控制台改值,或者用瀏覽器插件控制改值,或者用reres插件直接把相關的js替換了,方法很多,這里就不一一展示了

 

結語

 

很簡單對吧,所以還是得學學js,能看懂js代碼,你才能真的做js逆向


免責聲明!

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



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