【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计算方式:

  1. 将客户端提供的Sec-WebSocket-Key与固定字符串"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"拼接
  2. 取SHA-1哈希值
  3. 进行Base64编码

3. 逆向分析过程

3.1 抓包分析

  1. 进入订单列表页,发现数据不断刷新
  2. 识别出两个关键接口:
    • /GetPendingOrderStatus:HTTP接口,不断下发密文数据(非目标)
    • /api/market:WebSocket接口,实时传输订单数据

3.2 WebSocket流程分析

  1. 连接初始化:通过initWebSocket函数建立连接
  2. 连接建立websocketonopen事件触发
  3. 关键加密点:连接建立时发送y.a.encryptDes(r()(t))加密数据

3.3 Webpack模块分析

目标网站使用Webpack打包,关键模块为u46b(实际模块名可能有空格等特殊字符)

Webpack分发器分析

window.webpackJsonp = function(c, b, n) {
    // 模块加载逻辑
    // ...
}

模块提取技巧

  1. 在分发器处断点调试
  2. 修改分发器代码自动导出所有模块:
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 加密参数分析

  1. 加密函数定位:y.a.encryptDes
  2. 加密方式:DES加密
  3. 参数构造: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 关键验证点

  1. 加密验证:错误的send参数会导致:

    • 服务器响应间隔变长
    • 返回数据内容固定不变
    • 无法获取实时订单列表
  2. 正确响应特征

    • 数据推送频率正常
    • 返回的订单数据实时更新

5. 总结与技巧

5.1 WebSocket逆向要点

  1. 通过Chrome开发者工具的WS标签过滤WebSocket流量
  2. 关注initWebSocketwebsocketonopen等关键函数
  3. 分析连接建立时发送的初始数据

5.2 Webpack逆向技巧

  1. 模块定位

    • 在分发器处断点调试
    • 通过控制台输出特定模块内容:e["u46b "]
  2. 模块导出

    • 修改分发器自动导出所有模块
    • 处理特殊命名的模块
  3. 加密分析

    • 关注encryptDes等加密函数调用
    • 确保所有依赖模块完整导出

5.3 调试技巧

  1. 使用console.log输出关键变量
  2. 通过window.xxx = yyy将内部函数暴露到全局
  3. 分步验证加密函数的正确性

通过本教程,读者可以掌握WebSocket协议与Webpack打包技术的逆向分析方法,并能够独立完成类似网站的逆向工程。

WebSocket与Webpack逆向分析实战教程 1. 前言与目标 本教程将详细分析某赚网的WebSocket协议与Webpack打包技术的逆向过程,帮助读者掌握以下技能: WebSocket协议的分析方法 Webpack打包模块的逆向技巧 加密参数的定位与还原 Python实现WebSocket通信 逆向目标 :某赚网的WebSocket实时订单数据接口(已脱敏处理) 2. WebSocket协议基础 2.1 WebSocket与HTTP对比 | 特性 | HTTP | WebSocket | |------|------|-----------| | 协议类型 | 无状态请求-响应协议 | 全双工通信协议 | | 通信方式 | 单向通信 | 双向通信 | | 连接持久性 | 短连接(可Keep-Alive) | 长连接 | | 连接建立 | 每次请求新建连接 | 通过HTTP升级建立后保持 | | 适用场景 | 传统网页请求 | 实时数据推送 | 2.2 WebSocket握手过程 客户端请求头关键字段 : 服务器响应关键字段 : 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分发器分析 : 模块提取技巧 : 在分发器处断点调试 修改分发器代码自动导出所有模块: 注意事项 : 模块名可能存在不规范命名(如包含空格) 直接引用可能导致语法错误,需要适当处理 3.4 加密参数分析 加密函数定位: y.a.encryptDes 加密方式:DES加密 参数构造: r()(t) 生成待加密数据 4. Python实现WebSocket通信 4.1 基础WebSocket连接 4.2 完整实现方案 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打包技术的逆向分析方法,并能够独立完成类似网站的逆向工程。