某Websocket反爬逆向分析+请求加解密+还原html
网址
aHR0cHM6Ly93d3cueWR4Zi5nb3YuY24vTmV3cy9zaG93TGlzdC80L3BhZ2VfMS5odG1s
前言
工作中遇到的某websocket反爬,比混淆网站还恶心,看到也有其他人在问这个
之前看到其他大佬也弄过这个websocket反爬,但是只是说了下加解密,个人觉得最重要的还是还原最终的html,所以来分享一下过程

目标
- 过无限debugger
session请求加解密websocket通信- 消息结构解析还原成
html - 使用Python还原算法
分析过程
无限debugger
- 首先打开F12,刷新页面发现会被断住
- 右键js文件替换内容
- 看堆栈往上先随便点几个看看

- 可以直接找到通过正则检测代码格式化的检测点,这里是个自执行函数,我们需要把整个函数干掉,然后保存刷新页面
- 发现还是会被断住,老套路直接看堆栈往上找检测点

- 可以清楚看到定时器在不断检测,直接干掉就行了
- 刷新页面,到此为止无限debugger就过了,这个站的检测还是很简单的对吧
session请求加解密
- XHR

- Payload

- Response

Payload加密
直接看xhr的堆栈

这个比较简单我就不废话了,看截图就行
跟进去函数后可以看到用到了iv,iv生成就在上面一个函数

往下继续跟,进入这个解密函数,这个解密函数计算iv的时候也用到这个函数

直接跟到下图这个位置可以看到是个AES加密,差不多就结束了,这个是个标准AES-128-CBC,直接引库就行了

Response解密
跟加密算法一致,用同一个key解密就行,这里就不再写具体流程了
Python实现
- AES-128-CBC
代码抄了晨哥的

- 构造请求&加解密

- 运行结果

Websocket
wss链接分析
wss://www.xxxx.cn/1ywuKELSO2ahQuWZ/pr/rSakD15JVxHzfnpXyZpkf4J5HNjv_CSciPJFAMMxKE0%3D/c/ws/zpgffq9z89/a0c20283-d62c-411a-820b-33e42f1c6082
1ywuKELSO2ahQuWZ:固定值rSakD15JVxHzfnpXyZpkf4J5HNjv_CSciPJFAMMxKE0%3D:session返回的token值zpgffq9z89:网站tab_id,与请求时保持一致,随机字符串(可固定)a0c20283-d62c-411a-820b-33e42f1c6082:uuid,可固定
Python连接Websocket
- 第三方库:
websocket-client、msgpack - 代码

- 结果
这里返回的结果通过msgpack进行解包了,这里就不再赘述了,有兴趣的可以看我晨哥的分析文章讲到了这个https://mp.weixin.qq.com/s/o5UCJFhBg-4JFdS0aEwDuw

消息结构解析
重点来了,这个网站最难的不是session的加解密和websocket连接,而是websocket收发的消息,页面的内容均是通过websocket返回的特殊指令渲染出来的,因此我们从websocket中取想要的数据可能会比较复杂,并且不能通用,我们这里会讲到如何将收到的指令还原成原本的html,从而通过pyquery或者bs4等html解析库来提取数据

定位websocket接收消息函数
找到ws连接请求,进入第一个调用堆栈


在连接下面找到消息回调函数,直接下断点后跟进去

