WebSocket 协议爬虫

devtools/2025/3/4 19:35:00/

⚠️前言⚠️

本文仅用于学术交流。
学习探讨逆向知识,欢迎私信共享学习心得。
如有侵权,联系博主删除。
请勿商用,否则后果自负。

网址

aHR0cHM6Ly93d3cubHV4aS5nb3YuY24vY29sL2NvbDQ0NDQvaW5kZXguaHRtbA==
  • 本网站数据均通过webSocket协议传输
    在这里插入图片描述

一. WebSocket简介 引用 -【K哥】WebSocket 协议爬虫

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,WebSocket 使得客户端和服务器之间的数据交换变得更加简单。
在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。WebSocket 协议简称为 WS 或者 WSS(WebSocket Secure),其发送请求的 URL 以 ws:// 或者 wss:// 开头,WSS 是 WS 的加密版本,
类似于 HTTP 与 HTTPS。WebSocket 协议的最大特点就是:服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,
属于服务器推送技术的一种。
  • 数据传输对比图
    在这里插入图片描述

二. 网站分析

1. 先来分析一下 webSocket 链接的构成,主要分析一下这两个字是怎么生成的,其他暂可固定

在这里插入图片描述

2. 通过查看cookie,我们知道这两个值分别是 cookie
  • dGg2aCfMMK97Ro270mqBFu5qjC8TQbL2opnHvbEpM: 大概率是由session响应的加密信息解密之后得到
  • FW9uCWqlVzC22m1KfCMCjfvFHpRMsgt: 由session接口返回
    在这里插入图片描述
  • session 接口
    在这里插入图片描述
  • session 接口响应内容
    在这里插入图片描述

三. session 接口 data

1. 参数密文生成逻辑分析

在这里插入图片描述

  • 加密位置,ajax断点调试,找到如下位置,h值即为加密data的生成位置
    在这里插入图片描述

  • 参数T分析如下,其中 cid,tabId需要搞一下,其他可固定
    在这里插入图片描述

  • 最终调用 this下的 _dynamicEncrypt 生成
    在这里插入图片描述

2. 参数 T 中 cid 的生成

在这里插入图片描述

  • 需要注意的是 cid 其实就是 localStorage 中的 uuid 属性,调试之前清空浏览器缓存,找到值的生成逻辑
    在这里插入图片描述
  • 最终 cid 其实就是这个 i 值
    在这里插入图片描述
  • 代码改写一下
function getCid(){return Math["random"]()['toString'](36)['slice'](-8)}
3. 参数 T 中 tabId 的生成
  • 回到参数 T 组装的位置看一下,发现 tabId 值存在于 对象 o 中
    在这里插入图片描述
  • 通过堆栈找到 tabId 的生成位置
    在这里插入图片描述

在这里插入图片描述

  • 生成逻辑
    在这里插入图片描述
  • 至此 参数 T 组装完成
4. 加密方法 _dynamicEncrypt
  • 回到参数 data 的生成位置,我们来看一下这个加密方法
    在这里插入图片描述
  • 就是这里了
  • 参数1:明文 T 参数
  • 参数2:priKey 加密 Key 固定
  • 参数3:iv 动态生成
    在这里插入图片描述

在这里插入图片描述

  • js文件 ob 混淆 + webpack,根据webpack扣代码思路,缺那个模块补那个模块就可以
  • 7万多行代码758个模块,没有复杂的环境,这里扣代码细节就不多说了
  • 注意:找对应模块的时候,可以把断点定位在加载器,找起来更方便
    在这里插入图片描述

在这里插入图片描述

5. iv 值
  • 生成位置,就在刚才加密 方法的上方, _dynamicEncrypt 搞定之后,iv 微调一下也就出来了
    在这里插入图片描述
  • 需要注意的是 session 请求发送时,请求头中有个 Etag 值,其实就是iv值,不对应的话请求会发送失败
    在这里插入图片描述

在这里插入图片描述

6. 结果

在这里插入图片描述

四. session 接口响应解密

  • 参数 data 的加密方法 是 _dynamicEncrypt
  • 大胆猜测一下,在对象中可能会存在一个类似名称的解密 方法,这个方法有可能就是用来解密响应内容的
  • 果然,我们直接进方法调试一下看看
    在这里插入图片描述
  • 参数 t 就是session中返回的密文,iv 和 data 生成时保持一致即可
    在这里插入图片描述
  • 结果
    在这里插入图片描述

五. WebSocket

1. 收发信息
  • 直接在network中看收发信息时以乱码的形式展示的

  • 所以我还需要找到js中 websocket 收发位置,看看是怎么加密与解密的

  • 我们可以用webSocket中的一些关键字通过全局检索的方式来定位:
    在这里插入图片描述

  • 信息发送明文位置

