JS逆向之某网站爬虫大赛第二题详解
字数 1342 2025-08-15 21:33:28
某网站爬虫大赛第二题详解 - JS逆向与动态Cookie生成
1. 题目概述
题目要求从目标网站(http://match.yuanrenxue.com/match/2)提取全部5页发布日热度的值,计算所有值的加和并提交答案。关键点在于处理动态生成的cookie参数m。
2. 分析过程
2.1 Cookie生成机制分析
-
首次请求观察:
- 第一次请求不带cookie
- 第二次请求携带
m参数cookie m参数由第一次请求返回的JS代码在本地生成
-
Cookie特征:
- 格式为
m=7ec678ce832a2daa500e64edffde65e7|1607496651000 - 由两部分组成:MD5哈希值和时间戳
- 格式为
2.2 反混淆处理
原始JS代码经过多重混淆,主要特征包括:
- 变量名混淆
- 字符串混淆
- 控制流混淆
- 使用javascript-obfuscator工具混淆
使用反混淆工具(http://tool.yuanrenxue.com/)处理后,代码量从500+行减少到200行左右,逻辑变得清晰。
3. 核心代码解析
3.1 主要函数结构
function $c(k) {
// 定义了一系列辅助函数(C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X)
// ...
return W(X());
}
3.2 关键函数说明
-
X函数 - 生成时间戳:
function X(Y, Z) { return Date["parse"](new Date()); } -
W函数 - 设置cookie:
function W(Y, Z) { document["cookie"] = "m" + V(Y) + Y + "; path=/"; // location["reload"](); // 实际使用时注释掉,避免无限刷新 return document["cookie"]; } -
V函数 - 生成MD5哈希部分:
function V(Y, Z, a0) { M(); return Z ? a0 ? H(Z, Y) : y(Z, Y) : a0 ? T(Y) : U(Y); } -
MD5相关函数:
N: MD5主处理函数P: 消息填充函数Q: MD5核心计算R: 将结果转为16进制字符串S: 字符串编码处理T: 组合MD5计算流程U: 最终MD5结果生成
3.3 MD5算法实现
代码中实现了完整的MD5算法,包括:
- 消息填充
- 分块处理
- 四轮主循环(F,G,H,I函数)
- 结果组合
4. Python实现方案
4.1 使用execjs执行JS代码
import requests
import execjs
import time
jscode = """
function $c(k) {
var document = {};
var navigator = {};
// ... 完整的JS代码 ...
return W(X());
}
"""
ctx = execjs.compile(jscode)
sum = 0
count = 0
for i in range(1,6):
cookie = ctx.call("$c")
print(cookie)
datas = requests.get(
'http://match.yuanrenxue.com/api/match/2?page={}'.format(i),
headers = {
'User-Agent': 'yuanrenxue.project',
'Cookie': cookie,
"X-Requested-With": "XMLHttpRequest"
}
).json()
for value in datas['data']:
print(value)
sum = sum + value['value']
count = count + 1
time.sleep(1)
print('result', sum)
4.2 关键调整点
-
在JS环境中模拟
document和navigator对象:var document = {}; var navigator = {}; -
修改W函数避免页面刷新:
function W(Y, Z) { document["cookie"] = "m" + V(Y) + Y; return document["cookie"]; } -
处理反调试代码:
- 注释掉
a4()调用 - 移除无限循环和debugger语句
- 注释掉
5. 完整解决方案步骤
-
获取原始JS代码:
- 使用无cookie访问目标页面
- 从响应中提取JS加密代码
-
反混淆处理:
- 使用专用工具去除混淆
- 简化代码逻辑
-
分析关键函数:
- 识别cookie生成流程
- 理解MD5计算部分
-
环境适配:
- 添加缺失的浏览器对象
- 移除页面刷新逻辑
-
Python集成:
- 使用execjs执行处理后的JS代码
- 构造请求获取数据
- 计算结果总和
6. 注意事项
-
反调试处理:
- 原始代码包含反调试逻辑(console重定义等)
- 需要移除或绕过这些保护
-
请求频率控制:
- 适当添加延迟(time.sleep)
- 避免触发反爬机制
-
Cookie有效期:
- 生成的cookie可能有时间限制
- 每次请求前重新生成
-
环境一致性:
- 确保JS执行环境与浏览器一致
- 处理可能的全局变量依赖
7. 总结
本题的核心在于理解动态cookie的生成机制,通过反混淆和分析JS代码,提取出关键的MD5计算和时间戳组合逻辑。使用Python的execjs模块可以方便地集成这些JS逻辑,实现自动化数据采集。
关键点:
- 识别cookie生成流程
- 处理混淆的JS代码
- 适配非浏览器环境
- 集成到Python爬虫中
- 处理反爬和反调试措施