TamperMonkey脚本Hook setInterval失效,无法阻止无限debugger求排查
问题分析与修复方案
你的Hook代码没生效主要是执行时机太晚,加上代码本身存在小缺陷,具体问题和修复如下:
核心问题
- 脚本注入时机滞后:TamperMonkey默认运行时机是
document-end或DOMContentLoaded,此时网站的反调试代码已经先调用了setInterval,你的Hook根本没来得及拦截。 - 未返回合法定时器ID:原代码调用
new_setInterval(a,b)时没有用return返回结果,会导致正常的setInterval调用返回undefined,可能引发其他异常。 - 字符串匹配存在漏洞:如果网站用
Function('debugger')这类方式创建反调试函数,a.toString()可能不会直接包含debugger字符串,导致拦截失效。
修复后的代码
// ==UserScript== // @name Block Animelon Anti-Debugger // @namespace http://tampermonkey.net/ // @version 0.1 // @match https://animelon.com/video/* // @run-at document-start // 关键:在页面脚本执行前注入 // @grant none // ==/UserScript== (function() { 'use strict'; const originalSetInterval = window.setInterval; window.setInterval = function(callback, delay, ...args) { // 用正则更严谨匹配debugger指令 const callbackStr = callback.toString(); if (/debugger/i.test(callbackStr)) { console.log('Blocked anti-debugger setInterval'); return null; } // 必须返回原函数的返回值,保证正常定时器工作 return originalSetInterval(callback, delay, ...args); }; })();
额外优化(可选)
部分网站还会用setTimeout实现反调试,或者直接在全局插入debugger指令,可以补充以下代码增强拦截:
// 同时Hook setTimeout const originalSetTimeout = window.setTimeout; window.setTimeout = function(callback, delay, ...args) { const callbackStr = callback.toString(); if (/debugger/i.test(callbackStr)) { console.log('Blocked anti-debugger setTimeout'); return null; } return originalSetTimeout(callback, delay, ...args); }; // 全局禁用debugger指令 window.debugger = function() { console.log('Debugger call blocked'); };
内容的提问来源于stack exchange,提问作者Toxican
相关产品推荐
相关产品推荐

