清除 Function/eval/Worker 等途径注入的 debugger,提供可选的已知反调试库精准防护与控制台防刷屏,并兼容常见人机验证
这是一个比较通用的阻止常见反调试的脚本,覆盖范围达80%左右!清除网页通过
debugger无限断点、Function/eval动态构造、Worker/SharedWorker/Worklet等途径实施的调试阻断,同时智能兼容人机验证(Cloudflare Turnstile、reCAPTCHA、hCaptcha、Arkose/FunCaptcha),并提供油猴菜单一键开关。
debugger 语句:内置手写词法分析器,正确跳过字符串、注释、正则、模板字面量,绝不误删字符串里的 "debugger" 文本。eval / Function / AsyncFunction / GeneratorFunction / setTimeout / setInterval,以及 DOM 注入(appendChild、innerHTML、insertAdjacentHTML、document.write 等)。Blob / createObjectURL / Worker 链路追踪,将清洗逻辑注入 Worker 引导代码,并保持相对 importScripts 的原始基址。blob: URL 会改变跨页面共享语义,v1.10 起改为显式开关,默认不开启。Worklet.addModule 加载的 paint/audio/layout/animation 模块;发现相对模块依赖时安全回退。Function.prototype.toString 伪装,隐藏补丁痕迹。stable(默认稳健)/ aggressive(激进)/ diagnostic(诊断)。disable-devtool 的官方 CDN、自托管文件名、disable-devtool-auto 属性及独有代码指纹,并优先通过公开 isSuspend API 暂停探针。stable 模式)。默认即开箱即用。若某网站仍然疯狂断点,可切到激进模式:
每次进入新页面时,顶层页面底部会短暂显示运行状态:正常运行时显示 stable / aggressive / diagnostic 模式,本站被禁用或因人机验证兼容而跳过时显示“未运行”及原因;内嵌 iframe 不重复弹出。
⚠️ 由于脚本使用
@inject-into page运行在页面上下文,个别脚本管理器可能不注入同步GM_*API。此时菜单与持久化会静默失效,但核心反调试功能不受影响,会以源码内默认配置运行。
打开脚本源码顶部的 CONFIG 对象即可调整:
| 配置项 | 默认 | 说明 |
|---|---|---|
MODE |
'stable' |
运行模式:stable / aggressive / diagnostic |
DEBUG_LOG |
false |
控制台调试日志(diagnostic 模式自动开启) |
PATCH_EVAL |
false |
代理 eval(激进;会影响 direct eval 的局部作用域) |
PATCH_WORKER |
false |
注入 classic Worker 引导(aggressive 自动开启) |
PATCH_SHARED_WORKER |
false |
包裹 classic SharedWorker;会改变跨页面共享语义,须手动开启 |
PATCH_WORKLET |
false |
清洗 Worklet.addModule 模块(激进) |
PATCH_BLOB |
true |
追踪脚本型 Blob,在 Worker / script 等代码入口使用清洗副本,不改写普通 Blob 数据 |
AGGRESSIVE_IMPORT_SCRIPTS |
false |
Worker 内 importScripts 用 XHR+eval 拦截(激进) |
ALLOW_SYNC_WORKER_FETCH |
false |
允许主线程同步读取未追踪的 Worker/Worklet URL(激进) |
BLOCK_CONSOLE_CLEAR |
true |
阻止 console.clear |
PRECISE_GUARD |
false |
精准防护总开关;也可在油猴菜单中切换并持久化 |
GUARD_KNOWN_ANTI_DEBUG_LIBS |
true |
总开关开启时,精确阻断或暂停已知反调试库 |
GUARD_CONSOLE_FLOOD |
true |
总开关开启时,聚合重复日志并限制明显控制台洪泛 |
CONSOLE_REPEAT_LIMIT |
8 |
同类控制台消息在统计窗口内允许输出的次数 |
CONSOLE_FLOOD_LIMIT |
120 |
单个 console 方法在统计窗口内的总调用阈值 |
CONSOLE_FLOOD_WINDOW_MS |
2000 |
控制台洪泛统计及安静恢复窗口(毫秒) |
PATCH_INNER_HTML |
true |
拦截 innerHTML 中的反调试代码 |
PATCH_REQUEST_ANIMATION_FRAME |
false |
阻断可疑 rAF 回调(激进) |
PATCH_DEBUGGER_CALLBACKS |
false |
阻断整段含 debugger 的回调(激进) |
HUMAN_VERIFICATION_COMPAT |
true |
检测到人机验证时恢复原生环境 |
EXPOSE_DEBUG_API |
false |
暴露 window.__ANTI_DEBUGGER__ 调试接口(诊断) |
SHOW_STATUS_TOAST |
true |
每次进入页面提示脚本运行状态和当前模式 |
DISABLE_HOSTS |
[] |
命中的域名完全跳过(支持 example.com / *.example.com) |
FORCE_AGGRESSIVE_HOSTS |
[] |
命中的域名强制 aggressive |
切到 aggressive 时,会自动开启:PATCH_EVAL、PATCH_WORKER、PATCH_WORKLET、AGGRESSIVE_IMPORT_SCRIPTS、ALLOW_SYNC_WORKER_FETCH、PATCH_REQUEST_ANIMATION_FRAME、PATCH_DEBUGGER_CALLBACKS。
把 MODE 设为 'diagnostic'(或将 EXPOSE_DEBUG_API 设为 true)后,控制台可用 window.__ANTI_DEBUGGER__:
// 查看运行时统计
__ANTI_DEBUGGER__.getStats();
// => { stripped, workersWrapped, workerFallbacks, bootstrapBuilds,
// bootstrapCacheHits, workletModulesCleaned, workletRelativeSkips, ... }
// 查看兼容模式状态
__ANTI_DEBUGGER__.getCompatibilityState();
// 手动测试某段代码是否会被判定可疑 / 被清洗
__ANTI_DEBUGGER__.looksSuspicious('setInterval("debugger", 100)');
__ANTI_DEBUGGER__.stripDebugger('function f(){debugger;return 1}');
| 统计字段 | 含义 |
|---|---|
stripped |
实际发生清洗的代码片段次数 |
workersWrapped |
包裹的专用 Worker 数 |
workerFallbacks |
临时 Worker URL 构造失败并回退原始 URL 的次数 |
sharedWorkersWrapped |
包裹的 SharedWorker 数 |
workletModulesCleaned |
清洗的 Worklet 模块数 |
workletRelativeSkips |
为保留相对模块依赖而跳过清洗的次数 |
bootstrapBuilds / bootstrapCacheHits |
Worker 引导核心的构建 / 缓存命中次数 |
knownLibrariesDetected |
精准防护命中的已知反调试库特征数 |
knownLibrariesBlocked / knownLibrariesSuspended |
插入前阻断的脚本数 / 通过公开 API 暂停的库实例数 |
consoleCallsSuppressed / consoleFloodBursts |
被抑制的控制台调用数 / 进入静默的洪泛批次数 |
compatActivations |
人机验证兼容模式触发次数 |
脚本会在以下情况自动回滚全部补丁,恢复原生环境,避免破坏验证流程:
challenges.cloudflare.com、/cdn-cgi/challenge-platform/、reCAPTCHA、hCaptcha、Arkose/FunCaptcha 等)。<script>/<iframe>/setAttribute/innerHTML/srcdoc 等注入验证资源。blob: URL 构造,跨标签页 / 跨上下文的「共享」语义会退化为每次构造独立,因此 v1.10 不再随 aggressive 自动开启;确有需要时手动开启 PATCH_SHARED_WORKER。import / export 依赖时会回退原始行为。blob: Worker 加载,浏览器不会在构造阶段抛错,脚本无法自动重试原始 URL;构造阶段的同步失败会自动回退。ALLOW_SYNC_WORKER_FETCH / AGGRESSIVE_IMPORT_SCRIPTS 使用同步 XHR,可能在极端情况下造成短暂卡顿;默认关闭。PATCH_EVAL:代理 eval 会破坏 direct eval 的局部作用域语义,故默认关闭,仅激进模式开启。disable-devtool 系列采用高置信度特征;被深度改名、打包进业务 bundle 且不暴露公开 API 的变体仍可能绕过。静态 parser script 可能先开始执行,此时脚本会尽快通过公开 API 暂停,而不会改写已连接节点造成二次加载。MutationObserver 触发时可能已运行),但对后续动态插入的脚本仍然有效。disable-devtool 类反调试脚本,同时尽量保留网站原有快捷键、右键、复制和拖放功能。eval 和 Function 的兼容性处理,修复相对路径、模块依赖及共享语义异常。importScripts 异常后可能重复执行等问题。__ANTI_DEBUGGER__.getStats())。DISABLE_HOSTS / FORCE_AGGRESSIVE_HOSTS)。stripDebugger 的真实依赖,移除无用函数。debugger 剔除、评分制可疑检测、Blob/Worker 链路增强、人机验证兼容等。本项目基于 MIT License 开源。