浏览器反爬-打不开开发工具

前言

身在深渊中,何须怕深渊

有些网站为防止爬虫,打开页面后再打开开发者工具导致页面跳转或者打不开页面

⚠️声明:本文所涉及的爬虫技术及代码仅用于学习、交流与技术研究目的,禁止用于任何商业用途或违反相关法律法规的行为。若因不当使用造成法律责任,概与作者无关。请尊重目标网站的robots.txt协议及相关服务条款,共同维护良好的网络环境。

1.防抽

网页地址:https://landchina.com/#/givingNotice

代码核心检测方式

检测方式 适用浏览器 可靠性 触发方式
console.profile() 早期 Chrome、Opera 已失效 通过 console.profiles.length 判断
console.firebug 早期 Firefox 已失效 Firebug 标志检测
console.table().match(/firebug/i) 早期 Firefox 已失效 Firebug 兼容检测
window.outerHeight - window.innerHeight > 200 Chrome、Firefox 可靠 通过窗口大小变化检测
setInterval(ck, 2000) 所有浏览器 可靠 定时检查 DevTools

代码作用

  • 主要用于检测开发者工具(F12)是否打开,防止用户查看网页源码或爬取数据。
  • 一旦检测到 DevTools 打开,会执行 fanchou() 清空页面并跳转到 about:blank

关键检测方式

  1. console.profile() 检测(已失效)
    • 早期 Chrome 允许 console.profile() 在 DevTools 打开时启用,但现在已被屏蔽。
  2. 检测 Firebug(旧版 Firefox)
    • 通过 console.firebugconsole.table() 关键字检测 Firebug,但该工具已停止维护。
  3. 窗口大小变化检测(有效)
    • window.outerHeight - window.innerHeight > 200
    • 如果窗口高度变化超过 200px,说明 DevTools 可能被打开,触发 fanchou() 清空页面。
  4. 定时 setInterval() 检测
    • 2 秒 运行 ck() 进行检测,若发现异常则清空页面。

地址:

这段 JavaScript 代码的主要目的是检测用户是否打开了开发者工具(F12),如果检测到用户打开了开发者工具,就会触发 fanchou(),执行防抽操作(清空页面内容并跳转到 about:blank )。

(function() {
    function fanchou() {
        // 现代浏览器(如 Chrome、Edge、Firefox)默认会禁止 window.close() 关闭非 window.open() 打开的页面,所以 window.close() 在某些情况下不会生效。
        window.close();
        document.body.innerHTML = ''; // 清空页面内容
        window.location.href = 'about:blank'; // 跳转到空白页
    }

    function ck() {
        console.profile(); // 开启性能分析
        console.profileEnd(); // 结束性能分析

        if (console.clear) {
            console.clear(); // 清空控制台
        }

        if (typeof console.profiles === 'object') {
            return console.profiles.length > 0;
        }
    }

    function hehe() {
        // 1. 检测 Firebug(旧版 Firefox 扩展)
        if (
            (window.console && (console.firebug || console.table && /firebug/i.test(console.table()))) ||
            (typeof opera === 'object' && typeof opera.postError === 'function' && console.profile.length > 0)
        ) {
            fanchou();
        }

        // 2. 检测 console.profiles(旧版 Chrome)
        if (typeof console.profiles === "object" && console.profiles.length > 0) {
            fanchou();
        }
    }

    hehe();

    // 3. 监测窗口大小变化
    window.onresize = function() {
        if ((window.outerHeight - window.innerHeight) > 200) { // 判断窗口变化是否大于 200px
            fanchou();
        }
    };

    // 4. 定时检测 console 变化
    setInterval(function() {
        if (ck()) {
            fanchou();
        }
    }, 2000);
})();

2.window.close()

  • window.close() 只能关闭 window.open() 打开的窗口,用户手动打开的窗口无法关闭。

  • window.opener = null;opener 设为 null,防止窗口与父页面通信,避免浏览器拦截 window.close()

  • 可以用 window.open("", "_self").close(); 绕过浏览器限制

  • 如果 window.close() 无效,可以用 window.history.back()window.location.href = "about:blank" 替代

  • 在按钮 onclick 事件中使用 window.close(),某些浏览器可能允许执行

