🔹 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逆向的第一选择。 如果你也想掌握这项核心技能,这门课就是你的 最佳起点。