Js逆向教程19-websocket介绍

news2024/11/28 17:58:04

Js逆向教程19-websocket介绍

在这里插入图片描述

作者:虚坏叔叔
博客:https://xuhss.com

早餐店不会开到晚上,想吃的人早就来了!😄

一、websocket介绍

Ws和Wss的区别相当于http和https的区别,

如果你想写一个聊天页面,需要频繁请求后台接口 还需要设置间隔时间(每隔1s发送一个请求) 才能拿到后台服务器的数据,因为http是轮询方式,只有请求完成后,才能拿到结果,只有客户端能发请求,所以说 要轮询 。

缺点就是占用服务器的性能?

更好的方案就是websocket,它是浏览器实现的。浏览器在底层升级http协议,从http协议升级到websocket只需要添加几个头部信息就可以完成升级。

为什么学逆向还要学wss呢,因为它不同于我们常用的http http用ajax发包。但是wss不是ajax发送请求

它是长连接协议 它的客户端一直会等着服务器发送数据。一些聊天软件也会加密 所以我们也需要逆向,其次,http都是文本数据,不会加密。wss发过来的都是二进制数据。这种字节码分析起来就比较麻烦,所以我们需要学调试字节码的技巧。

二、不同协议传输的类型

http最多的方式是json/xml/长文本。

wss传输二进制.

王者荣耀用protobuf,优点就是占用空间少。

QQ用的是TLV,TLV优点是处理tcp/udp的沾包问题。

三、websocket详解

这是关于介绍

https://www.runoob.com/html/html5-websocket.html

创建websocket对象才能在网页上使用。它是浏览器BOM定义好了,不能在v8引擎实现。

var Socket = new WebSocket(url, [protocol] );

其他语言都有封装websocket库 所以不在v8引擎实现也没关系。

既然是浏览器自带的,那么所有人实现都要带上websocket。

所以websocket本身就是关键词。

WebSocket 属性

属性描述
Socket.readyState只读属性 readyState 表示连接状态,可以是以下值:0 - 表示连接尚未建立。1 - 表示连接已建立,可以进行通信。2 - 表示连接正在进行关闭。3 - 表示连接已经关闭或者连接不能打开。
Socket.bufferedAmount只读属性 bufferedAmount 已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。

WebSocket 事件

可以通过Socket.onopen Socket.onmessage关键字查找。

Socket.onopen 因为服务器不知道客户端是否掉线。一般来说客户端退出要发送一个通知给服务器,这样服务器才知道,但有时客户端断点了,服务器那边还在等着客户端的退出请求呢 但是客户端断电了1小时 那么客户端就需要等1小时,会存在资源的浪费。如果同时有100个人掉线了,服务器还以为有100个人在线,就会产生资源的浪费。

通过心跳包就可以解决这个问题,约定的 客户端每隔30秒给服务器发个1,没有其他意义 ,什么时候服务器等了30秒后 没有接收到1,那么就直接断开和客户端的接触。这就是心跳包。

大家有时候做websocket爬取会莫名其妙断开了 一般是心跳包的问题

事件事件处理程序描述
openSocket.onopen连接建立时触发
messageSocket.onmessage客户端接收服务端数据时触发
errorSocket.onerror通信发生错误时触发
closeSocket.onclose连接关闭时触发

WebSocket 方法

Socket.send() 定义了客户端发送给服务器的方法。

比如说你看到了一个加密的数据从客户端发送到服务器,这个时候就应该找到send方法。

方法描述
Socket.send()使用连接发送数据
Socket.close()关闭连接

客户端的 HTML 和 JavaScript

目前大部分浏览器支持 WebSocket() 接口,你可以在以下浏览器中尝试实例: Chrome, Mozilla, Opera 和 Safari。