3.事件监听器断点中的 script 选项

事件监听器断点(Event Listener Breakpoints)是 Chrome 开发者工具(DevTools)提供的一种 调试功能,可以在特定的 DOM 事件触发时自动暂停 JavaScript 执行,帮助开发者分析代码逻辑、找出错误或者逆向分析页面行为。

script 选项下包含两个具体的断点类型:

  • Script First Statement(脚本首语句)

    • 作用:当 JavaScript 代码开始执行时,自动触发断点。

    • 用途:

      • 拦截网页执行的所有 JavaScript 代码。
      • 调试内嵌 JavaScript动态加载的 JavaScript(如 eval())。
      • 用于分析网站的核心 JS 逻辑,包括反爬虫、反调试、加密逻辑等
  • Script Parsed(脚本解析)

    • 作用:当 JavaScript 代码被浏览器解析时(但可能尚未执行),自动触发断点。

    • 用途:

      • 捕获所有 JavaScript 代码,包括 script 标签、document.write()XHR 动态加载的 JS。
      • 分析 JavaScript 代码的执行顺序,找到影响页面加载的 JS 代码。
      • 监测防调试代码,如 debugger;Object.defineProperty(console, ...) 之类的代码。

script 断点的常见用途

场景 使用 script 断点的方式 实际用途
网站开启了防调试(F12 失效) Script First Statement 拦截网站核心 JS 逻辑,找到 debugger; 代码并绕过
网站动态加载 JavaScript Script Parsed 监听 eval()document.write() 等动态 JS 加载行为
分析网页的核心 JavaScript 逻辑 Script First Statement 逆向分析网页代码,找到关键的加密/解密逻辑
调试某个 JS 文件 Script Parsed + Script First Statement 找到 JS 代码的入口,逐步调试
检测网站是否用 eval() 加载 JS Script Parsed 监听 eval() 代码块并中断执行

如何使用 script 断点?

  1. 打开 Chrome 开发者工具(F12 / Ctrl + Shift + I
  2. 切换到 Sources 面板
  3. 在右侧 Event Listener Breakpoints 面板中,展开 script 选项
  4. 勾选 Script First StatementScript Parsed
  5. 刷新页面,观察代码执行情况

image-20250308213614306

4.解决防抽

打开浏览器,在事件监听器断点中脚本(script)勾选上,然后输入地址就能进入断点

image-20250308214402329

既然上面理解了防抽其实就是js代码的作用,我们就断点调试找到对应的代码注释或替换即可

每次加载js脚本都会进入断点,我们在文件搜索window.close,没有就跳过执行下一个,找到后打个断点

image-20250308214707909

可以选择注释或者替换代码即可

image-20250308215536653

5.防抽代码

onDevToolOpen 是一些网站用于检测开发者工具(F12)是否打开的防调试手段。
它通常结合 console.logdebugger 语句、performance API特定事件监听 来实现。

开启了一个定时器监听onDevToolOpen事件

image-20250308215956296

代码

这里不仅关闭浏览器,也启动定时器进行页面跳转

function p() {
                if (h.url)
                    window.location.href = h.url;
                else if (h.rewriteHTML)
                    try {
                        document.documentElement.innerHTML = h.rewriteHTML
                    } catch (o) {
                        document.documentElement.innerText = h.rewriteHTML
                    }
                else {
                    try {
                        // window.opener = null,
                        // window.open("", "_self"),
                        // window.close(),
                        // window.history.back()
                    } catch (o) {
                        console.log(o)
                    }
                    // setTimeout((function() {
                    //     window.location.href = h.timeOutUrl || "https://theajack.github.io/disable-devtool/404.html?h=".concat(encodeURIComponent(location.host))
                    // }
                    // ), 500)
                }
            }

image-20250308220326583

📌 创作不易,感谢支持!
每一篇内容都凝聚了心血与热情,如果我的内容对您有帮助,欢迎请我喝杯咖啡☕,您的支持是我持续分享的最大动力!

wxzf
posted @ 2025-04-10 19:49  peng_boke  阅读(200)  评论(0)    收藏  举报