🔹 JS 无限 debugger 防护手段
在 JS 逆向中,攻击者经常用 DevTools 或 Node Inspector 调试代码,拿到逻辑或数据。为了防护,开发者常用各种 无限 debugger / 反调试手段 来增加逆向难度。
1️⃣ 经典无限循环 debugger
原理:通过循环或递归不断触发 debugger,让调试器卡住。
while (true) { debugger; // 每次循环都会停住调试器}- 效果:调试者打开 DevTools 或 Node Inspector 时,程序会一直停在 debugger
- 缺点:没有调试器也会占用 CPU,容易卡死环境
- 用途:最简单的反调试手段,通常配合混淆使用
2️⃣ 自执行递归 setTimeout / setInterval + debugger
原理:用异步循环触发 debugger,比同步无限循环更隐蔽。
(function loop() { debugger; // 触发调试器 setTimeout(loop, 0); // 异步重复触发})();- 特点:即使跳过一次,也会再次触发
- 优势:不会完全阻塞线程,但调试者容易被反复卡住
- 应用:在浏览器混淆后自动注入,可提高逆向难度
3️⃣ 条件触发 debugger(动态反调试)
原理:根据检测到的调试行为或环境触发 debugger。
(function antiDebug() { const start = new Date(); debugger; const end = new Date(); if (end - start > 100) { // 检测 DevTools 停顿时间 // DevTools 开启,触发无限 debugger while(true){ debugger; } }})();- 效果:只在有人调试时触发
- 优势:避免普通用户卡顿
- 应用:浏览器端或 Node.js 生产环境,可结合 javascript-obfuscator 的 debugProtection
4️⃣ toString / 函数自检测 + debugger
原理:通过函数源代码字符串判断 DevTools 调试器是否修改了函数,然后触发 debugger。
function checkDebugger() { const fnStr = checkDebugger.toString(); if (/debugger/.test(fnStr)) { while(true) { debugger; } }}checkDebugger();- 效果:检测源码是否被 tamper
- 用途:防止简单的静态逆向或格式化代码
5️⃣ 混淆工具内置 debugProtection / selfDefending
现代 JS 混淆器(如 javascript-obfuscator)提供内置防护:
const obfuscated = JavaScriptObfuscator.obfuscate(code, { compact: true, controlFlowFlattening: true, debugProtection: true, // 自动注入无限 debugger 防护 selfDefending: true // 保护函数不被修改});- 特点:
- 自动注入无限 debugger 或检测 DevTools
- 与控制流扁平化结合,逆向难度大幅提升
- 优势:省去手写反调试逻辑
- 注意:可能影响调试和性能,需要生产环境测试
6️⃣ 总结与推荐策略
| 防护方式 | 原理 | 优缺点 | 场景 |
|---|---|---|---|
| 无限 while(debugger) | 同步循环触发 | 简单粗暴,CPU 占用高 | 保护关键函数 |
| 异步循环 setTimeout(loop,0) | 异步重复触发 | 不阻塞主线程,但难调试 | 浏览器/Node 混淆后注入 |
| 条件触发 | 检测 DevTools 或停顿 | 只针对调试者,用户不受影响 | 浏览器生产环境 |
| 函数自检测 | 判断函数源码是否被篡改 | 针对静态逆向 | 高安全需求 |
| 混淆器内置 debugProtection | 自动注入防护逻辑 | 方便、高效 | Node/浏览器混淆项目 |
⚠️ 注意:无限 debugger 只能增加逆向难度,但不能保证绝对安全。生产环境应谨慎,结合控制流扁平化和字符串加密使用。
程序员陈师兄
👋 程序员陈师兄 B站人气UP主,授课通俗易懂, 简洁无废话
🚀 曾在某头部公司担任高级后端开发工程师
💻 熟悉 Java / Python / JavaScript / Go 等多种语言,长期专注于逆向、爬虫与后端开发实战
🔥 2021年在B站发布了第一套 JS逆向零基础实战课程,风格 通俗易懂、纯干货无废话,帮助无数学员从零入门并成功应用到实际工作
课程特点
- ✅ 通俗易懂 —— 摒弃枯燥理论,直击核心知识点
- ✅ 纯干货无废话 —— 学员普遍反馈“听一次就懂”
- ✅ 真实案例驱动 —— 来自真实项目的实战总结
这门课程已经成为 无数人学习JS逆向的第一选择。 如果你也想掌握这项核心技能,这门课就是你的 最佳起点。