这样我们就找到了ws消息回调函数了
分析接收到的数据
单步跟着走一遍
可以直接把指令表拿出来,这样比较清晰,也可以根据对应名称来猜指令的作用
CommandCodes = {
"TAB_OPS": 0,
"DOM_EVENT": 4,
"DOM_METHOD": 5,
"RESET_DOM": 6,
"ADD_DOC_TYPE": 7,
"ADD_HTML_ELEMENT": 8,
"ADD_SVG_ELEMENT": 9,
"ADD_NS_ELEMENT": 10,
"MOVE_ELEMENT": 11,
"SHUFFLE_CHILDREN": 12,
"EDIT_ELEMENT": 13,
"DELETE_ELEMENT": 14,
"ADD_STYLE": 15,
"ADD_TEXT": 16,
"MODIFY_TEXT": 17,
"MODIFY_PROPERTY": 18,
"MODIFY_ATTRIBUTES": 19,
"SET_SELECTIONS": 20,
"INSERT_RULE": 21,
"DELETE_RULE": 22,
"DISABLED_STYLE": 24,
"SET_CANVAS_DATA": 23,
"REPLACE_SYNC": 25,
"WEBRTC": 30,
"NAVIGATE": 31,
"SYNC": 32,
"SYNC_COOKIE": 34,
"FILE": 35,
"TAB_ACTIVE": 42,
"NATIVE_METHOD": 44,
"MODIFY_DOC_TYPE": 47,
"CHANGE_BLOCK": 48,
"RELOAD": 49,
"SYNC_ALL_COOKIE": 50,
"SYNC_WRITE_COOKIE": 51,
"MEDIA_STATE": 52,
"DOM_READY": 53,
"AUGMENT_CSS": 54,
"MULTI_CMD": 55,
"REDIRECT_REQUEST": 56,
"TEXTAREA_RESIZE": 57,
"SIMPLE_HTML": 58,
"RENDER_STATE": 59,
"SYNC_CONFIG_TO_CLIENT_WIC": 60,
"SYNC_CONFIG_TO_CLIENT_AIC": 61,
"SYNC_CONFIG_TO_CLIENT_EIC": 62,
"FRAME_PUSH_STATE": 63
}

断到一个53指令码,根据码表来看应该是dom相关的指令,继续单步跟

这里将数据传送到其他回调函数了,继续跟进去

大概跟了几个函数就跟到这里了,这里比较重要,我们慢慢看


这个应该是将数组形式的消息转换为对象形式,这个消息太短了,看不出效果,我们多接收几个消息看一下


这个55指令码对应的指令名是"MULTI_CMD": 55 ,应该是多条指令的集合,我们还需要对content的多条指令进行转换,才能拿到最终的对象
单步跟了一下后发现会进入到另外一个接收函数


这里就是根据不同指令码来执行不同操作的地方了

可以看到这个55指令码实际上会进行递归执行指令
后面会根据不同指令码来走不同的分支,我这里就直接给结果吧,"ADD_DOC_TYPE": 7
这个指令操作会给在html中添加一个dom元素,它这里实际上是将这个指令都放到一个指令队列里面,然后再根据指令队列循环操作dom树来渲染页面元素

将websocket消息转换为对象
单步跟进之前那个转换指令的函数


这里会根据e的指令码映射拿到对应的指令处理器,再执行转换命令



不同的指令对应不同的转换器,所以这里如果要还原得一个一个抠下来才行
使用Python还原指令解析算法
基本上只要对照js来还原就行了
- 指令转换器

- 消息解析

- 运行结果

使用Pyquery还原HTML
我们需要将上一步转换后的指令队列转换为HTML代码
- 转换代码

- 运行结果


- 列表页

- 详情页

有了html代码后就可以用xpath大法来拿内容了
微信公众号
公众号更新比较快,欢迎关注!

