网页调试之debugger原理与绕过

简介: 当我们调试JS的时候,时常会遇见无限debugger。无限debugger的原理是什么呢?它在何时触发?如何绕过?

当我们调试JS的时候,时常会遇见无限debugger。无限debugger的原理是什么呢?它在何时触发?如何绕过?


debugger 语句用于停止执行 JavaScript(以下简称JS),并调用 (如果可用) 调试函数。

使用 debugger 语句类似于在代码中设置断点。


注意:如果调试工具不可用,则调试语句将无法工作。


实现debugger功能


直接使用书写debugger


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Example DEBUGGER</title>
</head>
<body>
    <script>
        debugger;
    </script>
</body>
</html>


当我们使用浏览器打开Devtools即执行debugger;如下图所示


eval配合debugger


eval() 函数计算 JavaScript 字符串,并把它作为脚本代码来执行。


如果参数是一个表达式,eval() 函数将执行表达式。如果参数是Javascript语句,eval()将执行 Javascript 语句。


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Example DEBUGGER</title>
</head>
<body>
    <script>
        var a = 1;
        eval("var 1 = 1;debugger")
    </script>
</body>
</html>


当使用eval执行时,将会在虚拟机中执行,也就是说非同一作用域。


同时也由于将字符串当作表达式来执行,那么里面常常伴随着代码混淆


函数内执行debugger


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Example DEBUGGER</title>
</head>
<body>
    <script>
        (function a(){
            var data = Date();
            alert(data);
            debugger;
        }())
    </script>
</body>
</html>


因为以上三种体现形式,在debugger上所设计的方案十分多。例如常见的无限制debugger、配合settimeout延迟debugger、代码混淆+debugger等等。


设置debugger的原理去对抗反爬,其核心原理就是如果调试工具可用,则调试语句将执行.也就是经常一打开就跳出debugger。


无限debugger,其实是一种泛指的概念,无限泛指多,而非真的无限

其基于debugger之上,在此加入多次执行debugger的语句从而实现“无限debugger”。“反正只要chrome Devtools不开debugger便不会执行”.(经过调试是这样的,如果不准确请自行完善哦)


debugger绕过原理


debugger的绕过也很简单,我个人总结共有两种大的方向。它们分别是替换、掠过。其原理都是不让debugger执行。个人并不推荐新手使用替换法中的方法


  • 替换法


  • JS注入


  • 重写(Hook)


  • 掠过法


  • Never pause here


  • 条件断点


JS注入


实现js注入的方式有很多,例如chrome Devtools的overrides、fiddler autoresponse、 mitmproxy、Charles的map local等等。若有兴趣自行搜索其使用方式


Never pause here

image.gif

找到debugger前面的行号,鼠标右键点击该行号,点击Never pause here。便会跳过此断点


条件断点


640.jpg

640 (1).jpg


找到debugger前面的行号,鼠标右键点击该行号,点击 Add conditional breakpoint,直接写false。回车即可


Deactivate breakpoints


640 (2).jpg


打开这个图标如下图所示(高亮为打开)


640 (3).jpg


当遇见breakpoints时会执行一次断点,鼠标单击如下图标


640 (4).jpg


即可直接跳过breakpoints。


小技巧:Deactivate breakpoints可以配合xhr、dom、Script等断点使用,便于调试


Hook绕过


function a() {
    eval("debugger");
}


(function() {
    var eval_cache = eval;
    eval = function(obj) {
        if (obj.indexof('debugger') === -1) {
            eval_cache(obj);
        }
    }
}())


此方法有局限性,若在此函数(在这里指函数a)若没有借用相关函数(eval),那么就无法使用此方法绕过


函数滞空法


当遇见断点时,回退一次堆栈。将对应函数滞空即可,例如遇见如下的debugger


function a() {
  debugger;
    eval("debugger");
}


直接在控制台输入如下内容即可。


640 (5).jpg


此方法有局限性,若在此函数中还参杂了关键代码,将可能无法访问或调试等


总结


