小白爬虫冒险之反“反爬”:无限debugger、禁用开发者工具、干扰控制台...(持续更新)

背景浅谈

小白踏足JS逆向领域也有一年了,对于逆向这个需求呢主要要求就是让我们去破解**“反爬机制”**,即反“反爬”,脚本处理层面一般都是decipher网站对request设置的cipher,比如破解一个DES/AES加密拿到key。这篇文章先不去谈这类已经进入JS分析阶段的问题,而是往前推到我们的第一步——调试,这也是我们后续分析的前提,学习逆向的大侠们如果自己去找不同的网站练习很容易发现其实很多网站恰恰喜欢在这第一步就设置反爬策略,也就是我这篇博客接下来要谈到的类似于无限debugger的小问题。(毕竟网站也不想被逆向“菜狗”一直请求,所以先把一部分“菜狗”拦下来不让你去分析)

大年初一,我先写一部分短时间能想到的,内容可能也会相对粗糙,后期会加以润色,遇到其他的会继续在此更新。

问题及应对策略

1.无限debugger

无限debugger产生原因

防止爬虫人员调试网站、抓包等行为,恶心你,层层下陷的debugger仿佛“沼泽陷阱”

无限debugger原理

使用debugger关键字与setInterval()或者setTimeout()配合使用造成无限创建虚拟机debugger

setInterval()

点不完的定时器

setTimeout()

配合setInterval()组成递归从而造成无限内陷无法自拔直至程序崩溃

无限debugger破解思路

  1. 断点设置一律不在此处断住

  2. 断点设置条件置为false

  3. 被第一个debugger断住后利用请求堆栈向上溯源利用无限debugger原理定位调用入口,破解调用入口

  4. 脚本注入

    // 重写 debugger 函数
    window.eval = (code) => { 
      if (!code.includes("debugger")) eval(code); 
    };
    

2.禁用开发者工具

当你打开一个网站点击F12准备“大干一场”的时候突然发现网站不允许调试,倘若你刚好是一名“菜鸡”,那你不就炸了吗?

网站禁用开发者工具的实现通常依赖于检测用户是否打开了开发者工具,并通过技术手段进行干扰。以下是其底层原理及应对策略的分析:


一、禁用开发者工具的底层原理

  1. 窗口尺寸检测

    • 原理:开发者工具打开后,浏览器窗口的尺寸或布局可能发生变化(如窗口分栏)。网站通过监听 window.resize 事件或对比 window.outerWidth/innerWidth 的差值来判断。
    • 局限性:响应式设计的网站可能误判,且用户可通过取消开发者工具独立窗口规避。
  2. 控制台属性检测

    • 原理:通过检查 console 对象或 debugger 关键字的状态。例如:

      setInterval(() => {
        if (console.firebug || /./.constructor.prototype.toString = () => {}) {
          alert("开发者工具已打开!");
          window.location.href = "about:blank"; // 强制跳转
        }
      }, 1000);
      
    • 局限性:现代浏览器已修复大部分漏洞,且用户可通过禁用控制台日志输出绕过。

  3. 键盘事件监听

    • 原理:监听 F12Ctrl+Shift+ICtrl+Shift+J 等快捷键的按下事件,阻止默认行为:

      document.addEventListener('keydown', (e) => {
        if (e.keyCode === 123 || (e.ctrlKey && e.shiftKey && e.keyCode === 73)) {
          e.preventDefault();
          window.location.href = "about:blank";
        }
      });
      
    • 局限性:无法阻止通过浏览器菜单手动打开开发者工具。


二、应对策略

有一种很简单的绕过方式就是提前将开发者工具的窗口设置为独立窗口

1. 底层原理分析

开发者工具独立窗口的作用
当开发者工具以独立窗口(非停靠模式)打开时,主浏览器窗口的布局和尺寸不会发生变化。这直接影响网站通过 窗口尺寸变化布局偏移 来检测开发者工具的机制。


2. 针对窗口尺寸检测的绕过

原检测逻辑
网站通过监听 resize 事件或比较 window.outerWidthwindow.innerWidth 的差值,判断开发者工具是否打开(停靠模式会改变主窗口尺寸)。

代码映射

// 原代码中的窗口监听
window.addEventListener("resize", e); // 监听窗口变化触发检测
var c = setInterval(e, 500);          // 定时检测

独立窗口的绕过效果

  • 主窗口尺寸不变,resize 事件不会被触发。
  • 定时执行的 e() 函数仍会运行,但若其逻辑依赖窗口尺寸,则无法检测到工具开启。

局限性
e() 函数包含其他检测逻辑(如控制台属性劫持),独立窗口无法绕过这些检测。


3. 有效性
检测类型独立窗口绕过效果需额外应对措施
窗口尺寸/布局变化有效无需额外操作
控制台属性劫持无效禁用 __defineGetter__ 或静默控制台
定时轮询检测部分有效清除定时器 (clearInterval)
Firebug 对象检测有效(Firebug 已淘汰)无需操作

