JS 逆向反调试绕过技巧
字数 2226
更新时间 2026-01-21 12:11:44

JS逆向反调试绕过技巧教学文档

一、无限Debugger绕过技术

1.1 反调试原理

  • 网站通过定时执行debugger语句,在用户打开F12开发者工具时强制触发断点
  • 导致调试流程被卡死,阻碍正常的JS代码分析

1.2 绕过方法

方法一:一律不在此处暂停

  • 在Chrome开发者工具中,找到debugger代码所在行号
  • 右键点击行号,选择"一律不在此处暂停"选项
  • 效果:浏览器将忽略该位置的debugger语句

方法二:添加条件断点

  • 在debugger代码行号处右键,选择"添加条件断点"
  • 在条件输入框中设置为"false"
  • 效果:只有当条件为true时断点才会触发,设置为false可永久禁用

方法三:本地替换法

  1. 在Sources面板中,右键debugger语句选择"替换内容"
  2. 创建用于存放修改后代码的本地文件夹
  3. 授权浏览器访问该文件夹
  4. 将debugger语句注释掉或删除后保存
  5. 效果:永久性移除debugger检测

方法四:Firefox浏览器特性

  • 在Firefox开发者工具设置中,取消勾选"在调试器语句上暂停"选项
  • 效果:全局禁用debugger语句的断点功能

二、禁用F12绕过技术

2.1 反调试原理

  • 通过监听以下事件来阻断开发者工具的打开:
    • oncontextmenu:右键菜单事件
    • onkeydown:键盘按下事件(特别是F12键)
    • onselectstart:文本选择开始事件
  • 事件处理函数返回false来阻止默认行为

2.2 绕过方法

方法一:新标签页绕过

  1. 在任意网页先打开F12开发者工具
  2. 将URL地址栏中的网址替换为目标网站地址
  3. 效果:绕过事件监听,直接进入调试状态

方法二:浏览器设置绕过(Chrome)

  1. 进入Chrome设置 → 更多工具 → 开发者工具
  2. 自定义快捷键设置,将打开开发者工具的快捷键改为F12以外的组合(如Alt+D)
  3. 效果:绕过基于F12按键的检测逻辑

三、窗口尺寸检测绕过

3.1 反调试原理

  1. 记录浏览器窗口的初始尺寸(innerWidth、outerWidth等)
  2. 定时检测窗口尺寸变化
  3. 发现异常(如打开开发者工具导致的尺寸变化)则采取防御措施:
    • 刷新页面
    • 清空页面内容
    • 卡死执行流程

3.2 绕过方法

方法一:新标签页绕过

  • 同F12禁用绕过方法,先在别的页面打开开发者工具再跳转

方法二:Hook脚本拦截

实现步骤:

  1. 记录标准尺寸:在脚本加载瞬间记录浏览器当前innerWidth、outerWidth等尺寸作为"正常状态"基准值
  2. 重定义尺寸属性:使用Object.defineProperty重新定义window的尺寸属性,劫持getter方法使其始终返回基准值
  3. 拦截事件监听:重写window.addEventListener,过滤掉resize事件监听
  4. 清空回调函数:手动将window.onresize置为null

技术缺陷:无法防御CSS Media Queries检测。高级检测会通过CSS媒体查询修改元素样式,再用JS判断样式变化,此方法无法拦截。

四、字符串拼接无限Debugger绕过

4.1 反调试原理

  • 不直接写死debugger关键字,而是通过以下方式动态生成:
    • 字符串拼接:de + 'bugger'
    • eval动态执行:eval("debugger")
    • 闭包嵌套生成
  • 浏览器无法静态识别,导致"Disable breakpoints"功能失效

4.2 绕过方法

方法一:Hook脚本拦截

实现步骤:

  1. 清空定时器:通过循环clearTimeout清空浏览器内存中所有定时器,消除后台运行的debugger检测逻辑
  2. 建立过滤机制:将传入的函数或字符串转化为文本,检查是否包含debugger等非法关键字
  3. 代码审计执行:新产生的代码段执行前进行审计,发现debugger直接返回空或不执行

五、Function.prototype.toString()环境检测绕过

5.1 反调试原理

  • 正常模式:函数toString()返回带格式和空格的完整源码
  • 调试模式:返回压缩版(无空格)或native code标识
  • 通过对比toString()返回值的差异判断是否处于调试状态

5.2 绕过方法

方法一:Hook脚本替换

实现步骤:

  1. 创建沙箱环境:在当前页面创建新的iframe,获取其原始未受污染的内置对象
  2. 提取原始方法:从iframe中获取原始的Function.prototype.toString方法
  3. 替换当前方法:用原始方法替换当前页面的toString方法
  4. 清理沙箱:移除iframe恢复DOM结构

六、配套资源

练习靶场

  • GitHub地址:https://github.com/duckpigdog/Vue-Sec/

渗透测试浏览器插件

  • GitHub地址:https://github.com/duckpigdog/XMCVE-WebRecon

七、技术要点总结

  1. 多层次防御:现代网站往往采用多种反调试技术组合使用
  2. 动态检测:静态分析方法逐渐失效,需要动态Hook技术
  3. 浏览器特性:不同浏览器有各自的特性和绕过方法
  4. 持续演进:反调试技术不断更新,需要持续学习新方法

八、注意事项

  1. 上述方法主要用于安全研究和合法渗透测试
  2. 在实际应用中需遵守相关法律法规
  3. 部分方法可能需要根据具体网站环境进行调整
  4. 建议在隔离的测试环境中进行练习和实践
相似文章
相似文章
 全屏