本帖最后由 LoveCode 于 2023-11-23 22:50 编辑
查看了一下网站,既然 debugger 语句在 VM 中,那么可以 hook Function、eval 这两个函数来过掉它。
另外,它的 setInterval 也可以直接 hook 掉,似乎并不影响逻辑(没有详细测试)。
这是简单测试之后精简的代码,最好是利用油猴插件执行该脚本。另外水平所限,此脚本可能在其它网页出现 bug。
// ==UserScript==
// @name My_Hook
// @namespace http://tampermonkey.net/
// @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 了。
如果置空 setInterval 出现了其它问题,那么可以删除上面的 hook_setInterval 函数中的 return; 语句。
这样也能过掉 debugger ,但 ”检测控制台打开“ 的代码会不断运行。毕竟它是通过 setInterval 设置的。
楼上坛友说是 ”瑞数“,我特地去查了一下…………溜了溜了,不是我惹得起的存在。
|