查看了一下网站,既然 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 上传
楼上坛友说是 ”瑞数“,我特地去查了一下…………溜了溜了,不是我惹得起的存在。