常见debugger的作用与绕过
主站 分类 云安全 AI安全 开发安全 2025-11-25 02:49:52 Author: www.freebuf.com(查看原文) 阅读量:3 收藏

freeBuf

主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

在近期站点测试过程中,发现部分网站采取了基于 debugger 的防调试策略,对此进行了初步学习。

1. 基本作用

debugger是 JavaScript 中的一个关键字,用于调用调试功能浏览器开发者工具。
当开发者工具打开时,执行到 debugger语句会触发断点,暂停代码执行,便于开发者检查当前的调用栈、变量状态等。
若未开启开发者工具,则该语句不产生任何效果。

2. 防调试原理

主动中断执行:通过循环、条件判断等方式反复触发 debugger语句,导致调试过程中频繁暂停,干扰正常调试流程。

检测开发者工具:常配合判断开发者工具是否开启(如基于执行时间差、窗口尺寸等特征),在开启时进入无限 debug 循环,阻碍代码分析。

反制手段:可通过禁用断点、重写 debugger功能、或使用插件屏蔽此类干扰。

3.案例分析。

案例1基础 debugger轰炸

防护原理:用高频断点干扰人工分析节奏。

以下是一段小小的debugger代码,以下代码也常用于正常网站的一种反调试。

实现代码
setInterval(() => {
  debugger;
}, 500);

setInterval 是浏览器提供的全局函数,用于周期性执行某个回调函数。
语法:setInterval(callback, delay)
callback:要重复执行的函数
delay:间隔时间(单位:毫秒)

debugger,是 JavaScript 的保留语句。当开发者工具(DevTools)处于打开状态时,执行到该语句会主动中断脚本执行,等待用户点击“继续”。攻击者在动态调试时会被频繁打断,无法流畅分析逻辑。使用 setInterval 实现“持续轰炸”,即使中途打开 F12 也会被捕获。

分析者难点

  • 每隔几百毫秒就被强制暂停一次,无法连续观察代码流程。
  • 自动化工具(如 Puppeteer)若开启 devtools: true也会被卡住。
  • 手动跳过一次后,下一轮又会触发,形成“无限阻断”。

绕过方法:

Blackbox Script:自动忽略所有断点。

Never pause here:在 DevTools 中右键 debugger;行 → 禁止在此暂停。

替换函数体:用一个没有 debugger的函数替代原函数。

测试案例,该测试页面用setInterval实现了反调试功能,定义一个持续触发 debugger 的函数,每 500ms 执行一次,在浏览器打开会无限debugger。

<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8" />
  <title>案例1:基础 debugger 轰炸</title>
</head>
<body>
  <h1>案例1:基础 debugger 轰炸</h1>
  <p>只要打开 F12,每 500ms 就会中断一次!</p>
  <p>关闭 DevTools 或输入绕过代码才能正常运行。</p>
  <pre id="log"></pre>

  <script>
    // 记录中断次数
    let breakCount = 0;

    // 定义一个持续触发 debugger 的函数
    function antiDebug() {
      debugger; // 核心反调试语句:当 DevTools 打开时,执行到这里会暂停

      // 记录并显示中断次数
      breakCount++;
      const time = new Date().toLocaleTimeString();
      document.getElementById("log").textContent += `[${time}] 中断第 ${breakCount} 次\n`;

      // 页面标题闪烁提醒
      document.title = ` 中断中... (${breakCount})`;
      setTimeout(() => { document.title = "基础 debugger 测试"; }, 500);
    }

    // 每 500ms 执行一次 antiDebug 函数
    // 即使你中途打开 F12,也会在下一个周期被捕获
    setInterval(antiDebug, 500);
  </script>
</body>
</html>

浏览器运行结果

1757493248_68c13800b61f0cd0fe8cb.png!small?1757493249517

绕过方法

1.点击下图那个禁用断点的按钮即可
禁止断点过后,大多数情况下可以绕过对方的反调试,但是自己下的断电也会失效。

1763688452_691fc004a1b9db02a2302.png!small?1763688453832

2.在debugger语句所在行的行号上单击鼠标右键,选择"一律不再此处暂停"。

1763688538_691fc05a5e883a70cd4a7.png!sma

免责声明

1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。

2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。

3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。

已在FreeBuf发表 0 篇文章

本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)


文章来源: https://www.freebuf.com/articles/web/458861.html
如有侵权请联系:admin#unsafe.sh