3.干扰控制台


网站干扰控制台的底层实现原理及应对策略

网站干扰控制台的目的是阻止用户通过开发者工具(如控制台)调试、分析或修改页面逻辑。以下是常见的干扰手段及其应对方法:


一、底层实现原理

1. 禁用控制台方法(Console Methods)

原理
通过重写 console.logconsole.error 等方法,使其无法输出内容或抛出错误。

// 示例:禁用 console.log
console.log = function() {}; 
// 或抛出错误
console.log = function() { throw new Error("Console is disabled"); };

效果
用户在控制台执行 console.log 时无输出或直接报错。


2. 控制台打开检测与警告

原理
通过对比窗口尺寸、计算代码执行时间差,或劫持 console 对象,检测控制台是否打开。

// 示例:通过代码执行时间差检测
const start = Date.now();
console.log("检测控制台");
const delay = Date.now() - start;
if (delay > 50) { 
  alert("控制台已打开!");
  window.location.href = "about:blank"; 
}

效果
用户打开控制台时,页面跳转或弹出警告。


3. 控制台输出劫持

原理
劫持 console 方法,修改输出内容或频率。

// 示例:劫持 console.log 输出乱码
const originalLog = console.log;
console.log = function(...args) {
  originalLog.call(console, "干扰输出: " + Math.random().toString(36));
};

效果
用户看到的控制台输出被篡改,无法获取真实信息。


4. 内存耗尽攻击

原理
通过高频输出大量内容或死循环,导致控制台卡死或浏览器崩溃。

// 示例:每秒输出 10 万条日志
setInterval(() => {
  for (let i = 0; i < 1e5; i++) console.log("垃圾数据");
}, 1000);

效果
控制台因处理海量日志而失去响应。


二、应对策略

1. 恢复原生 Console 方法

方法
在控制台中重置 console 对象,或使用浏览器插件提前注入修复脚本。

// 在控制台执行以下代码恢复 console.log
delete console.log; // 仅对部分重写有效
// 或直接从 iframe 中获取原生 console
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
console.log = iframe.contentWindow.console.log;

适用场景
针对 console 方法被重写或禁用的情况。


2. 屏蔽控制台检测逻辑

方法
使用浏览器插件(如 某猴)在页面加载前注入代码,覆盖检测逻辑。

// ==UserScript==
// @run-at       document-start
// 禁用控制台检测
Object.defineProperty(window, 'console', {
  value: window.console,
  writable: false,
  configurable: false
});
// 覆盖定时器函数
window.setInterval = function() {}; // 禁用所有定时器

适用场景
针对基于定时器或 console 劫持的检测。


3. 使用无头浏览器或代理拦截

方法
通过无头浏览器(如 Puppeteer)或本地代理(如 Charles)直接修改网页内容。

  • Puppeteer 示例

    const puppeteer = require('puppeteer');
    (async () => {
      const browser = await puppeteer.launch();
      const page = await browser.newPage();
      await page.setRequestInterception(true);
      // 拦截并删除干扰脚本
      page.on('request', (req) => {
        if (req.url().includes('anti-console.js')) req.abort();
        else req.continue();
      });
      await page.goto('https://target-site.com');
    })();
    

    适用场景
    自动化绕过所有前端干扰逻辑。


4. 禁用 JavaScript 执行

方法
通过浏览器设置或插件(如 NoScript)直接禁用页面 JavaScript。

  • 操作路径
    Chrome → 设置 → 隐私与安全 → 网站设置 → JavaScript → 禁用。
    缺点
    可能导致页面功能完全失效。

三、总结:干扰手段与应对对照表