<!DOCTYPE HTML>
<html>
   <head>
   <meta charset="utf-8">
   <title>菜鸟教程(runoob.com)</title>
    
      <script type="text/javascript">
         function WebSocketTest()
         {
            if ("WebSocket" in window)
            {
               alert("您的浏览器支持 WebSocket!");
               
               // 打开一个 web socket
               var ws = new WebSocket("ws://localhost:9998/echo");
                
               ws.onopen = function()
               {
                  // Web Socket 已连接上,使用 send() 方法发送数据
                  ws.send("发送数据");
                  alert("数据发送中...");
               };
                
               ws.onmessage = function (evt) 
               { 
                  var received_msg = evt.data;
                  alert("数据已接收...");
               };
                
               ws.onclose = function()
               { 
                  // 关闭 websocket
                  alert("连接已关闭..."); 
               };
            }
            
            else
            {
               // 浏览器不支持 WebSocket
               alert("您的浏览器不支持 WebSocket!");
            }
         }
      </script>
        
   </head>
   <body>
   
      <div id="sse">
         <a href="javascript:WebSocketTest()">运行 WebSocket</a>
      </div>
      
   </body>
</html>

四、实战

我们看一下网页的websocket的js应该怎么写,

http://kedou.workerman.net/

抓包的时候只能从new的时候开始抓,

打开调试工具,刷页面,切换到ws就可以看到请求了:

在这里插入图片描述

因为它不同于http所以就只有一个数据。可以看到这个数据一直在发送

在这里插入图片描述

红色箭头代码服务器像我们发送的数据

绿色箭头代表我们向服务器发送的数据

在这里插入图片描述

先看包的头部有哪些数据

ws开头的get请求 状态码是101 ,如果加密的就是wss

在这里插入图片描述

这四个标识了当前数据要升级为websocket,

Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: ODinYifeI+YCKffoh3pYfg==(可以随机生成)
Sec-WebSocket-Version: 13
Upgrade: websocket

在这里插入图片描述

返回的包:

服务器发回的数据

Connection: Upgrade
Sec-WebSocket-Accept: OKnTsOelskI4clKTEKuusDX+DMc=
Sec-WebSocket-Version: 13
Upgrade: websocket

在这里插入图片描述

这里的数据是明文的。它不同于http调试

通过包可以直接找到发起ws的位置:

在这里插入图片描述

		webSocket 				= new WebSocket( model.settings.socketServer );
		webSocket.onopen 		= app.onSocketOpen;
		webSocket.onclose		= app.onSocketClose;
		webSocket.onmessage 	= app.onSocketMessage;
		

绑定方法后 就会接收数据。

假如你找不到 也可以搜索

.onopen 

找到

在这里插入图片描述

停下断点后 可以点击js进到具体的方法。

在这里插入图片描述

这里就可以看到数据 没有加密的数据

在这里插入图片描述

搜索

