小白爬虫冒险之反“反爬”:无限debugger、禁用开发者工具、干扰控制台...(持续更新)
背景浅谈
小白踏足JS逆向领域也有一年了,对于逆向这个需求呢主要要求就是让我们去破解**“反爬机制”**,即反“反爬”,脚本处理层面一般都是
decipher
网站对request
设置的cipher
,比如破解一个DES/AES
加密拿到key
。这篇文章先不去谈这类已经进入JS分析阶段的问题,而是往前推到我们的第一步——调试,这也是我们后续分析的前提,学习逆向的大侠们如果自己去找不同的网站练习很容易发现其实很多网站恰恰喜欢在这第一步就设置反爬策略,也就是我这篇博客接下来要谈到的类似于无限debugger的小问题。(毕竟网站也不想被逆向“菜狗”一直请求,所以先把一部分“菜狗”拦下来不让你去分析)大年初一,我先写一部分短时间能想到的,内容可能也会相对粗糙,后期会加以润色,遇到其他的会继续在此更新。
问题及应对策略
1.无限debugger
无限debugger产生原因
防止爬虫人员调试网站、抓包等行为,恶心你,层层下陷的debugger
仿佛“沼泽陷阱”
无限debugger原理
使用debugger
关键字与setInterval()
或者setTimeout()
配合使用造成无限创建虚拟机debugger
setInterval()
点不完的定时器
setTimeout()
配合setInterval()
组成递归从而造成无限内陷无法自拔直至程序崩溃
无限debugger破解思路
-
断点设置一律不在此处断住
-
断点设置条件置为
false
-
被第一个
debugger
断住后利用请求堆栈向上溯源利用无限debugger原理定位调用入口,破解调用入口 -
脚本注入:
// 重写 debugger 函数 window.eval = (code) => { if (!code.includes("debugger")) eval(code); };
2.禁用开发者工具
当你打开一个网站点击F12准备“大干一场”的时候突然发现网站不允许调试,倘若你刚好是一名“菜鸡”,那你不就炸了吗?
网站禁用开发者工具的实现通常依赖于检测用户是否打开了开发者工具,并通过技术手段进行干扰。以下是其底层原理及应对策略的分析:
一、禁用开发者工具的底层原理
-
窗口尺寸检测
- 原理:开发者工具打开后,浏览器窗口的尺寸或布局可能发生变化(如窗口分栏)。网站通过监听
window.resize
事件或对比window.outerWidth/innerWidth
的差值来判断。 - 局限性:响应式设计的网站可能误判,且用户可通过取消开发者工具独立窗口规避。
- 原理:开发者工具打开后,浏览器窗口的尺寸或布局可能发生变化(如窗口分栏)。网站通过监听
-
控制台属性检测
-
原理:通过检查
console
对象或debugger
关键字的状态。例如:setInterval(() => {if (console.firebug || /./.constructor.prototype.toString = () => {}) {alert("开发者工具已打开!");window.location.href = "about:blank"; // 强制跳转} }, 1000);
-
局限性:现代浏览器已修复大部分漏洞,且用户可通过禁用控制台日志输出绕过。
-
-
键盘事件监听
-
原理:监听
F12
、Ctrl+Shift+I
、Ctrl+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.outerWidth
和 window.innerWidth
的差值,判断开发者工具是否打开(停靠模式会改变主窗口尺寸)。
代码映射:
// 原代码中的窗口监听
window.addEventListener("resize", e); // 监听窗口变化触发检测
var c = setInterval(e, 500); // 定时检测
独立窗口的绕过效果:
- 主窗口尺寸不变,
resize
事件不会被触发。 - 定时执行的
e()
函数仍会运行,但若其逻辑依赖窗口尺寸,则无法检测到工具开启。
局限性:
若 e()
函数包含其他检测逻辑(如控制台属性劫持),独立窗口无法绕过这些检测。
3. 有效性
检测类型 | 独立窗口绕过效果 | 需额外应对措施 |
---|---|---|
窗口尺寸/布局变化 | 有效 | 无需额外操作 |
控制台属性劫持 | 无效 | 禁用 __defineGetter__ 或静默控制台 |
定时轮询检测 | 部分有效 | 清除定时器 (clearInterval ) |
Firebug 对象检测 | 有效(Firebug 已淘汰) | 无需操作 |
3.干扰控制台
网站干扰控制台的底层实现原理及应对策略
网站干扰控制台的目的是阻止用户通过开发者工具(如控制台)调试、分析或修改页面逻辑。以下是常见的干扰手段及其应对方法:
一、底层实现原理
1. 禁用控制台方法(Console Methods)
原理:
通过重写 console.log
、console.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 或拦截日志输出 |
内存耗尽攻击 | 高频输出海量日志 | 禁用控制台日志或过滤高频输出 |
相关文章:
小白爬虫冒险之反“反爬”:无限debugger、禁用开发者工具、干扰控制台...(持续更新)
背景浅谈 小白踏足JS逆向领域也有一年了,对于逆向这个需求呢主要要求就是让我们去破解**“反爬机制”**,即反“反爬”,脚本处理层面一般都是decipher网站对request设置的cipher,比如破解一个DES/AES加密拿到key。这篇文章先不去谈…...

Ubuntu中MySQL安装-02
服务器端安装 安装服务器端:在终端中输入如下命令,回车后,然后按照提示输入 sudo apt-get install mysql-server 当前使用的ubuntu镜像中已经安装好了mysql服务器端,无需再安装,并且设置成了开机自启动服务器用于接…...

大数据相关职位介绍之一(数据分析,数据开发,数据产品经理,数据运营)
大数据相关职位介绍之一 随着大数据、人工智能(AI)和机器学习的快速发展,数据分析与管理已经成为各行各业的重要组成部分。从互联网公司到传统行业的数字转型,数据相关职位在中国日益成为推动企业创新和提升竞争力的关键力量。以…...

使用DeepSeek API生成Markdown文件
DeepSeek技术应用与代码实现 一、DeepSeek简介 DeepSeek是一款强大的人工智能写作助手,能够根据用户输入的提示(Prompt)快速生成高质量的文章。它不仅支持批量生成文章,还能通过智能分段、Markdown转HTML等功能优化内容。此外&…...

java多线程学习笔记
文章目录 关键词1.什么是多线程以及使用场景?2.并发与并行3.多线程实现3.1继承 Thread 类实现3.2Runnable 接口方式实现3.3Callable接口/Future接口实现3.4三种方式总结 4.常见的成员方法(重点记忆)94.1setName/currentThread/sleep要点4.2线程的优先级…...

Manticore Search,新一代搜索引擎之王
吊打ES,新一代搜索引擎之王 概述 Manticore Search 是一个开源的分布式搜索引擎,专注于高性能和低延迟的搜索场景。 它基于 Sphinx 搜索引擎开发,继承了 Sphinx 的高效索引和查询能力,并在分布式架构、实时搜索、易用性等方面进…...

【MySQL】数据类型与表约束
目录 数据类型分类 数值类型 tinyint类型 bit类型 小数类型 字符串类型 日期和时间类型 enum和set 表的约束 空属性 默认值 列描述 zerofill 主键 自增长 唯一键 外键 数据类型分类 数值类型 tinyint类型 MySQL中,整形可以是有符号和无符号的&…...
CAG技术:提升LLM响应速度与质量
标题:CAG技术:提升LLM响应速度与质量 文章信息摘要: CAG(Cache-Augmented Generation)通过预加载相关知识到LLM的扩展上下文中,显著减少了检索延迟和错误,从而提升了响应速度和质量。与传统的R…...
上位机知识篇---Linux源码编译安装链接命令
文章目录 前言第一部分:Linux源码编译安装1. 安装编译工具2. 下载源代码3. 解压源代码4. 配置5. 编译6. 测试(可选)7. 安装8. 清理(可选)9.注意事项 第二部分:链接命令硬链接(Hard Link…...

科研绘图系列:R语言绘制线性回归连线图(line chart)
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图保存图片系统信息参考介绍 科研绘图系列:R语言绘制线性回归连线图(line chart) 加载R包 library(tidyverse) library(ggthemes) libra…...

将ollama迁移到其他盘(eg:F盘)
文章目录 1.迁移ollama的安装目录2.修改环境变量3.验证 背景:在windows操作系统中进行操作 相关阅读 :本地部署deepseek模型步骤 1.迁移ollama的安装目录 因为ollama默认安装在C盘,所以只能安装好之后再进行手动迁移位置。 # 1.迁移Ollama可…...

Oracle 创建用户和表空间
Oracle 创建用户和表空间 使用sys 账户登录 建立临时表空间 --建立临时表空间 CREATE TEMPORARY TABLESPACE TEMP_POS --创建名为TEMP_POS的临时表空间 TEMPFILE /oracle/oradata/POS/TEMP_POS.DBF -- 临时文件 SIZE 50M -- 其初始大小为50M AUTOEXTEND ON -- 支持…...

cursor ide配置远程ssh qt c++开发环境过程记录
cursor是啥就不介绍了,好像是目前最好用的ai ide,下面主要是配置远程ssh连接linux机器进行qt5 c程序运行的配置过程记录。 一、c_cpp_properties.json 在项目根目录的.vscode目录里面新建c_cpp_properties.json文件,根据你的实际情况配置该文…...

yolov5错误更改与相关参数详解(train.py)
1.错误更改 main中相关参数 if __name__ __main__:parser argparse.ArgumentParser()parser.add_argument(--weights, typestr, default, helpinitial weights path)parser.add_argument(--cfg, typestr, defaultmodels/yolov5s.yaml, helpmodel.yaml path)parser.add_arg…...

Python设计模式 - 组合模式
定义 组合模式(Composite Pattern) 是一种结构型设计模式,主要意图是将对象组织成树形结构以表示"部分-整体"的层次结构。这种模式能够使客户端统一对待单个对象和组合对象,从而简化了客户端代码。 组合模式有透明组合…...

css粘性定位超出指定宽度失效问题
展示效果 解决办法:外层容器添加display:grid即可 完整代码 <template><div class"box"><div class"line" v-for"items in 10"><div class"item" v-for"item in 8">drgg</div>&…...

Windows 程序设计6:错误码的查看
文章目录 前言一、说明二、使用GetLastError找到错误的原因三、使用错误码的宏总结 前言 Windows 程序设计6:错误码的查看。 一、说明 有时写的代码单纯看是没有问题的,但是执行起来就会崩溃。因此要养成判断函数执行是否成功的习惯,除非这…...
doris: CSV导入数据
本文介绍如何在 Doris 中导入 CSV 格式的数据文件。Doris 支持灵活的 CSV 格式配置,包括自定义分隔符、字段包围符等,并提供多种导入方式以满足不同场景的数据导入需求。 导入方式 Doris 支持以下方式导入 CSV 格式数据: Stream LoadBro…...
FastStone Image Viewer图像处理软件安装步骤(百度网盘链接)
软件简介:一款小巧便捷的添加水印、特效、图片处理软件,让使用者可以通过它的操作界面来浏览图片,且还支持了幻灯播放的功能,让使用者能够轻松的浏览目录中的所有图片。 网盘链接:https://pan.baidu.com/s/1Zvrx7fXwb6…...

Kafka 深入服务端 — 时间轮
Kafka中存在大量的延迟操作,比如延时生产、延时拉取和延时删除等。Kafka基于时间轮概念自定义实现了一个用于延时功能的定时器,来完成这些延迟操作。 1 时间轮 Kafka没有使用基于JDK自带的Timer或DelayQueue来实现延迟功能,因为它们的插入和…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...

stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...