干扰手段底层原理应对策略
禁用 Console 方法重写 console.log 等原生方法恢复 console 或通过 iframe 获取原生方法
控制台打开检测窗口尺寸/代码执行时间差检测覆盖检测逻辑或使用无头浏览器
控制台输出劫持篡改 console 输出内容重置 console 或拦截日志输出
内存耗尽攻击高频输出海量日志禁用控制台日志或过滤高频输出
<think>好的,我现在需要帮助用户解决关于DisableDevtool配置的问题。用户提到在配置中使用了`ignore: ['Chrome-Lighthouse']`,但360和谷歌浏览器即使没有打开控制台也会被检测到,导致误拦截。我需要分析可能的原因并提供解决方案。 首先,我需要回忆DisableDevtool的工作原理。它通常通过检测开发者工具是否打开来阻止调试,常见的方法包括检查变量变化、调试函数重写等。但用户的问题是在未打开控制台的情况下被检测,这可能涉及到其他触发条件,比如浏览器特征、用户代理(UA)或插件等。 接下来,用户提到的浏览器是360和谷歌浏览器。360浏览器可能使用Chrome内核,但可能修改了某些特性或UA字符串,导致DisableDevtool误判。而谷歌浏览器未开启控制台也被检测,可能因为DisableDevtool的检测机制存在漏洞,或者浏览器环境触发了某些检测条件。 可能的排查方向包括: 1. **UA检测问题**:DisableDevtool可能根据UA字符串判断浏览器类型,而360浏览器的UA可能包含某些关键词,导致被误加入黑名单。 2. **浏览器特性检测**:比如检查`window.chrome`或`navigator.webdriver`等属性,这些可能在未开启控制台时也存在。 3. **插件或扩展程序**:某些浏览器插件可能注入脚本或修改DOM,触发检测机制。 4. **性能监测或自动化工具**:比如Lighthouse或其他性能测试工具可能在后台运行,导致误判。 接下来,我需要参考用户之前的对话历史。之前用户询问了关于`ignore: ['Chrome-Lighthouse']`的配置,用于排除爬虫工具。这次的问题类似,但涉及不同的浏览器。可能需要检查是否有其他需要忽略的UA字符串或浏览器特征。 用户提供的配置示例中,有忽略列表和高级配置建议,比如正则匹配和动态更新。现在用户遇到误检测,可能需要调整忽略列表,添加360浏览器的特定UA或特征,或者调整检测逻辑以避免误判。 解决方案可能包括: - **扩展ignore列表**:添加360浏览器和Chrome的特定标识到忽略列表。 - **调整检测逻辑**:检查DisableDevtool的配置选项,是否有过于严格的检测方式,可以关闭某些检测方法。 - **环境变量判断**:在特定环境下禁用检测,比如生产环境开启,测试环境关闭。 - **调试和日志记录**:添加日志输出,查看触发检测的具体原因,从而针对性解决。 另外,用户可能对DisableDevtool的具体配置选项不熟悉,需要指导如何正确设置参数,比如`disableMenu`、`clearLog`等,以减少误报。同时,可能需要检查是否有其他安全措施或脚本与DisableDevtool冲突,导致意外行为。 最后,确保用户验证解决方案的有效性,比如通过修改后的配置测试360和Chrome浏览器,观察是否仍被误拦截,并根据结果进一步调整。</think>### 问题分析:未开控制台仍被拦截的典型原因 ```mermaid graph TD A[误拦截现象] --> B{检测机制误触发} B --> C[浏览器特征误判] B --> D[插件/扩展干扰] B --> E[UA嗅探规则过严] B --> F[自动化环境误识别] ``` --- ### 解决方案分步说明 #### 一、精确识别浏览器特征 ```javascript // 在页面中输出浏览器特征 console.log('当前UA特征:', navigator.userAgent); console.log('WebDriver标记:', navigator.webdriver); console.log('Chrome对象:', window.chrome); ``` *360浏览器典型UA特征示例:* ```text Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 QIHU 360SE ``` --- #### 二、动态调整配置参数 ```javascript const is360 = /QIHU 360SE/i.test(navigator.userAgent); const isChrome = /Chrome\/(\d+)/i.test(navigator.userAgent); new DisableDevtool({ ignore: [ 'Chrome-Lighthouse', ...(is360 ? ['QIHU 360SE'] : []), // 动态添加360特征 ...(isChrome ? ['Chrome'] : []) // 豁免普通Chrome访问 ], disableMenu: false, // 关闭右键菜单拦截 clearLog: false, // 禁用console清除 detectors: [ // 选择性启用检测方式 'performance', 'debugger', 'toString' ] }); ``` --- #### 三、关键配置参数对比 | 参数 | 默认值 | 推荐值 | 作用说明 | |---------------|---------|----------|-------------------------| | `disableMenu` | true | false | 禁用右键菜单拦截功能 | | `clearLog` | true | false | 保留控制台日志输出 | | `detectors` | 全开 | 选3项 | 减少检测方式降低误判率 | | `interval` | 500ms | 1000ms | 延长检测间隔 | --- #### 四、进阶调试方法 1. **注入调试代码**: ```javascript // 在DisableDevtool初始化前插入 window._ddt_origin = DisableDevtool; DisableDevtool = function(options) { console.log('检测触发类型:', options.detectors); return new _ddt_origin(options); } ``` 2. **特征白名单配置**: ```javascript // 针对360浏览器特殊处理 if (/360SE/.test(navigator.userAgent)) { Object.defineProperty(navigator, 'webdriver', { get() { return false; } }); } ``` --- ### 验证结果 使用以下命令测试配置效果: ```bash # 模拟普通Chrome访问 curl -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" http://yoursite.com # 检查响应体中是否包含阻断代码 grep -E 'debugger|setInterval|debugFunction' response.html ``` *期望输出:* ```text 未发现任何调试代码注入 ``` --- ### 误判指标公式 通过以下公式计算误判率: $$ \text{误判率} = \frac{\text{错误阻断次数}}{\text{总访问次数}} \times 100\% $$ 当该值超过 **0.5%** 时,建议: 1. 启用`detector`白名单模式 2. 添加浏览器指纹校验 3. 结合服务端UserAgent分析 最终建议采用渐进式检测策略,优先保障正常用户的访问体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不做超级小白

大侠,喜欢的话可以打赏一下哦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值