在这里插入图片描述

  • 信息发送位置,信息发送前通过 r.encode() 转化了一下,所以我们在 network 中看到的才是乱码
    在这里插入图片描述

  • 信息接收位置,最终通过 r.decode() 转化成明文
    在这里插入图片描述

在这里插入图片描述

  • 信息接收位置,日志断点
    在这里插入图片描述

  • 收发日志信息
    在这里插入图片描述

六. 模拟 webSocket 请求

1. nodejs 模拟简易代码
// 客户端
const WebSocket = require('ws');const options = {headers: {"Sec-WebSocket-Version": "13","Upgrade": "websocket",'Sec-WebSocket-Key': '5ZH2HCR7sxXbypI96Bixqg==','Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits'}
};const socket = new WebSocket('wss链接', [], options);// 当连接建立时触发
socket.onopen = () => {console.log('Connected to server');// 在此处添加发送消息的逻辑...// 模拟心跳setInterval(() => {console.log('send ' + JSON.stringify([-1,["","",32,62,!1]]))socket.send(window.r.encode([-1,["","",32,62,!1]])); // 发送心跳消息以保持连接活跃}, 3000); // 每3秒发送一次心跳消息
};// 当接收到服务器发送的消息时触发
socket.onmessage = (event) => {console.log(`Received: ${window.r.decode(event.data)}`);
};// 当连接关闭时触发
socket.onclose = () => {console.log('Connection closed');
};
2. webSocket特殊 headers 字段说明
  • Upgrade: websocket:表明这是 WebSocket 类型请求;
  • Sec-WebSocket-Version:告诉服务器所使用的 Websocket Draft(协议版本),必须是 13;
  • Sec-WebSocket-Extensions:协议扩展,某类协议可能支持多个扩展,通过它可以实现协议增强;
  • Sec-WebSocket-Key:是 WebSocket 客户端发送的一个 base64 编码的密文,是浏览器随机生成的,要求服务端必须返回一个对应加密的 - Sec-WebSocket-Accept 应答,否则客户端会抛出 Error during WebSocket handshake 错误,并关闭连接。
3. 模拟心跳保持链接活跃,每 3s 一次,上述代码使用定时器实现

在这里插入图片描述

4. 模拟链接服务器
  • 这里不再过多展示了,需要获取特定数据的,可以根据日志模拟信息发送接收
    在这里插入图片描述

没有来的及模拟真实数据接收那一块,来需求了,我要去当牛马了
欢迎私信交流。。。

在这里插入图片描述


http://www.ppmy.cn/devtools/164539.html

相关文章

【Netty】五种经典 IO 模型详解,附各种模型流程图及流程详解

相关概念 同步:线程自己去获取结果(一个线程) 异步:线程自己不去获取结果,而是由其它线程送结果(至少两个线程) 同步阻塞、同步非阻塞、同步多路复用、异步阻塞(没有此情况&#x…

datalist 是什么?

一、datalist 是什么&#xff1f; datalist 是 HTML5 引入的一个表单相关元素&#xff0c;它本质上是一个为输入框&#xff08;<input>&#xff09;提供预定义选项列表的容器。从外观上看&#xff0c;当用户在与之关联的输入框中进行输入操作时&#xff0c;会自动弹出一个…

【计算机网络基础】-------计算机网络概念

1.什么是计算机网络 定义&#xff1a; 图解&#xff1a; 2.最简单的计算机网络 其中&#xff1a; 结点可以是计算机、集线器、交换机、路由器等链路可以是有线链路、无线链路 2.1集线器 2.2交换机 3.互连网&#xff08;internet&#xff09;与 路由器 路由器 与 家用路由…

2025年02月26日Github流行趋势

项目名称&#xff1a;aibrix 项目地址url&#xff1a;https://github.com/vllm-project/aibrix项目语言&#xff1a;Jupyter Notebook历史star数&#xff1a;2234今日star数&#xff1a;881项目维护者&#xff1a;Jeffwan, varungup90, brosoul, nwangfw, kr11项目简介&#xf…

C++:类和对象(下篇)

1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _mont…

如何在Python用Plot画出一个简单的机器人模型

如何在Python中使用 Plot 画出一个简单的模型 在下面的程序中&#xff0c;首先要知道机器人的DH参数&#xff0c;然后计算出每一个关节的位置&#xff0c;最后利用 plot 函数画出关节之间的连杆就可以了&#xff0c;最后利用 animation 库来实现一个动画效果。 import matplo…

基础设施安全(Infrastructure Security)是什么?

基础设施安全&#xff08;Infrastructure Security&#xff09;指的是保护IT基础设施&#xff08;包括物理和云端的服务器、网络设备、存储、数据库等&#xff09;免受网络攻击、数据泄露、未授权访问、系统故障等威胁的各种安全措施和技术。 1. 基础设施安全的主要组成部分 &…

【练习】【贪心】力扣738. 单调递增的数字

题目 单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9 示例 2: 输入: n 1234 输出:…