无限debugger问题

文章正文
发布时间:2025-07-01 23:51

查看了一下网站,既然 debugger 语句在 VM 中,那么可以 hook Function、eval 这两个函数来过掉它。

另外,它的 setInterval 也可以直接 hook 掉,似乎并不影响逻辑(没有详细测试)。

这是简单测试之后精简的代码,最好是利用油猴插件执行该脚本。另外水平所限,此脚本可能在其它网页出现 bug

// ==UserScript== // @name         My_Hook // @namespace    // @version      0.1 // @description  try to take over the world! // @AuThor       You // @match       https://www.ahu.edu.cn/* // @Icon         https://www.google.com/s2/favicons?sz=64&domain=csdn.net // @grant        none // @run-at       document-start // ==/UserScript== console.log("========== my hook start =========="); function hook_Function() {     let raw_F_c = Function.prototype.constructor;     let _constructor = function (params) {         console.log("调用 Function.prototype.constructor: ", params);         if (params.includes("debugger")) {             console.log("发现 debugger in Function.prototype.constructor");             params = params.replaceAll("debugger", "");         }         return raw_F_c(params);     }     Object.defineProperty(window.Function.prototype, "constructor", { value: _constructor }) } function hook_setInterval() {     let raw_set = setInterval;     let _setInterval = function () {         console.log("调用 setInterval: ", arguments)         // 直接置空似乎没有什么影响         return;  // 如果出现问题可以删除该语句         let s = arguments[0].toString();         if (s.includes("debugger")) {             console.log("发现 debugger in setInterval");             s = s.replaceAll("debugger", "");             arguments[0] = eval(s);         }         raw_set(...arguments);     }     Object.defineProperty(window, "setInterval", { value: _setInterval }) } function hook_eval() {     let raw_eval = eval;     let _eval = function(param) {         console.log("调用 eval: ", param);         if (param.includes("debugger")) {             console.log("发现 debugger in eval");             if (param === "(function() {var a = new Date(); debugger; return new Date() - a > 100;}())") {                 param = "(function() { return false; })()";             }             param = param.replaceAll("debugger", "");         }         raw_eval(param);     }     Object.defineProperty(window, "eval", { value: _eval }) } hook_setInterval(); hook_eval(); // hook_Function();  // 如果置空 setInterval 出现了其它问题,可以取消该注释

如下,现在就不会触发无限 debugger 了。

image-20231123215140088.png (420.13 KB, 下载次数: 0)

下载附件

2023-11-23 21:57 上传

如果置空 setInterval 出现了其它问题,那么可以删除上面的 hook_setInterval 函数中的 return; 语句。

这样也能过掉 debugger,但 ”检测控制台打开“ 的代码会不断运行。毕竟它是通过 setInterval 设置的。

image-20231123212219994.png (372.21 KB, 下载次数: 0)

下载附件

2023-11-23 21:57 上传

楼上坛友说是 ”瑞数“,我特地去查了一下…………溜了溜了,不是我惹得起的存在。