当前位置: 首页 > news >正文

【Python模拟websocket登陆-拆包封包】

Python模拟websocket登陆-拆包封包

  • 解析一个网站
  • 获取wss原始数据
  • 拆包wss数据
  • 封包wss数据
  • 发送接收websocket的常驻后台脚本
  • 总结

解析一个网站

这里所用的网站是我一个内测的网站,主要手段是chrome devtools,用得很多,但我玩的不深,这次上了点干货.

  • 首先在网络那一块,找到js或者index.html,右键点击,选择替换内容,在需要分析的地方写上自己的代码。
  • 对于ajax加载的js模块,把js在加载地址,换成离线下载到本地的地址,存入本地的服务,原来是http的,还还用http。原来https的必须也在https,本地web开启跨域允许。然后ajax加载部分js也就替换成可定制的了。
  • 虽然代码很难读,但是在适合的地方,可以随便写cosole.log.
  • 对于js的调试和中断不太懂,还没用,
  • 界面的记录器标签,可以记录一组点击,然后能看到json代码,用于回放。
  • 记录的动作可以用js实现插入在任何位置,只要调试通过就行。

获取wss原始数据

获取数据的两种方式,各种优缺点:

  • 在上一章中,可以看到websocket建立和sendBytes,onMessage之类的函数,在这里启动cosole.log就能得到逐条纪录。不论ws还是wss。这里可以看到语义,并可定制测试代码。
  • 在devtools网络标签下的wss://server:port/url地址,对应的respone可以取得全部的来往数据,和代码块所收发的字节按道理是完全一致的,可以做为一个验证和参考。

拆包wss数据

