目標地址:
aHR0cHM6Ly93d3cuNTk5LmNvbS9saXZlLw==
接口:
打開控制臺 點websocket 刷新頁面 顯示
分析:
不寫理論了
關于websocket 幾乎發包位置都是下方圖片 不管抖音還是快手 等平臺
這里在進行 new WebSocket 后 是要必須走一步的 也就是 new WebSocket('').onopen() 也就是onopen 進行向服務端發送一條信息建立連接
當信息發送后 就正常建立連接 收到數據包 只是這里收到的是 ? 二進制加密數據
要分析WebSocket 建立連接后主動執行什么 就要看 onmessage 這個回調 具體怎么操作的
斷到 onmessage 后 可以看到 data就是 服務端向客戶端傳輸的二進制數據
通過單步調試或者關鍵字搜索可以找到位置
進行單步調試 走到這里后 就已經有返回值了 h.decrypt 就是解密方法
之后往 h.decrypt 里面進 就可以找到解密關鍵
具體WebSocket的理論細節 包括環境怎么補 請參考 官方文檔或者其他論壇
https://developer.mozilla.org/zh-CN/docs/Web/API/WebSocket
接下來你通過python把WebSocket代碼寫完 響應解密也寫完后 進行建立連接你會發現一直403 反復查詢 自己構建的問題 也沒研究明白
其實是因為 WebSocket 進行建立連接的時候 可能需要到了 Cookie 請求頭是不顯示
當你在傳輸的時候帶上Cookie 中的 ads-tracker-baidu 的值 就成功建立連接了
關于 ads-tracker-baidu 值的生成 來源于 wasm 有興趣自己研究吧各位
下方為參考代碼
import base64
import asyncio
import time
import websockets
import json
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
from base64 import b64decodedef AES_(txt):# 假設 c.result 是一個 Base64 編碼的字符串key = "777db0c19edfaace".encode('utf-8') # 16 字節的 keyiv = "9876543210599311".encode('utf-8') # 16 字節的 ivcipher = AES.new(key, AES.MODE_CBC, iv)decrypted = cipher.decrypt(base64.b64decode(txt))# 去除 PKCS7 填充plaintext = unpad(decrypted, AES.block_size).decode('utf-8')return plaintextURI = ''async def listen_forever():async with websockets.connect(URI,additional_headers={"Origin": "https://www.599.com","Cache-Control": "no-cache","Accept-Language": "zh-CN,zh;q=0.9,or;q=0.8,en;q=0.7","Pragma": "no-cache",'Cookie': 'ads-tracker-baidu=xxxxxxxxxxxx','sec-websocket-extensions': 'permessage-deflate; client_max_window_bits',"User-Agent": "",}) as ws:print("WebSocket 已連接,開始持續接收數據……")await asyncio.sleep(1) # 等待服務器握手完成await ws.send('{"device":"pc","topic":"USER.topic.app.8"}')while True:try:await asyncio.sleep(1)data = await ws.recv()print("收到消息:", data)print("解密的消息:", AES_(data.decode()))print("<------->")except websockets.ConnectionClosed:print("連接已斷開,嘗試 5 秒后重連")await asyncio.sleep(5)await listen_forever() # 遞歸重連asyncio.run(listen_forever())