LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

JavaScript奇技淫巧:debugger拦截

liguoquan
2025年8月25日 8:53 本文热度 68
:JavaScript奇技淫巧:debugger拦截


JavaScript奇技淫巧:debugger拦截

20 人赞同了该文章

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生效。

甚至连大名鼎鼎的人工智能ChatGPT也认为debugger无法拦截。如下图:ChatGPT的回答。

而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");
}

运行效果:


本文节选自开源电子书《JavaScript奇技淫巧》。


该文章在 2025/8/25 8:53:00 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved