JS逆向-绕过无限debugger
字数 1480 2025-09-01 11:26:11

JS逆向-绕过无限debugger技术解析与绕过方法

0x01 JS逆向-反调试技术概述

反调试技术是防止他人调试、动态分析自己代码的一系列方法,常见的检测调试手段包括:

  1. 无限debugger技术:通过不断触发debugger语句中断调试流程
  2. 键盘监听(F12):检测开发者工具的快捷键触发
  3. 检测浏览器的高度插值:通过窗口尺寸变化判断是否打开了开发者工具
  4. 检测开发者人员工具变量是否为true:检查window.devtools等属性
  5. 利用console.log调用次数:监控console方法的调用频率
  6. 利用代码运行的时间差:检测代码执行是否被断点暂停
  7. 利用toString:检测函数toString结果是否被修改
  8. 检测非浏览器:判断执行环境是否为真实浏览器

0x02 无限Debugger的原理

Debugger是JavaScript中定义的一个专门用于断点调试的关键字,当代码执行到debugger语句时,JavaScript的执行会在此处中断,进入调试模式。

典型实现方式

setInterval(()=>{
    (function(a) {
        return (function(a) {
            return (Function('Function(arguments[0]+"' + a + '")')())
        })('bugger')('de', 0, 0, (0,0));
    }, 1000);

这段代码通过Function构造函数动态生成"debugger"字符串并执行,每隔1秒触发一次,导致调试器不断中断。

0x03 绕过无限Debugger的方法

1.1 禁用断点法

  • 在开发者工具右侧有一个禁用断点按钮(⚙图标旁)
  • 点击激活后可以跳过所有debugger语句

1.2 此处暂停法

  1. 在debugger语句所在行的行号上单击鼠标右键
  2. 选择"永不再此处暂停"(Never pause here)
  3. 这样调试器会忽略该位置的debugger语句

1.3 条件断点法

  1. 在JS代码debugger行数位置,鼠标右键
  2. 选择"添加条件断点"(Add conditional breakpoint)
  3. 将条件设为false
  4. 这样debugger语句只有在条件为true时才会触发,而条件永远为false

1.4 本地覆盖法

  1. 使用开发者工具的"源代码-工作区"功能
  2. 将远程的Javascript文件映射到本地文件系统
  3. 修改本地文件删除debugger语句
  4. 刷新页面后浏览器会使用修改后的本地文件

0x04 实现原理分析

通过堆栈回溯可以查看debugger是如何生成的:

  1. 代码使用Function构造函数动态生成函数
  2. 通过字符串拼接生成"debugger"关键字
  3. 使用setInterval定时触发
  4. 通过闭包和立即执行函数(IIFE)增加分析难度

0x05 进阶绕过技巧

5.1 修改浏览器行为

  • 使用--auto-open-devtools-for-tabs命令行参数启动浏览器
  • 修改浏览器源码移除调试相关限制

5.2 使用代理工具拦截

  • 通过Fiddler/Charles等工具拦截JS文件
  • 修改响应内容删除debugger代码

5.3 使用无头浏览器

  • 通过Puppeteer/Playwright等工具控制浏览器
  • 在页面加载前注入脚本覆盖debugger功能

5.4 使用Node.js调试

  • 通过Node.js的vm模块执行代码
  • 使用--inspect-brk参数调试时忽略debugger

0x06 防御措施建议

对于网站开发者,建议采用多重反调试策略组合:

  1. 结合无限debugger与其他检测方法
  2. 对关键代码进行混淆加密
  3. 使用WebAssembly保护核心逻辑
  4. 动态生成debugger代码增加分析难度

对于逆向分析者,建议:

  1. 熟练掌握各种绕过方法
  2. 使用自动化工具批量处理debugger
  3. 保持对最新反调试技术的研究
  4. 结合静态分析与动态调试
JS逆向-绕过无限debugger技术解析与绕过方法 0x01 JS逆向-反调试技术概述 反调试技术是防止他人调试、动态分析自己代码的一系列方法,常见的检测调试手段包括: 无限debugger技术 :通过不断触发debugger语句中断调试流程 键盘监听(F12) :检测开发者工具的快捷键触发 检测浏览器的高度插值 :通过窗口尺寸变化判断是否打开了开发者工具 检测开发者人员工具变量是否为true :检查 window.devtools 等属性 利用console.log调用次数 :监控console方法的调用频率 利用代码运行的时间差 :检测代码执行是否被断点暂停 利用toString :检测函数toString结果是否被修改 检测非浏览器 :判断执行环境是否为真实浏览器 0x02 无限Debugger的原理 Debugger是JavaScript中定义的一个专门用于断点调试的关键字,当代码执行到debugger语句时,JavaScript的执行会在此处中断,进入调试模式。 典型实现方式 : 这段代码通过Function构造函数动态生成"debugger"字符串并执行,每隔1秒触发一次,导致调试器不断中断。 0x03 绕过无限Debugger的方法 1.1 禁用断点法 在开发者工具右侧有一个禁用断点按钮(⚙图标旁) 点击激活后可以跳过所有debugger语句 1.2 此处暂停法 在debugger语句所在行的行号上单击鼠标右键 选择"永不再此处暂停"(Never pause here) 这样调试器会忽略该位置的debugger语句 1.3 条件断点法 在JS代码debugger行数位置,鼠标右键 选择"添加条件断点"(Add conditional breakpoint) 将条件设为 false 这样debugger语句只有在条件为true时才会触发,而条件永远为false 1.4 本地覆盖法 使用开发者工具的"源代码-工作区"功能 将远程的Javascript文件映射到本地文件系统 修改本地文件删除debugger语句 刷新页面后浏览器会使用修改后的本地文件 0x04 实现原理分析 通过堆栈回溯可以查看debugger是如何生成的: 代码使用 Function 构造函数动态生成函数 通过字符串拼接生成"debugger"关键字 使用 setInterval 定时触发 通过闭包和立即执行函数(IIFE)增加分析难度 0x05 进阶绕过技巧 5.1 修改浏览器行为 使用 --auto-open-devtools-for-tabs 命令行参数启动浏览器 修改浏览器源码移除调试相关限制 5.2 使用代理工具拦截 通过Fiddler/Charles等工具拦截JS文件 修改响应内容删除debugger代码 5.3 使用无头浏览器 通过Puppeteer/Playwright等工具控制浏览器 在页面加载前注入脚本覆盖debugger功能 5.4 使用Node.js调试 通过Node.js的vm模块执行代码 使用 --inspect-brk 参数调试时忽略debugger 0x06 防御措施建议 对于网站开发者,建议采用多重反调试策略组合: 结合无限debugger与其他检测方法 对关键代码进行混淆加密 使用WebAssembly保护核心逻辑 动态生成debugger代码增加分析难度 对于逆向分析者,建议: 熟练掌握各种绕过方法 使用自动化工具批量处理debugger 保持对最新反调试技术的研究 结合静态分析与动态调试