Debugger绕过其实并不难,但在调试中仅仅是一道“开胃菜”,本节总结了debugger的实现方式,以及触发机制。当然也总结了几种我已知的所有绕过方案。


展望


如何hook“变量”debugger?如果可以实现那么就可以实现反调试的debugger“通杀”,当然目前我也有在探究此方案。在加到hook函数中,那么调试便可以近似于一步到位。

目录
相关文章
|
安全 前端开发 数据安全/隐私保护
BurpSuite进阶篇--自动化挖掘越权漏洞
BurpSuite进阶篇--自动化挖掘越权漏洞
1134 0
|
数据采集 JavaScript 前端开发
JavaScript逆向爬虫——无限debugger的原理与绕过
JavaScript逆向爬虫——无限debugger的原理与绕过
892 2
|
Web App开发 JavaScript 前端开发
Python 自动化 - 浏览器chrome打开F12开发者工具自动Paused in debugger调试导致无法查看网站资源问题原因及解决方法,javascript反调试问题处理实例演示
Python 自动化 - 浏览器chrome打开F12开发者工具自动Paused in debugger调试导致无法查看网站资源问题原因及解决方法,javascript反调试问题处理实例演示
1058 0
Python 自动化 - 浏览器chrome打开F12开发者工具自动Paused in debugger调试导致无法查看网站资源问题原因及解决方法,javascript反调试问题处理实例演示
|
12月前
|
人工智能 C++ iOS开发
ollama + qwen2.5-coder + VS Code + Continue 实现本地AI 辅助写代码
本文介绍在Apple M4 MacOS环境下搭建Ollama和qwen2.5-coder模型的过程。首先通过官网或Brew安装Ollama,然后下载qwen2.5-coder模型,可通过终端命令`ollama run qwen2.5-coder`启动模型进行测试。最后,在VS Code中安装Continue插件,并配置qwen2.5-coder模型用于代码开发辅助。
19657 71
|
11月前
|
Web App开发 数据采集 JavaScript
CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序
本文介绍了Selenium、Chrome DevTools及Chrome DevTools Protocol (CDP) 的基本功能与应用。Selenium是一款开源自动化测试工具,适用于网页端应用程序测试和数据采集,具备跨平台特性。Chrome DevTools内置浏览器中,提供调试、分析Web应用程序的功能,包括元素、控制台、源代码和网络选项卡等。CDP是一套用于与Chromium内核浏览器通信的API,支持自动化测试和性能分析。文中还展示了Selenium与CDP结合使用的示例,如捕获网络请求数据和打印网页内容,并推荐了相关书籍和资源以供深入学习。
1399 39
CDP与Selenium相结合——玩转网页端自动化数据采集/爬取程序
|
10月前
|
存储 Java 持续交付
GitHub-Actions-SpringBoot项目部署
通过以上配置,当代码推送到GitHub仓库时,GitHub Actions将自动执行构建和部署过程,实现持续集成和持续部署。这不仅提高了开发效率,还减少了手动部署的风险。确保每一步操作都正确无误,可以避免常见的CI/CD问题。
384 14
|
Java Android开发
IDEA设置项目编码格式【修改为GBK 或 UTF-8】
这篇文章介绍了在IntelliJ IDEA中如何设置项目编码格式,包括将项目编码修改为GBK或UTF-8的详细步骤和图解。
20319 12
IDEA设置项目编码格式【修改为GBK 或 UTF-8】
|
JavaScript 前端开发 数据安全/隐私保护
雪球JS逆向:阿里系加密acw_sc__v2和反debugger
雪球JS逆向:阿里系加密acw_sc__v2和反debugger
1683 1
|
Oracle 安全 Java
安卓逆向 -- Unidbg环境搭建篇
安卓逆向 -- Unidbg环境搭建篇
794 3
|
Oracle Java 关系型数据库
Java官网下载JDK21版本详细教程(下载、安装、环境变量配置)
Java官网下载JDK21版本详细教程(下载、安装、环境变量配置)