【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的常驻后台脚本总结 解析一个网站 这里所用的网站是我一个内测的网站,主要手段是chrome devtools,用得很多,但我玩的不深,…...
速盾:海外服务器使用CDN加速有什么好处?
随着互联网的快速发展和全球化的需求增加,海外服务器的使用已经成为许多公司和个人的首选。与此同时,为了提供更好的用户体验和更快的网页加载速度,使用CDN(内容分发网络)加速海外服务器已经成为一个普遍的选择。CDN可…...
windows系统中实现对于appium的依赖搭建
Node.js:Appium是基于Node.js的,因此需要安装Node.js。可以从Node.js官网下载并安装。 Java Development Kit (JDK):用于Android应用的自动化测试,需要安装JDK。可以从Oracle官网下载并安装。 Android SDK:进行Andro…...
使用MATLAB进行字符串处理
MATLAB是一个强大的数学和计算机科学的软件工具包。它拥有一个灵活的字符串处理工具,可以用于处理和转换不同格式的字符串,例如,数值、日期、时间等。本文将探讨如何使用MATLAB进行字符串处理,以及如何利用它来解决实际问题。 在…...
Sourcetree登录GitLab账号
1. 在GitLab上创建个人访问令牌 在gitlab中点击右上角的头像图标,选择设置进入 Access Tokens(访问令牌) 页面填写令牌名称和到期时间,指定Scopes(范围)。一般选择read_repository和api点击 Create person…...
Linux进阶:软件安装、网络操作、端口、进程等
软件安装 yum 和 apt 均需要root权限 CentOS系统使用: yum [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y,自动确认 Ubuntu系统使用 apt [install remove search] [-y] 软件名称 install 安装remove 卸载search 搜索-y&…...
光猫、路由器、交换机之连接使用(Connection and Usage of Optical Cats, Routers, and Switches)
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 本人主要分享计算机核心技…...
2025蓝桥杯(单片机)备赛--扩展外设之超声波测距原理与应用(十一)
1 超声波测距原理 接收器接到超声波的时间差。超声波发射器想某一方向发射波,再发射时刻开始计时 超声波在空气中传播,遇到障碍物则返回,超声波接收器收到反射波,立即停止计时。 SOR4原理: 通过IO口(TRIG…...
分布式数据库中间件可以用在哪些场景呢
在数字化转型的浪潮中,企业面临着海量数据的存储、管理和分析挑战。华为云分布式数据库中间件(DDM)作为一款高效的数据管理解决方案,致力于帮助企业在多个场景中实现数据的高效管理和应用,提升业务效率和用户体验。九河…...
MyBatis-Plus分页插件IPage用法
首先就是service接口需要继承IService<entity> 然后就是业务类实现类中需要继承ServiceImpl<Mapper,entity> Mapper正常写法,继承baseMapepr<entity> IPage的使用方式 QueryWrapper<MdSaleDayPhone> queryWrappernew QueryWrapper<>…...
使用MATLAB进行遗传算法设计
遗传算法是一种基于自然进化的计算方法,在解决各种优化问题方面具有广泛的应用。MATLAB作为一种强大的数学软件,可以方便快捷地实现遗传算法,并且通过可视化的方式直观地展现算法运行过程和结果。本文将介绍使用MATLAB进行遗传算法设计的步骤…...
mindtorch study
安装 pip install mindtorch mindtorch 用于帮助迁移torch模型到mindspore 大部分都可以直接把mindtorch的torch搞成torch,就和以前的代码一致,注意下面 只有静态图有点点差异 step也有差异 自定义优化器就麻烦了。 pyttorch还是牛啊 并行计算还是用的…...
java八股-SpringCloud微服务-Eureka理论
文章目录 SpringCloud架构Eureka流程Nacos和Eureka的区别是?CAP定理Ribbon负载均衡策略自定义负载均衡策略如何实现?本章小结 SpringCloud架构 Eureka流程 服务提供者向Eureka注册服务信息服务消费者向注册中心拉取服务信息服务消费者使用负载均衡算法挑…...
2024信创数据库TOP30之蚂蚁集团OceanBase
数据库作为存储、管理和分析这些数据的关键工具,其地位自然不言而喻。随着信息技术的日新月异,数据库技术也在不断演进,以满足日益复杂多变的市场需求。近日,备受瞩目的“2024信创数据库TOP30”榜单由DBC联合CIW/CIS权威发布&…...
查找redis数据库的路径
Redis 数据库的路径通常由配置文件中的 dir 参数指定 查找 Redis 配置文件: Redis 配置文件通常命名为 redis.conf。您可以在以下位置查找它: /etc/redis/redis.conf(Linux 系统上的常见位置)/usr/local/etc/redis/redis.conf&…...
DrugLLM——利用大规模语言模型通过 Few-Shot 生成生物制药小分子
摘要 小分子由于能够与特定的生物靶点结合并调节其功能,因此在药物发现领域发挥着至关重要的作用。根据美国食品和药物管理局(FDA)过去十年的审批记录,小分子药物占所有获批上市药物的 76%。小分子药物的特点是合成相对容易&…...
【蓝桥杯C/C++】翻转游戏:多种实现与解法解析
博客主页: [小ᶻZ࿆] 本文专栏: 蓝桥杯C/C 文章目录 💯题目💯问题分析解法一:减法法解法二:位运算解法解法三:逻辑非解法解法四:条件运算符解法解法五:数组映射法不同解法的比较…...
【AI系统】核心计算之矩阵乘
核心计算之矩阵乘 AI 模型中往往包含大量的矩阵乘运算,该算子的计算过程表现为较高的内存搬移和计算密度需求,所以矩阵乘的效率是 AI 芯片设计时性能评估的主要参考依据。本文我们一起来看一下矩阵乘运算在 AI 芯片的具体过程,了解它的执行性…...
Vue.js 自定义指令:从零开始创建自己的指令
vue使用directive 前言vue2使用vue3使用 前言 关于使用自定义指令在官网中是这样描述的 vue2:对普通 DOM 元素进行底层操作,这时候就会用到自定义指令。 vue3:自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。 在 Vue.js 中使用自定义指令…...
策略模式
定义:即定义一系列的算法,算法1,算法2,...,算法n,把他们封装起来,使他们可以相互替换。 优点:使得一个类的行为或者其算法可以在运行时改变,而且使用Context类的人在外部…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析
LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...