.send(

可以找到发送数据的地方。

在所有相关的位置下断点

在这里插入图片描述

发送数据 就可以看到发送的明文数据

[

第五、总结

最后的最后
由本人水平所限,难免有错误以及不足之处, 屏幕前的靓仔靓女们 如有发现,恳请指出!

最后,谢谢你看到这里,谢谢你认真对待我的努力,希望这篇博客对你有所帮助!

你轻轻地点了个赞,那将在我的心里世界增添一颗明亮而耀眼的星!

💬 往期优质文章分享

  • C++ QT结合FFmpeg实战开发视频播放器-01环境的安装和项目部署
  • 解决QT问题:运行qmake:Project ERROR: Cannot run compiler ‘cl‘. Output:
  • 解决安装QT后MSVC2015 64bit配置无编译器和调试器问题
  • Qt中的套件提示no complier set in kit和no debugger,出现黄色感叹号问题解决(MSVC2017)
  • Python+selenium 自动化 - 实现自动导入、上传外部文件(不弹出windows窗口)

🚀 优质教程分享 🚀

  • 🎄如果感觉文章看完了不过瘾,可以来我的其他 专栏 看一下哦~
  • 🎄比如以下几个专栏:Python实战微信订餐小程序、Python量化交易实战、C++ QT实战类项目 和 算法学习专栏
  • 🎄可以学习更多的关于C++/Python的相关内容哦!直接点击下面颜色字体就可以跳转啦!
学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战 💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统
❤️ C++ QT结合FFmpeg实战开发视频播放器❤️难度偏高分享学习QT成品的视频播放器源码,需要有扎实的C++知识!
💚 游戏爱好者九万人社区💚互助/吹水九万人游戏爱好者社区,聊天互助,白嫖奖品
💙 Python零基础到入门 💙Python初学者针对没有经过系统学习的小伙伴,核心目的就是让我们能够快速学习Python的知识以达到入门

🚀 资料白嫖,温馨提示 🚀

关注下面卡片即刻获取更多编程知识,包括各种语言学习资料,上千套PPT模板和各种游戏源码素材等等资料。更多内容可自行查看哦!

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/49436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Studio实现课程表应用,美观又实用(Kotlin版本)

项目目录一、应用概述二、主要技术三、开发环境四、主要功能1、设置课程表2、导入导出3、上下课提醒五、运行演示一、应用概述 本次课程表应用功能非常丰富&#xff0c;而且非常实用&#xff0c;可以添加学期的课程信息&#xff0c;设置展示的课程页面&#xff0c;设置上下课时…

李沐《动手学深度学习》第二版 pytorch笔记1 环境搭建

李沐《动手学深度学习》第二版pytorch笔记1 搭建环境 文章目录李沐《动手学深度学习》第二版pytorch笔记1 搭建环境此时尚有耐心虚拟环境搭建创建虚拟环境查看已有的虚拟环境激活虚拟环境安装深度学习框架和d2l软件包安装d2l安装pytorch连接到虚拟环境测试一下再试试...好难搞下…

[附源码]Python计算机毕业设计Django的剧本杀管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

《Mission Red in Slience》——这本“连环画”值得一看

生命离不开血液。 血液对人的意义是不言而喻的&#xff0c;当失血到总量的30%时&#xff0c;人就会有生命危险。这也就意味着献血有时是看似渺小&#xff0c;实际拯救生命的壮举。同时适度的献血对献血人也有助的。 但很多人对献血缺乏认识&#xff0c;认为其可能具有危险性&…

[附源码]Python计算机毕业设计SSM乐跑(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

3.每天进步一点点-Python爬虫需要了解HTTP 请求报文

14天学习训练营导师课程&#xff1a; 杨鑫《Python 自学编程基础》 杨鑫《 Python 网络爬虫基础》 杨鑫《 Scrapy 爬虫框架实战和项目管理》 文章目录1.HTTP 请求报文1.1 请求行1.2 请求头1.3 空行1.4 请求正文1.HTTP 请求报文 ​ HTTP&#xff08;Hyper Text Transfer Protoc…

基于51单片机锂电池电压电量检测(原理图+PCB+程序)

资料编号&#xff1a;198 下面是该资料仿真演示视频&#xff1a; 198-基于51单片机锂电池电压电量检测&#xff08;原理图PCB程序全套资料&#xff09;功能介绍&#xff1a; 采用51系列自带AD的单片机stc12c5a60s2型号单片机&#xff08;也是51单片机&#xff0c;外观引脚大小…

20uec++多人游戏【小球与玩家互动】

为小球添加生命值组件和伤害处理函数 //生命值组件UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category "Components")class USHealthComponent * HealthComp;//伤害处理函数UFUNCTION()void HandleTakeAnyDamage(USHealthComponent * OwnerHealthComp, float…

【蓝桥杯十四届第二期模拟赛】第四题——递归求解(python)(耗时仅不到1s出答案)(lru_cache)

前言 这次的第二期蓝桥杯模拟赛为登录官网考试&#xff0c;并没有使用我们那个机房的破电脑&#xff0c;你都让我使用我自己的电脑了&#xff0c;那我不得皮一下【doge】 第四题是填空题&#xff0c;虽然我报名的是c语言赛道&#xff0c;但是还是默默打开了我的pycharm&#…

Bandizip去除广告,注册图标,状态栏文本

Bandizip7.0版本之后&#xff0c;免费版就加入了广告。 安装完成后&#xff0c;Bandizip界面如下&#xff0c;很遗憾&#xff0c;我的没有出现广告&#xff0c;没法展示。 目标&#xff1a;去除界面左上角的注册图标&#xff0c;以及下方底部的状态栏“固实压缩”字样那里&am…

安全多方学习开源框架调研

原创 复旦DSG研究组 开放隐私计算 开放隐私计算 开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”…

ROS + vscode环境搭建

问题描述 使用ROS vscode进行开发. 解决方案 1. 安装ROS和vscode. 2. 打开vscode, 安装ROS插件. 3. 创建工作空间, 并进行一次catkin_make. mkdir -p catkin_ws/src cd catkin_ws/ catkin_make 4. 用vscode打开工作空间. cd catkin_ws/ code . vscode的ROS插件会自动配…

计算机网络笔记4 网络层

文章目录笔记前言一、网络层概述二、网络层数据交换方式2.1 电路交换2.2 报文交换2.3 分组交换三、网络层协议及报文格式3.10 IP数据报格式3.1 IPv4协议分类编址划分子网无分类编址CIDR3.20 IPv6数据报格式3.2 IPv6协议IPv6地址类型IPv4和IPv6之间的过渡3.3 ARP协议(地址解析协…

Go-Excelize API源码阅读(三十八)——SetCellValue

Go-Excelize API源码阅读&#xff08;三十八&#xff09;——SetCellValue 开源摘星计划&#xff08;WeOpen Star&#xff09; 是由腾源会 2022 年推出的全新项目&#xff0c;旨在为开源人提供成长激励&#xff0c;为开源项目提供成长支持&#xff0c;助力开发者更好地了解开源…

Java基础:方法

1. 回顾方法的定义和调用 前面的课程中&#xff0c;使用过嵌套循环输出矩形&#xff0c;控制台打印出矩形就可以了&#xff0c;因此将方法定义为 void &#xff0c;没有返回值。 在主方法 main 中直接被调用。 public class Method { public static void main(String[] args…

Lambda 表达式

1. Lambda 表达式 1.1 通过接口传递代码 针对接口而非具体类型进行编程&#xff0c;可以降低程序的耦合性&#xff0c;提高灵活性&#xff0c;提高复用性。接口常被用于传递代码&#xff0c;比如&#xff0c;我们知道 File 有如下方法&#xff1a; public File[] listFiles(F…

Unity3D中实现Player的第一人称视角

效果,上面为Scene场景&#xff0c;下面为Game场景 0创建地形&#xff0c;当然可以先简单的创建一个空白的Terrain。这里我已经对地形进行了初步的编辑和渲染。 1.在Hierarchy视图中右键创建一个胶囊体&#xff08;Capsule&#xff09;作为Player&#xff0c;添加好后重置胶囊体…

039-java集合框架的作用及使用(Collection,Set,Map,SimpleDateFormat)

上一讲:038-JTable控件应用案例讲解_CSDN专家-赖老师(软件之家)的博客-CSDN博客 Java集合体系框架 ava集合类主要由两个根接口Collection和Map派生出来的。 Collection派生出了三个子接口: 集合框架中所有的接口,类都在java.util包中 集合就是动态数组,与数组…

Ubuntu18 vscode配置Ceres的调试

Ceres只支持CMake编译&#xff0c;不支持外部链接方式。因此vscode无法配置Ceres调试&#xff01; 具体过程如下&#xff1a; 首先写了个CMakeLists.txt&#xff0c;(官方demo)&#xff0c;测试编译&#xff1a; project(ceres_test) cmake_minimum_required(VERSION 3.0) f…

uni-app进阶使用(vuex、组件、api)

在上一篇文章介绍了uni-app的基本用法&#xff0c;本章介绍在uni-app中vuex、组件、api的用法。 一、如何使用vuex 1.1 初始化 在项目根目录下创建store文件夹&#xff0c;在其内新建一个文件index.js&#xff0c;在index.js对vuex进行初始化。 import Vuex from vuex impor…