JS逆向之某网站爬虫大赛第二题详解
字数 1342 2025-08-15 21:33:28

某网站爬虫大赛第二题详解 - JS逆向与动态Cookie生成

1. 题目概述

题目要求从目标网站(http://match.yuanrenxue.com/match/2)提取全部5页发布日热度的值,计算所有值的加和并提交答案。关键点在于处理动态生成的cookie参数m

2. 分析过程

2.1 Cookie生成机制分析

  1. 首次请求观察

    • 第一次请求不带cookie
    • 第二次请求携带m参数cookie
    • m参数由第一次请求返回的JS代码在本地生成
  2. 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 关键函数说明

  1. X函数 - 生成时间戳:

    function X(Y, Z) {
        return Date["parse"](new Date());
    }
    
  2. W函数 - 设置cookie:

    function W(Y, Z) {
        document["cookie"] = "m" + V(Y) + Y + "; path=/";
        // location["reload"](); // 实际使用时注释掉,避免无限刷新
        return document["cookie"];
    }
    
  3. V函数 - 生成MD5哈希部分:

    function V(Y, Z, a0) {
        M();
        return Z ? a0 ? H(Z, Y) : y(Z, Y) : a0 ? T(Y) : U(Y);
    }
    
  4. 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 关键调整点

  1. 在JS环境中模拟documentnavigator对象:

    var document = {};
    var navigator = {};
    
  2. 修改W函数避免页面刷新:

    function W(Y, Z) {
        document["cookie"] = "m" + V(Y) + Y;
        return document["cookie"];
    }
    
  3. 处理反调试代码:

    • 注释掉a4()调用
    • 移除无限循环和debugger语句

5. 完整解决方案步骤

  1. 获取原始JS代码

    • 使用无cookie访问目标页面
    • 从响应中提取JS加密代码
  2. 反混淆处理

    • 使用专用工具去除混淆
    • 简化代码逻辑
  3. 分析关键函数

    • 识别cookie生成流程
    • 理解MD5计算部分
  4. 环境适配

    • 添加缺失的浏览器对象
    • 移除页面刷新逻辑
  5. Python集成

    • 使用execjs执行处理后的JS代码
    • 构造请求获取数据
    • 计算结果总和

6. 注意事项

  1. 反调试处理

    • 原始代码包含反调试逻辑(console重定义等)
    • 需要移除或绕过这些保护
  2. 请求频率控制

    • 适当添加延迟(time.sleep)
    • 避免触发反爬机制
  3. Cookie有效期

    • 生成的cookie可能有时间限制
    • 每次请求前重新生成
  4. 环境一致性

    • 确保JS执行环境与浏览器一致
    • 处理可能的全局变量依赖

7. 总结

本题的核心在于理解动态cookie的生成机制,通过反混淆和分析JS代码,提取出关键的MD5计算和时间戳组合逻辑。使用Python的execjs模块可以方便地集成这些JS逻辑,实现自动化数据采集。

关键点:

  1. 识别cookie生成流程
  2. 处理混淆的JS代码
  3. 适配非浏览器环境
  4. 集成到Python爬虫中
  5. 处理反爬和反调试措施
某网站爬虫大赛第二题详解 - 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 主要函数结构 3.2 关键函数说明 X函数 - 生成时间戳: W函数 - 设置cookie: V函数 - 生成MD5哈希部分: 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代码 4.2 关键调整点 在JS环境中模拟 document 和 navigator 对象: 修改W函数避免页面刷新: 处理反调试代码: 注释掉 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爬虫中 处理反爬和反调试措施