JS逆向-绕过无限debugger
字数 1480 2025-09-01 11:26:11
JS逆向-绕过无限debugger技术解析与绕过方法
0x01 JS逆向-反调试技术概述
反调试技术是防止他人调试、动态分析自己代码的一系列方法,常见的检测调试手段包括:
- 无限debugger技术:通过不断触发debugger语句中断调试流程
- 键盘监听(F12):检测开发者工具的快捷键触发
- 检测浏览器的高度插值:通过窗口尺寸变化判断是否打开了开发者工具
- 检测开发者人员工具变量是否为true:检查
window.devtools等属性 - 利用console.log调用次数:监控console方法的调用频率
- 利用代码运行的时间差:检测代码执行是否被断点暂停
- 利用toString:检测函数toString结果是否被修改
- 检测非浏览器:判断执行环境是否为真实浏览器
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 此处暂停法
- 在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
- 保持对最新反调试技术的研究
- 结合静态分析与动态调试