京东电商数据批量采集h5st逆向实战

// 实战案例:京东电商数据逆向实战(h5st生成)

// 网址:https://www.jd.com/

概述

h5st是京东网页端重要的反爬虫参数,主要用于保护核心接口免受机器请求的干扰。该参数通过复杂的JavaScript代码生成,涉及加密、签名等多种前端安全技术。本笔记通过分析京东首页feed流接口的h5st参数生成过程,揭示其实现原理。

网页分析

1760248095729-e07272af-bc8d-4f2f-bc1e-4e24779e4d9a.png

1760248206193-dcaac490-7146-473b-839f-a1fe44c6ab6a.png

1760248304884-56192a89-93e2-44df-b800-6d775c1da34f.png

1760248391836-40bb576a-8651-40d1-97cf-f6696b376d47.png

1760248429592-2786ee51-b558-4ce6-a00f-8aad546576a3.png

1760248500076-c3adf9d6-7bd6-4627-92d1-6b759376c77e.png

1760248560405-fd5800a9-d6e8-4818-b5c3-3d8d4c0f2d16.png

1760248632122-2c847402-ff4d-4da4-ad30-4077e7dc9953.png

1760248707814-efc6bcb0-6db3-470d-b4c8-3a6812cc4a2f.png

技术要点

2.1 反调试技巧

  • 代码混淆:变量名和函数名被替换为无意义的标识符
  • 代码压缩:移除空格和换行,增加阅读难度
  • 控制流平坦化:打乱代码执行顺序

2.2 加密特征

  • 使用标准哈希算法(可能是SHA256)
  • 包含时间戳防止重放攻击
  • 可能使用AES或自定义加密算法

2.3 参数重要性

  • appid: 应用标识
  • body: 请求体哈希值
  • functionId: 接口功能标识
  • t: 时间戳,确保签名时效性

环境补全实现

3.1 基础环境配置

代理监控系统

4.1 代理实现函数

function setProxy(proxyObjArr) {
    for (let i = 0; i < proxyObjArr.length; i++) {
        const handler = `{
            get: function(target, property, receiver) {
                console.log("方法:", "get  ", "对象:", "${proxyObjArr[i]}", 
                          "  属性:", property, "  属性类型:", typeof property, 
                          ", 属性值:", target[property], 
                          ", 属性值类型:", typeof target[property]);
                return target[property];
            },
            set: function(target, property, value, receiver) {
                console.log("方法:", "set  ", "对象:", "${proxyObjArr[i]}", 
                          "  属性:", property, "  属性类型:", typeof property, 
                          ", 属性值:", value, 
                          ", 属性值类型:", typeof target[property]);
                return Reflect.set(...arguments);
            }
        }`;
        
        eval(`try {
            ${proxyObjArr[i]};
            ${proxyObjArr[i]} = new Proxy(${proxyObjArr[i]}, ${handler});
        } catch (e) {
            ${proxyObjArr[i]} = {};
            ${proxyObjArr[i]} = new Proxy(${proxyObjArr[i]}, ${handler});
        }`);
    }
}

4.2 代理对象配置

proxy_array = [
    'window',
    'canvas'
    // 可根据需要添加其他对象
]
setProxy(proxy_array)

代码分析

5.1 参数结构

var e = {
    "appid": "www-jd-com",
    "body": "224029fa85a1a3b9d6e229f4d578057f080a2f6738837120a79a91934252476f",
    "clientVersion": "1.0.0", 
    "client": "pc",
    "functionId": "pc_home_feed",
    "t": 1758275918345
}

5.2 核心调用代码

var ParamsSign = function() {
    // 复杂的实现逻辑
    return someImplementation;
}();

window.ParamsSign = _$QI; // 全局暴露
var x = new window.ParamsSign();
h5st_data = x.sign(e); // 生成签名

逆向思路

6.1 定位关键代码

  1. 全局搜索:在浏览器开发者工具中搜索h5st、h5st: 等关键词
  2. 调用栈分析:通过XHR断点追踪参数生成过程
  3. Hook技术:拦截相关函数调用获取加密逻辑

6.2 定位关键代码

从代码片段可以看出:

  • 使用 window.ParamsSign 获取加密对象
  • 调用 sign() 方法生成 h5st

完整代码

补环境的另一种实现思路

插件安装包(需要安装包的可私)

1755507308603-e06939f2-3c19-477d-828f-1e22311cd077.png

1755507287490-bf7263ac-6fb5-4280-bd6f-053eff0075cf.png

常见问题解决

7.1 环境补全不完整

现象:报错提示某些属性未定义
解决

  1. 检查报错信息中缺失的对象/属性
  2. 在环境初始化部分添加对应的模拟代码
  3. 使用代理监控确认属性访问情况