Javascript 中的 debugger 拦截

debugger 指令,一般用于调试,在如浏览器调试执行环境中,可以在 JavaScript 代码中产生中断。

如果想要拦截 debugger,是不容易的,常用的函数替代、proxy 方法均对它无效,如:

 window.debugger = (function() {
     var origDebug = console.debugger;
     return function() {
     // do something before debugger statement execution
     origDebug.apply(console, arguments);
     // do something after debugger statement execution
     };
 })();

或者:

 var handler = {
   get: function(target, prop, receiver) {
     if (prop === 'debugger') {
       throw new Error("Debugger statement not allowed!");
     }
     return Reflect.get(target, prop, receiver);
   }
 };
 var obj = new Proxy({}, handler);

以上两方法,都无法对 debugger 生效。

而 debugger 有多种写法,如:

1、debugger;
2、Function("debugger").call();
3、eval("debugger");
4、setInterval(function(){debugger;},1000);
5、[].constructor.constructor('debugger')();

最原始的 debugger,想要拦截这一个单词,确实是似乎不可行,但它在现实中的使用频率是不高的,更多的是后面几种用法。

这是因为,debugger 更多的被人们用于反调试,比如用 JShaman 对 JavaScript 代码进行混淆加密后,就可以被加入多种不同的 debugger 指令用于反调试。

 

而上面展示的后 4 种用法,是可以在代码中进行拦截的。

Function("debugger").call()

拦截示例:

 Function_backup = Function;
 Function = function(a){
     if (a =='debugger'){
         console.log("拦截了debugger,中断不会发生1")
         return Function_backup("console.log()")
     }else{
         return Function_backup(a)
     }
 }
 Function("debugger").call();

运行效果:

eval("debugger")

拦截示例:

 eval_backup = eval;
 eval = function(a){
 if(a=='debugger'){
 console.log("拦截了debugger,中断不会发生0")
         return ''
     }else{
         return eval_backup(a)
     }
 }
 eval("debugger");

运行效果:

setInterval(function(){debugger;},1000)

拦截示例:

 var setInterval_backup = setInterval
 setInterval = function(a,b){
     if(a.toString().indexOf('debugger') != -1){
         console.log("拦截了debugger,中断不会发生2")
         return null;
     }
     setInterval_backup(a, b)
 }
 setInterval(function(){
     debugger;
 },1000);

 运行效果:

[].constructor.constructor('debugger')()

拦截示例:

 var constructor_backup = [].constructor.constructor;
 [].constructor.constructor = function(a){
     if(a=="debugger"){
         console.log("拦截了debugger,中断不会发生3");
     }else{
         constructor_backup(a);
     }
 }
 try {
     [].constructor.constructor('debugger')();
 } catch (error) {
     console.error("Anti debugger");
 }

运行效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值