【JS逆向百例】某赚网 WebSocket 套 Webpack 逆向分析
字数 1592 2025-08-20 18:17:59
WebSocket与Webpack逆向分析实战教程
1. 前言与目标
本教程将详细分析某赚网的WebSocket协议与Webpack打包技术的逆向过程,帮助读者掌握以下技能:
- WebSocket协议的分析方法
- Webpack打包模块的逆向技巧
- 加密参数的定位与还原
- Python实现WebSocket通信
逆向目标:某赚网的WebSocket实时订单数据接口(已脱敏处理)
2. WebSocket协议基础
2.1 WebSocket与HTTP对比
| 特性 | HTTP | WebSocket |
|---|---|---|
| 协议类型 | 无状态请求-响应协议 | 全双工通信协议 |
| 通信方式 | 单向通信 | 双向通信 |
| 连接持久性 | 短连接(可Keep-Alive) | 长连接 |
| 连接建立 | 每次请求新建连接 | 通过HTTP升级建立后保持 |
| 适用场景 | 传统网页请求 | 实时数据推送 |
2.2 WebSocket握手过程
客户端请求头关键字段:
Upgrade: websocket
Sec-WebSocket-Key: [Base64编码的16字节随机字符串]
服务器响应关键字段:
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: [计算后的密钥]
Sec-WebSocket-Accept计算方式:
- 将客户端提供的Sec-WebSocket-Key与固定字符串"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"拼接
- 取SHA-1哈希值
- 进行Base64编码
3. 逆向分析过程
3.1 抓包分析
- 进入订单列表页,发现数据不断刷新
- 识别出两个关键接口:
/GetPendingOrderStatus:HTTP接口,不断下发密文数据(非目标)/api/market:WebSocket接口,实时传输订单数据
3.2 WebSocket流程分析
- 连接初始化:通过
initWebSocket函数建立连接 - 连接建立:
websocketonopen事件触发 - 关键加密点:连接建立时发送
y.a.encryptDes(r()(t))加密数据
3.3 Webpack模块分析
目标网站使用Webpack打包,关键模块为u46b(实际模块名可能有空格等特殊字符)
Webpack分发器分析:
window.webpackJsonp = function(c, b, n) {
// 模块加载逻辑
// ...
}
模块提取技巧:
- 在分发器处断点调试
- 修改分发器代码自动导出所有模块:
window.code = '';
a=function (c) {
if (f[c]) return f[c].exports;
var d = f[c] = { i: c, l: !1, exports: {} };
console.log(c)
window.code += c + ':' + e[c] + ',\r\n'
return e[c].call(d.exports, d, d.exports, a), d.l = !0, d.exports
}
注意事项:
- 模块名可能存在不规范命名(如包含空格)
- 直接引用可能导致语法错误,需要适当处理
3.4 加密参数分析
- 加密函数定位:
y.a.encryptDes - 加密方式:DES加密
- 参数构造:
r()(t)生成待加密数据
4. Python实现WebSocket通信
4.1 基础WebSocket连接
import websocket
# 创建连接
ws = websocket.WebSocket()
ws.connect("wss://example.com")
# 发送数据
ws.send("加密数据")
# 接收数据
while True:
response = ws.recv()
if response:
print(response)
else:
break
4.2 完整实现方案
import execjs
import asyncio
import websockets
from loguru import logger
# 加载JS加密代码
with open('pack.js', 'rb') as f:
js = f.read().decode()
ctx = execjs.compile(js)
def des_decrypt(word):
"""DES解密函数"""
return ctx.call('des_decrypt', word)
def des_encrypt(word):
"""DES加密函数"""
return ctx.call('des_encrypt', word)
async def main():
url = "ws://脱敏处理"
headers = {} # 可添加必要的请求头
async with websockets.connect(url, extra_headers=headers.items()) as websocket:
# 构造并发送加密消息
encrypt_msg = des_encrypt("待加密数据")
await websocket.send(encrypt_msg)
# 持续接收数据
while True:
response = await websocket.recv()
logger.success(f"密文:{response},明文:{des_decrypt(response)}")
asyncio.get_event_loop().run_until_complete(main())
4.3 关键验证点
-
加密验证:错误的send参数会导致:
- 服务器响应间隔变长
- 返回数据内容固定不变
- 无法获取实时订单列表
-
正确响应特征:
- 数据推送频率正常
- 返回的订单数据实时更新
5. 总结与技巧
5.1 WebSocket逆向要点
- 通过Chrome开发者工具的WS标签过滤WebSocket流量
- 关注
initWebSocket和websocketonopen等关键函数 - 分析连接建立时发送的初始数据
5.2 Webpack逆向技巧
-
模块定位:
- 在分发器处断点调试
- 通过控制台输出特定模块内容:
e["u46b "]
-
模块导出:
- 修改分发器自动导出所有模块
- 处理特殊命名的模块
-
加密分析:
- 关注
encryptDes等加密函数调用 - 确保所有依赖模块完整导出
- 关注
5.3 调试技巧
- 使用
console.log输出关键变量 - 通过
window.xxx = yyy将内部函数暴露到全局 - 分步验证加密函数的正确性
通过本教程,读者可以掌握WebSocket协议与Webpack打包技术的逆向分析方法,并能够独立完成类似网站的逆向工程。