在爬取或分析直播流媒体数据时,绝大多数平台都会通过加签、加密等手段来防止第三方直接获取数据。最近对““看球直播””的接口进行了逆向分析,整个过程比较典型,包含了签名加盐与 AES-CBC 响应加密,今天我把分析过程记录下来,希望对大家有所帮助。
一、目标接口定位与抓包分析
首先,打开浏览器开发者工具(F12),切换到 Network 面板,触发直播请求。很快就能定位到核心数据接口。
在请求参数中,我们发现了几个关键字段:
💡 补充说明:
这里我是通过经验看出来它是做的 MD5 加密。如果是新手同学,可以根据图片所示点击跳转到函数内部仔细研究下对应的加密代码。
三、返回数据 AES 解密流程分析析
拿到加密的响应数据后,下一个任务就是找到解密函数。
在 getRoomPlayUrl 请求成功后,数据进入了 this.decryptPlayData(e) 方法。
进入该解密函数,我们能清晰地看到加密模式:
- 加密库:使用的是
crypto-js 标准库。
- 加密算法:
AES-CBC 模式。
- 填充模式:
Pkcs7。
核心密钥与 IV 生成分析:
代码中定义了一个变量 s0,然后通过以下代码生成了密钥(Key)和偏移量(IV):
const b = e.aes.enc.Latin1.parse(s0.substring(0, 16)); // IV
const t = e.aes.enc.Latin1.parse(s0); // Key
也就是说,密钥就是 s0 本身,而 IV 是 s0 的前 16 个字符。
那么 s0 是从哪来的呢?结合图 4 的观察,这里有一段非常反爬的混淆代码,通过数组 u(包含大量的 ASCII 码)和 a 动态生成了一个字符串。我们需要通过动态断点,把运行时真正计算出来的 s0 值复制出来(扣出 JS 中的 s0 即可),用于后续 Python 代码的解密。
四、 Python 还原请求与解密完整逻辑
基于以上分析,我们可以使用 Python 编写一套完整的模拟请求脚本。
1. 签名生成复现
import hashlib
import time
import requests
def generate_signature(params):
# 1. 参数排序并拼接
sorted_keys = sorted(params.keys())
base_str = "".join([f"{k}{params[k]}" for k in sorted_keys])
# 2. 拼接盐值
salt = "yKBm0pKLdVcGbnu4XGon13TsyBdEsjj3WVAzszpoqjn3BNmovLgzvcRTxD1Wey7QQ10kcov0b8e9oBi7jAUR"
sign_str = base_str + salt
# 3. 计算 MD5
signature = hashlib.md5(sign_str.encode('utf-8')).hexdigest()
return signature
# 构建参数
params = {
"room_id": "88888888",
"code_id": "bqzm",
"time": int(time.time()), # 必须使用动态当前时间戳
"match_id": "4546337",
"sport_id": "1",
"ios_status": 1
}
# 生成签名
params["signature"] = generate_signature(params)
print(f"生成的签名: {params['signature']}")
2. 响应数据 AES 解密复现
假设我们已经从混淆 JS 中扣出了密钥 s0,假设为 "your_extracted_key_here"。
import base64
from Crypto.Cipher import AES
def decrypt_response(encrypted_text, key_string):
# 提取 Key 和 IV
# 注意:crypto-js 的 Latin1.parse 对应 Python 的 latin-1 编码
key = key_string.encode('latin-1')
iv = key[:16] # 取密钥的前16位作为IV
# Base64 解码密文
ciphertext = base64.b64decode(encrypted_text)
# AES-CBC Pkcs7 解密
cipher = AES.new(key, AES.MODE_CBC, iv)
plain_text = cipher.decrypt(ciphertext)
# 去除 Pkcs7 填充
padding_len = plain_text[-1]
return plain_text[:-padding_len].decode('utf-8')
代码运行结果截图
结语
通过上述几步,我们成功逆向了“看球直播”的接口。在整个过程中,加密库的选择(crypto-js)、加盐 MD5 以及 AES CBC 模式解密 都是非常经典的 Web 反爬手段。实际应用中,除了算法还原,还需要注意网站可能会动态更新盐值或更新混淆的 JS 代码,破解后建议定期检查算法的有效性。希望这篇文章能够为想要进行类似 Web 逆向的朋友提供参考思路!
免责声明:本文仅供技术学习与交流,请勿用于商业用途或恶意爬取。大家在实战中也应遵循网站的 robots.txt 协议,文明爬虫。