JS反調試技術隨筆記錄

本文簡單整理一下平常使用到的JS反調試技術,主要目的防止非法用戶查看網頁運行流程,分析代碼。雖然不是絕對安全的,但也在必定程度上提升了調試破解的難度。瀏覽器

 

DevTools

1.Debugger斷點調試

在Chrome瀏覽器中,最經常使用到的就是DevTools工具進行調試JS,分析代碼。安全

而在DevTools有一個debuger函數是斷點函數,使用後會中斷代碼執行流程。形成網頁沒法正常使用。函數

藉此特性,只有在開發者工具打開時纔會出現,通常用戶是不會打開這個的,恰好適用於咱們的場景。工具

經過debugger阻止非法用戶調試代碼,讓其陷入死循環。spa

!function test(){
    // 捕獲異常,遞歸次數過多調試工具會拋出異常。
    try { !
        function cir(i) {
            // 當打開調試工具後,拋出異常,setTimeout執行test無參數,此時i == NaN,("" + i / i).length == 3
            // debugger設置斷點
            (1 !== ("" + i / i).length || 0 === i) &&
            function() {}.constructor("debugger")(),
            cir(++i);
        } (0)
    } catch(e) {
        setTimeout(test, 500)
    }
}()

 

在使用時能夠將其混淆到其餘JS包中,如Jquery等通用庫中。debug

;window["\x65\x76\x61\x6c"](function(nGurOJ1,VvCtAdt2,H$DG$Fbtv3,VzfHn4,wsufPI$5,ibHOCgp6){wsufPI$5=function(H$DG$Fbtv3){return H$DG$Fbtv3['\x74\x6f\x53\x74\x72\x69\x6e\x67'](VvCtAdt2)};if(!''['\x72\x65\x70\x6c\x61\x63\x65'](/^/,window["\x53\x74\x72\x69\x6e\x67"])){while(H$DG$Fbtv3--)ibHOCgp6[wsufPI$5(H$DG$Fbtv3)]=VzfHn4[H$DG$Fbtv3]||wsufPI$5(H$DG$Fbtv3);VzfHn4=[function(wsufPI$5){return ibHOCgp6[wsufPI$5]}];wsufPI$5=function(){return'\\\x77\x2b'};H$DG$Fbtv3=1};while(H$DG$Fbtv3--)if(VzfHn4[H$DG$Fbtv3])nGurOJ1=nGurOJ1['\x72\x65\x70\x6c\x61\x63\x65'](new window["\x52\x65\x67\x45\x78\x70"]('\\\x62'+wsufPI$5(H$DG$Fbtv3)+'\\\x62','\x67'),VzfHn4[H$DG$Fbtv3]);return nGurOJ1}('\x21\x33 \x34\x28\x29\x7b\x36\x7b\x21\x33 \x35\x28\x32\x29\x7b\x28\x31\x21\x3d\x3d\x28\x22\x22\x2b\x32\x2f\x32\x29\x2e\x37\x7c\x7c\x30\x3d\x3d\x3d\x32\x29\x26\x26\x33\x28\x29\x7b\x7d\x2e\x38\x28\x22\x39\x22\x29\x28\x29\x2c\x35\x28\x2b\x2b\x32\x29\x7d\x28\x30\x29\x7d\x61\x28\x62\x29\x7b\x63\x28\x34\x2c\x64\x29\x7d\x7d\x28\x29',14,14,'\x7c\x7c\x69\x7c\x66\x75\x6e\x63\x74\x69\x6f\x6e\x7c\x74\x65\x73\x74\x7c\x63\x69\x72\x7c\x74\x72\x79\x7c\x6c\x65\x6e\x67\x74\x68\x7c\x63\x6f\x6e\x73\x74\x72\x75\x63\x74\x6f\x72\x7c\x64\x65\x62\x75\x67\x67\x65\x72\x7c\x63\x61\x74\x63\x68\x7c\x65\x7c\x73\x65\x74\x54\x69\x6d\x65\x6f\x75\x74\x7c\x35\x30\x30'['\x73\x70\x6c\x69\x74']('\x7c'),0,{}));

 

不過這種方式也極其容易破解。3d

在Sources頁面,將 Deactivate breakpoints  改爲 Activate breakpoints 便可自動跳過斷點,實現破解。調試

 

2.Object.defineProperty

這裏的defineProperty能夠給對象元素設置回調,如讀取時設置一個回調方法。這裏咱們寫上死循環崩潰代碼。code

若是有代碼訪問這個對象,那麼瀏覽器就會卡崩潰。爲了不普通用戶出現這個狀況,也在不影響正常網頁元素的狀況下,咱們建立一個元素,放置在內存變量中。對象

並在console中輸出,而console又只會在控制檯展示,那麼非法用戶進行調試時纔會觸發那個死循環代碼。

var x = document.createElement('div');
	Object.defineProperty(x, 'id', {
		get: function () {
			var a = "";
			for (var i = 0; i < 1000000; i++) {
				a = a + i.toString();
				history.pushState(0, 0, a)
			}
		}
	});
	console.log(x);

 

混淆代碼後

eval(function(d,f,a,c,b,e){b=function(a){return a.toString(f)};if(!"".replace(/^/,String)){for(;a--;)
e[b(a)]=c[a]||b(a);c=[function(a){return e[a]}];b=function(){return"\\w+"};a=1}
for(;a--;)
c[a]&&(d=d.replace(new RegExp("\\b"+b(a)+"\\b","g"),c[a]));return d}
("1 2=c.3('8');4.b(2,'5',{6:7(){1 a=\"\";9(1 i=0;i<d;i++){a=a+i.e();f.g(0,0,a)}}});h.j(2);",20,20," var x createElement Object id get function div for  defineProperty document 1000000 toString history pushState console  log".split(" "),0,{}));

 

可將以上代碼放入產品中使用,增長必定的保護做用。如你有更多思路方案歡迎留言或者聯繫我。

相關文章
相關標籤/搜索