死循环断点,阻止别人调试js

1,987 阅读3分钟
原文链接: blog.csdn.net

非服务端js因为最终要下载到客户端/浏览器编译执行,所以不可避免的要把代码泄漏出去。虽然压缩混淆可以让代码难以识别,但字符串/全局对象都不能被压缩,可以根据这方面入手来找寻突破口,进而对代码进行调试。这里抛砖引玉的分享一个阻止别人在浏览器调试代码的方法。

目前多数浏览器都支持debugger断点代码,只要打开devtools,代码执行到debugger位置时,就会断点。而如若没有打开devtools,则不受影响。所以可以根据这个特性来尝试检测用户是否打开了devtools,代码如下

[html] view plain copy print?
  1. function checkDebugger(){  
  2.         const d=new Date();  
  3.         debugger;  
  4.         const dur=Date.now()-d;  
  5.         if(dur<5){  
  6.             return false;  
  7.         }else{  
  8.             return true;  
  9.         }  
  10.     }  
function checkDebugger(){
        const d=new Date();
        debugger;
        const dur=Date.now()-d;
        if(dur<5){
            return false;
        }else{
            return true;
        }
    }

打开devtools后执行改方法,因为会被断点,以人的手速很难在5ms内点掉断点,这里通过时间差来判断是否打开devtools

于是可以通过递归写个无限断点的方法,如若打开devtools,执行到该方法则会一直被断点。

[html] view plain copy print?
  1. function breakDebugger(){  
  2.         if(checkDebugger()){  
  3.             breakDebugger();  
  4.         }  
  5.     }  
function breakDebugger(){
        if(checkDebugger()){
            breakDebugger();
        }
    }

所以可以在不希望被调试的代码中,执行这个方法就不会被执行下去,除非对方关闭devtools。简单实例如下

[html] view plain copyprint?
  1. <!DOCTYPE html>  
  2. <html lang="en">  
  3. <head>  
  4.     <meta charset="UTF-8">  
  5.     <title>Title</title>  
  6. </head>  
  7. <body>  
  8. 123  
  9. <script>  
  10.     function checkDebugger(){  
  11.         const d=new Date();  
  12.         debugger;  
  13.         const dur=Date.now()-d;  
  14.         if(dur<5){  
  15.             return false;  
  16.         }else{  
  17.             return true;  
  18.         }  
  19.     }  
  20.     function breakDebugger(){  
  21.         if(checkDebugger()){  
  22.             breakDebugger();  
  23.         }  
  24.     }  
  25.   
  26.     document.body.onclick=function(){  
  27.         breakDebugger();  
  28.         alert(1);  
  29.     };  
  30. </script>  
  31. </body>  
  32. </html>  
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
123
<script>
    function checkDebugger(){
        const d=new Date();
        debugger;
        const dur=Date.now()-d;
        if(dur<5){
            return false;
        }else{
            return true;
        }
    }
    function breakDebugger(){
        if(checkDebugger()){
            breakDebugger();
        }
    }

    document.body.onclick=function(){
        breakDebugger();
        alert(1);
    };
</script>
</body>
</html>

自然,对于不支持debugger的浏览器不会生效。另外因为毕竟已经下载到了客户端,用心想的话还是很容易被破解,作为加大调试难度的一个坎来用吧