所谓的拆包是理解数据的意义,我还没有修炼到靠数据读含义的深度,只能靠代码,也就js,顺眼化处理的代码,比如以下的登陆数据代码,从1万行里拽出来的。

  • 消息头4表字节
    u.prototype.addHeader = function(e, t, n, a) {return void 0 === n && (n = 0),void 0 === a && (a = 0),e | t << 4 | n << 12 | a << 23

4个参数在长度 e->4bit, t ->,8bit,n->11bit a->9bit.
含义e=command ,t=action, n=length,a=ext

  • 登陆消息的主体
           var a = new z.SyncLogonDto;a.account = e.account,a.sn = e.sn,a.token = e.token,a.uid = e.userID,a.localHost = 0,4 == a.sn.length && 0 < a.uid && "" != a.token ? this.sendMsg(a.getBody(), z.ServiceType.HALL_CMD, z.ServiceType.HALL_LOGIN_ACT, 2 =            o.prototype.getBody = function() {var e = new t.BGByteArray;return e.writeUnsignedInt(this.major),e.writeUnsignedInt(this.minor),e.writeUTFBytes(this.sn),e.writeUnsignedInt(this.localHost),e.writeLongUint(this.uid),var a = new z.SyncLogonDto;a.account = e.account,a.sn = e.sn,a.token = e.token,a.uid = e.userID,a.localHost = 0,4 == a.sn.length && 0 < a.uid && "" != a.token ? this.sendMsg(a.getBody(), z.ServiceType.HALL_CMD, z.ServiceType.HALL_LOGIN_ACT, 2 =            o.prototype.getBody = function() {var e = new t.BGByteArray;return e.writeUnsignedInt(this.major),e.writeUnsignedInt(this.minor),e.writeUTFBytes(this.sn),e.writeUnsignedInt(this.localHost),e.writeLongUint(this.uid),e.writeFixedLenthString(this.account, 32),e.writeFixedLenthString(this.token, 32),e},a = o,t.SyncLogonDto = ae.writeFixedLenthString(this.token, 32),e},a = o,t.SyncLogonDto = a

主要的处理逻辑在·o.prototype.getBody = function()
这里的writeUnsigedInt是四字节无符号整数,而且是小头的。就是低位在前,高位在后,相同还有,
writeFixedLenthString(this.account, 32),补充位,也是先写入数据,后填充‘\x00’,在python的bytes使用bytes.ljust(),后面有详细介绍。

这是消息的主体

封包wss数据

根据上面在js可以生成一些python代码用于数据组织

def addHeader(bodyl,command,action=0,ext=0):# Data---\x3e command:" + t + " action:" + n + "   size: 4+len(e),ext:anum=   command | action << 4 | bodyl << 12 | ext << 23#num.to_bytes(length=32,byteorder='little')return num.to_bytes(length=4,byteorder='little')def parseHeader(hex4='11c08500'):#   little_byte = b'\x01\x00\x00\x00\x00\x00\x00\x00'hex4=int.from_bytes(bytes.fromhex(hex4),byteorder='little')command=hex4 &int('F',16)action=hex4>>4 & int('FF',16)l=hex4>>12 &  int('7FF',16)  #only 11bitext=hex4>>23 print (f'command:{command},action:{action},len:{l},ext:{ext}')def loginbytes(sn,lh,uid,account,token):re=bytes()re+=int(b'01',16).to_bytes(4,byteorder='little')re+=int(b'01',16).to_bytes(4,byteorder='little')re+=sn.encode()re+=int(lh).to_bytes(4,byteorder='little')re+=int(uid).to_bytes(8,byteorder='little')re+=account.encode().ljust(32,b'\x00')re+=token.encode().ljust(32,b'\x00')# print(len(re))# print (re.hex())return re

解释
addHeader使用按位或,在返回时byteorder='little')这是比较原始数据得出的。
parseHeader用按位与,移位来排除前,与来排除后,只留对照有用的。
这两个函数处理4字节32位的头部信息。
loginbytes 是改写的js中的SyncLogonDto getBody其中account.encode().ljust(32,b'\x00')是对account补足32,int(uid).to_bytes(8,byteorder='little')是将uid转为长整数8字节长,低位在前高位在后的bytes。

发送接收websocket的常驻后台脚本

本段代码,pip install websocket-client, 版本号1.18,websocket协议13

import websocket
import threading
import time
import os
import login
#os.path+=['../']
# 定义当接收到消息时调用的回调函数
def on_message(ws, message):print(f"Received message: {message}")# 定义当连接关闭时调用的回调函数
def on_close(ws, close_status_code, close_msg):print(f"### Closed ###")# 定义当出现错误时调用的回调函数
def on_error(ws, error):print(f"### Error ### {error}")if __name__ == "__main__":# websocket服务地址ws_service_address = "ws://your_websocket_server"ws_service_address = "wss://alidr-311.klwgt.com/data"# 创建websocket应用实例websocket.enableTrace(True)ws = websocket.WebSocketApp(ws_service_address,on_message=on_message,on_close=on_close,on_error=on_error)# 创建一个线程用于运行websocket客户端wst = threading.Thread(target=ws.run_forever)wst.daemon = Truewst.start()time.sleep(3)mss=login.getlogin()ws.send_bytes(mss)# 主线程做其他事情...# 例如,主线程可以发送消息到websocket服务器# ws.send("Your message here")# 主线程在此处等待,否则程序会立即退出# 如果你的程序需要在后台运行,则不需要这一行wst.join()

其实主要就是来自百度AI的一段代码。稍加调整假入了延时的登陆调用。然后就成功登陆了。实现和浏览器js登陆websocket的一样的效果。

总结

虽然这段代码,没有什么业务功能,细节也是基本的类型转换,但是它是从怀疑中不断产生的。因为我开始时怀疑python在websocket库是否能完全仿真js在websocket。在查看js的建立连接的请求头时,发现协议版本是2011年的13,然后查看了websocket-client在pypi,也是支持到这个版本,只是还没有实现gzip功能的扩展。
既然如此,wss的 建立也没要求cookie和其实token。那就用python跑一下。基于开始处对于网站数据的整理,要是没有原本的js脚本,这也是一个不可能完成的事情了。但是虽然登陆成了,以后的业务逻辑还不知道怎么处理。最少,分步骤,实现批处理,是可以的。这就由python建立 了 一个,js代码的客户端。
好吧纯属有病。
再见

相关文章:

【Python模拟websocket登陆-拆包封包】

Python模拟websocket登陆-拆包封包 解析一个网站获取wss原始数据拆包wss数据封包wss数据发送接收websocket的常驻后台脚本总结 解析一个网站 这里所用的网站是我一个内测的网站&#xff0c;主要手段是chrome devtools&#xff0c;用得很多&#xff0c;但我玩的不深&#xff0c…...

速盾:海外服务器使用CDN加速有什么好处?

随着互联网的快速发展和全球化的需求增加&#xff0c;海外服务器的使用已经成为许多公司和个人的首选。与此同时&#xff0c;为了提供更好的用户体验和更快的网页加载速度&#xff0c;使用CDN&#xff08;内容分发网络&#xff09;加速海外服务器已经成为一个普遍的选择。CDN可…...

windows系统中实现对于appium的依赖搭建

Node.js&#xff1a;Appium是基于Node.js的&#xff0c;因此需要安装Node.js。可以从Node.js官网下载并安装。 Java Development Kit (JDK)&#xff1a;用于Android应用的自动化测试&#xff0c;需要安装JDK。可以从Oracle官网下载并安装。 Android SDK&#xff1a;进行Andro…...

使用MATLAB进行字符串处理

MATLAB是一个强大的数学和计算机科学的软件工具包。它拥有一个灵活的字符串处理工具&#xff0c;可以用于处理和转换不同格式的字符串&#xff0c;例如&#xff0c;数值、日期、时间等。本文将探讨如何使用MATLAB进行字符串处理&#xff0c;以及如何利用它来解决实际问题。 在…...

Sourcetree登录GitLab账号

1. 在GitLab上创建个人访问令牌 在gitlab中点击右上角的头像图标&#xff0c;选择设置进入 Access Tokens&#xff08;访问令牌&#xff09; 页面填写令牌名称和到期时间&#xff0c;指定Scopes&#xff08;范围&#xff09;。一般选择read_repository和api点击 Create person…...

Linux进阶:软件安装、网络操作、端口、进程等

软件安装 yum 和 apt 均需要root权限 CentOS系统使用&#xff1a; yum [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&#xff0c;自动确认 Ubuntu系统使用 apt [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&…...

光猫、路由器、交换机之连接使用(Connection and Usage of Optical Cats, Routers, and Switches)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…...

2025蓝桥杯(单片机)备赛--扩展外设之超声波测距原理与应用(十一)

1 超声波测距原理 接收器接到超声波的时间差。超声波发射器想某一方向发射波&#xff0c;再发射时刻开始计时 超声波在空气中传播&#xff0c;遇到障碍物则返回&#xff0c;超声波接收器收到反射波&#xff0c;立即停止计时。 SOR4原理&#xff1a; 通过IO口&#xff08;TRIG…...

分布式数据库中间件可以用在哪些场景呢

在数字化转型的浪潮中&#xff0c;企业面临着海量数据的存储、管理和分析挑战。华为云分布式数据库中间件&#xff08;DDM&#xff09;作为一款高效的数据管理解决方案&#xff0c;致力于帮助企业在多个场景中实现数据的高效管理和应用&#xff0c;提升业务效率和用户体验。九河…...

MyBatis-Plus分页插件IPage用法

首先就是service接口需要继承IService<entity> 然后就是业务类实现类中需要继承ServiceImpl<Mapper,entity> Mapper正常写法&#xff0c;继承baseMapepr<entity> IPage的使用方式 QueryWrapper<MdSaleDayPhone> queryWrappernew QueryWrapper<>…...

使用MATLAB进行遗传算法设计

遗传算法是一种基于自然进化的计算方法&#xff0c;在解决各种优化问题方面具有广泛的应用。MATLAB作为一种强大的数学软件&#xff0c;可以方便快捷地实现遗传算法&#xff0c;并且通过可视化的方式直观地展现算法运行过程和结果。本文将介绍使用MATLAB进行遗传算法设计的步骤…...

mindtorch study

安装 pip install mindtorch mindtorch 用于帮助迁移torch模型到mindspore 大部分都可以直接把mindtorch的torch搞成torch&#xff0c;就和以前的代码一致&#xff0c;注意下面 只有静态图有点点差异 step也有差异 自定义优化器就麻烦了。 pyttorch还是牛啊 并行计算还是用的…...

java八股-SpringCloud微服务-Eureka理论

文章目录 SpringCloud架构Eureka流程Nacos和Eureka的区别是&#xff1f;CAP定理Ribbon负载均衡策略自定义负载均衡策略如何实现&#xff1f;本章小结 SpringCloud架构 Eureka流程 服务提供者向Eureka注册服务信息服务消费者向注册中心拉取服务信息服务消费者使用负载均衡算法挑…...

2024信创数据库TOP30之蚂蚁集团OceanBase

数据库作为存储、管理和分析这些数据的关键工具&#xff0c;其地位自然不言而喻。随着信息技术的日新月异&#xff0c;数据库技术也在不断演进&#xff0c;以满足日益复杂多变的市场需求。近日&#xff0c;备受瞩目的“2024信创数据库TOP30”榜单由DBC联合CIW/CIS权威发布&…...

查找redis数据库的路径

Redis 数据库的路径通常由配置文件中的 dir 参数指定 查找 Redis 配置文件&#xff1a; Redis 配置文件通常命名为 redis.conf。您可以在以下位置查找它&#xff1a; /etc/redis/redis.conf&#xff08;Linux 系统上的常见位置&#xff09;/usr/local/etc/redis/redis.conf&…...

DrugLLM——利用大规模语言模型通过 Few-Shot 生成生物制药小分子

摘要 小分子由于能够与特定的生物靶点结合并调节其功能&#xff0c;因此在药物发现领域发挥着至关重要的作用。根据美国食品和药物管理局&#xff08;FDA&#xff09;过去十年的审批记录&#xff0c;小分子药物占所有获批上市药物的 76%。小分子药物的特点是合成相对容易&…...

【蓝桥杯C/C++】翻转游戏:多种实现与解法解析

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: 蓝桥杯C/C 文章目录 &#x1f4af;题目&#x1f4af;问题分析解法一&#xff1a;减法法解法二&#xff1a;位运算解法解法三&#xff1a;逻辑非解法解法四&#xff1a;条件运算符解法解法五&#xff1a;数组映射法不同解法的比较…...

【AI系统】核心计算之矩阵乘

核心计算之矩阵乘 AI 模型中往往包含大量的矩阵乘运算&#xff0c;该算子的计算过程表现为较高的内存搬移和计算密度需求&#xff0c;所以矩阵乘的效率是 AI 芯片设计时性能评估的主要参考依据。本文我们一起来看一下矩阵乘运算在 AI 芯片的具体过程&#xff0c;了解它的执行性…...

Vue.js 自定义指令:从零开始创建自己的指令

vue使用directive 前言vue2使用vue3使用 前言 关于使用自定义指令在官网中是这样描述的 vue2:对普通 DOM 元素进行底层操作&#xff0c;这时候就会用到自定义指令。 vue3:自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。 在 Vue.js 中使用自定义指令&#xf…...

策略模式

定义&#xff1a;即定义一系列的算法&#xff0c;算法1&#xff0c;算法2&#xff0c;...&#xff0c;算法n&#xff0c;把他们封装起来&#xff0c;使他们可以相互替换。 优点&#xff1a;使得一个类的行为或者其算法可以在运行时改变&#xff0c;而且使用Context类的人在外部…...

论文写到头秃?书匠策AI这套“毕业论文急救包“我劝你现在就存好!

同学们&#xff0c;我做论文写作科普这么久&#xff0c;后台私信最多的一句话就是&#xff1a;"老师&#xff0c;我论文一个字都没动&#xff0c;还有救吗&#xff1f;" 有。今天就给你们安利一个我最近实测了一圈、觉得确实有点东西的工具——书匠策AI&#xff08;…...

Windows Defender移除终极指南:如何彻底禁用微软安全组件提升系统性能30%

Windows Defender移除终极指南&#xff1a;如何彻底禁用微软安全组件提升系统性能30% 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.…...

B-Parameter小模型:精度、速度与成本的帕累托最优

1. 小模型正在悄悄改写游戏规则&#xff1a;为什么10B参数的模型能干翻100B巨兽&#xff1f;最近在几个技术团队做模型选型咨询&#xff0c;几乎每场讨论都会有人抛出这个问题&#xff1a;“我们业务场景明明很垂直&#xff0c;推理延迟要求严苛&#xff0c;GPU显存还卡在24G&a…...

vue3+vite+springboot路径配置:维护统一的baseUrl

提交表单&#xff1a;try…catch 捕获异常&#xff0c;如果校验失败&#xff0c;前台页面会有错误提示。 const submitForm async () > {try {await formRef.value.validate(); // 校验失败会抛出异常const submitData { ...formData };submitData.allowedSubmitTypes su…...

RK3562核心板深度解析:10路UART与1TOPS NPU在工业边缘计算的应用

1. 项目概述&#xff1a;为什么RK3562核心板值得关注&#xff1f;最近在给一个工业网关项目做硬件选型&#xff0c;市面上各种核心板看得人眼花缭乱。从传统的ARM Cortex-A系列到各种专用SoC&#xff0c;性能和接口的平衡点一直很难找。直到接触到迅为电子这款基于瑞芯微RK3562…...

为什么你的ElevenLabs马来文输出总像“机器人朗读”?资深语音架构师拆解4层韵律建模断层与3个修复级prompt模板

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;为什么你的ElevenLabs马来文输出总像“机器人朗读”&#xff1f;资深语音架构师拆解4层韵律建模断层与3个修复级prompt模板 马来语&#xff08;Bahasa Melayu&#xff09;虽属声调中性语言&#xff0c;…...

CANN-ATB多卡推理-昇腾NPU上Llama70B怎么切到8张卡

CANN-ATB多卡推理-昇腾NPU上Llama70B怎么切到8张卡 Llama2-70B 的权重 140GB&#xff0c;单张 Atlas 800I A2 的 64GB 显存放不下。ATB 的多卡推理用 Tensor Parallel 把模型切到多张 NPU 上&#xff0c;每张卡只存 1/N 的权重和 KV Cache。 Tensor Parallel 的切法 Llama2-70B…...

CNN与量化神经网络在高能物理实时触发系统中的应用

1. WOMBAT架构概述&#xff1a;当CNN遇上高能物理在大型强子对撞机&#xff08;LHC&#xff09;的紧凑型μ子螺线管&#xff08;CMS&#xff09;实验中&#xff0c;每秒产生约4000万次质子碰撞事件。传统触发系统需要处理海量数据流&#xff0c;而WOMBAT架构的创新之处在于将卷…...

ROS Noetic下,5分钟搞定Hector SLAM建图(附避坑指南与完整launch文件)

ROS Noetic下Hector SLAM极速建图实战&#xff1a;从零到地图生成的避坑全指南 刚接触ROS和SLAM的开发者往往被复杂的配置和概念淹没&#xff0c;而Hector SLAM作为最轻量级的激光建图方案&#xff0c;却能在5分钟内让你看到实实在在的建图效果。本文将采用逆向教学法——先带你…...

2025-2026年护眼灯品牌推荐:十大评测专业排行防蓝光伤眼价格特点

摘要 当消费者对家庭光环境的认知从“照亮空间”跃迁至“健康护眼”&#xff0c;如何从纷繁复杂的市场中精准选择一盏真正经得起科学检验的护眼灯&#xff0c;已成为现代家庭决策者的核心焦虑。根据全球知名市场研究机构Grand View Research发布的报告&#xff0c;全球LED照明市…...