完整源代码
欢迎各位大佬一起完善,有问题可以一起讨论,希望有更好的方案能带俺一手
https://github.com/Meteo-Pig/CommandSpider
码字不易,动起你的发财的小手点个赞吧~~
某Websocket反爬逆向分析+请求加解密+还原html的更多相关文章
- Spring对JSON请求加解密
Spring中处理JSON请求通常使用@RequestBody和@ResponseBody注解,针对JSON请求加解密和过滤字符串,Spring提供了RequestBodyAdvice和Respons ...
- 通过JS逆向ProtoBuf 反反爬思路分享
前言 本文意在记录,在爬虫过程中,我首次遇到Protobuf时的一系列问题和解决问题的思路. 文章编写遵循当时工作的思路,优点:非常详细,缺点:文字冗长,描述不准确 protobuf用在前后端传输,在 ...
- 我去!爬虫遇到JS逆向AES加密反爬,哭了
今天准备爬取网页时,遇到『JS逆向AES加密』反爬.比如这样的: 在发送请求获取数据时,需要用到参数params和encSecKey,但是这两个参数经过JS逆向AES加密而来. 既然遇到了这个情况,那 ...
- 关于使用scrapy框架编写爬虫以及Ajax动态加载问题、反爬问题解决方案
Python爬虫总结 总的来说,Python爬虫所做的事情分为两个部分,1:将网页的内容全部抓取下来,2:对抓取到的内容和进行解析,得到我们需要的信息. 目前公认比较好用的爬虫框架为Scrapy,而且 ...
- scrapy请求传参-BOSS反爬
scrapy请求传参-BOSS反爬 思路总结 首先boss加了反爬 是cookies的 爬取的内容为职位和职位描述 # -*- coding: utf-8 -*- import scrapy from ...
- Android应用安全防护和逆向分析 ——apk反编译
概述 最近一直在学习Android应用安全相关和逆向分析的知识.现在移动app在安全方面是越来越重视了,特别是那些巨头企业涉及到钱的应用,那加密程度,简直是丧心病狂,密密麻麻.从这里可以看出,对于应用 ...
- scrapy——4 —反爬措施—logging—重要参数—POST请求发送实战
scrapy——4 常用的反爬虫策略有哪些 怎样使用logging设置 Resquest/Response重要参数有哪些 Scrapy怎么发送POST请求 动态的设置User-Agent(随即切换Us ...
- Scrapy中的反反爬、logging设置、Request参数及POST请求
常用的反反爬策略 通常防止爬虫被反主要有以下几策略: 动态设置User-Agent(随机切换User-Agent,模拟不同用户的浏览器信息.) 禁用cookies(也就是不启用cookies midd ...
- Python反爬:利用js逆向和woff文件爬取猫眼电影评分信息
首先:看看运行结果效果如何! 1. 实现思路 小编基本实现思路如下: 利用js逆向模拟请求得到电影评分的页面(就是猫眼电影的评分信息并不是我们上述看到的那个页面上,应该它的实现是在一个页面上插入另外一 ...
- python高级—— 从趟过的坑中聊聊爬虫、反爬以及、反反爬,附送一套高级爬虫试题
前言: 时隔数月,我终于又更新博客了,然而,在这期间的粉丝数也就跟着我停更博客而涨停了,唉 是的,我改了博客名,不知道为什么要改,就感觉现在这个名字看起来要洋气一点. 那么最近到底咋不更新博客了呢?说 ...
随机推荐
- 高性能的Reactor和Proactor模式学习
0.引言 在上一篇的笔记中,我们学习了操作系统提供的高效I/O管理技术,主要用于解决服务器在高并发场景下的资源浪费和瓶颈问题.但是在实际的代码编写中,要是我们都全部调用底层的I/O多路复用接口来编写网 ...
- 鸿蒙开发Hvigor任务简介
编译构建工具DevEco Hvigor(以下简称Hvigor)是一款基于TS实现的构建任务编排工具,主要提供任务管理机制,包括任务注册编排.工程模型管理.配置管理等关键能力,提供专用于构建和测试应用的 ...
- Ocelot集成Consul实现api网关与服务发现
前言 没看dotnet微服务之API网关Ocelot的请先看,这篇文章接上面文章 安装consul #自定义网络,自定义网络可以指定容器IP,这样服务器重启consul集群也可以正常运行. docke ...
- (Python基础教程之六)Python中的关键字
Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...
- SpringAI:Java 开发的智能新利器
一.SpringAI 简介 随着人工智能技术的飞速发展,越来越多的开发者开始探索如何将 AI 能力集成到现有的应用中来提升产品的智能化水平.Spring AI 正是为 Java 开发者提供的一款强大的 ...
- TOML 1.0格式语法
github: https://github.com/BurntSushi/toml TOML 旨在成为一个语义显著而易于阅读的最低限度的配置文件格式.TOML 被设计地能够无歧义地转化为哈希表.TO ...
- SMOS-II 电梯综合监控系统程序(电梯IC卡解决方案)安装的注意点
命令提示符下输入命令dir "D:\SMOS-II-CH V3.2" /b /s 回车可返回SMOS II 3.2对应的各文件路径 D:\SMOS-II-CH V3.2\Setup ...
- 如何使用blender生成城市群
在我们做数字孪生相关的项目的时候,会需要生成一些城市的模型,这时候我们可以使用 blender 来生成一些城市的模型. 我们,先来看一下效果. 安装 blender blender 是一个开源的 3D ...
- 六步取消win11开机PIN密码登录
0.前言 新买的电脑打开后首先要进行一系列的操作激活操作系统.在这些操作中最令人讨厌的是设置开机密码(pin). 也许有很多人的电脑需要保密,限制别人登录,这时使用登录pin是很有必要的.而还有很多人 ...
- 《Django 5 By Example》阅读笔记:p521-p542
<Django 5 By Example>学习第 18 天,p521-p542 总结,总计 22 页. 一.技术总结 1.django-parler django-parler 用于 mo ...