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

实战案例网址:https://www.jd.com/

概述

h5st 是京东网页端(PC/H5通用基础框架生成的变体,本案例以 PC 为主)保护核心 API 的核心「签名通行证」,主要通过动态混淆 JS、多算法组合(如哈希、签名)、环境指纹绑定等技术,屏蔽无真实浏览器上下文的机器请求。

本实战通过分析京东首页无限滚动 Feed 流接口的 h5st 生成链路,快速定位关键代码与实现思路。


网页分析

首先打开京东首页,按下 F12 切换到开发者工具,找到「网络」面板:

  1. 刷新页面,下滑触发无限滚动
  2. 在过滤栏输入 functionId=pc_home_feed(从多个接口观察,functionId 是固定接口标识)
  3. 找到返回 Feed 内容的接口,查看请求参数

关键请求参数截图: 1760248095729-e07272af-bc8d-4f2f-bc1e-4e24779e4d9a.png 1760248206193-dcaac490-7146-473b-839f-a1fe44c6ab6a.png


核心技术要点

反调试与混淆

  • 变量/函数名混淆:全部替换为 _$ 开头的无意义标识符
  • 控制流平坦化:打乱原本的顺序/分支逻辑,大幅增加阅读难度
  • 代码强压缩:移除所有空格、换行、注释
  • 反动态调试:通过检测 debugger、开发者工具打开状态干扰断点(本次 PC Feed 接口反调试较弱)

关键加密参数(从请求中提取)

参数名作用说明
appid固定应用标识,PC 端核心接口通常为 www-jd-com
body请求体的 SHA256 哈希值(验证数据是否被篡改)
functionId固定接口功能标识,Feed 流为 pc_home_feed
t毫秒级时间戳(防止重放攻击,有效期约 30-60s)
h5st最终生成的签名参数,涵盖环境指纹、算法组合、参数校验的综合结果

环境补全与关键定位

3.1 基础环境快速补全

逆向这类 JS 混淆库时,第一步必须补全浏览器核心全局对象(否则直接运行会报错),但不用完全补全所有属性——后续可以用「代理监控」定位缺失的关键属性:

// 快速补全基础全局对象框架
globalThis.navigator = {
  userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
  platform: "Win32",
  // 后续根据代理监控补充其他属性
};
globalThis.window = globalThis; // Node.js 下全局对象对齐
globalThis.document = {
  cookie: "", // 后续可根据需要绑定 Cookie
};
globalThis.location = {
  href: "https://www.jd.com/",
  host: "www.jd.com",
};

3.2 代理监控系统(必用工具!)

代理监控可以帮我们快速定位混淆代码访问了哪些环境对象/属性,避免盲目补全。本次监控最核心的 window 和后续可能用到的 canvas(环境指纹生成常用):

注意!原代码误标记为 Python,实际为 JavaScript

// 通用代理监控函数
function setProxy(proxyObjArr) {
    for (let i = 0; i < proxyObjArr.length; i++) {
        const objName = proxyObjArr[i];
        // 动态生成代理配置
        const handler = {
            get: function(target, property, receiver) {
                console.log(`[GET] 对象: ${objName} | 属性: ${property} | 类型: ${typeof property} | 值: ${target[property]}`);
                return Reflect.get(...arguments);
            },
            set: function(target, property, value, receiver) {
                console.log(`[SET] 对象: ${objName} | 属性: ${property} | 类型: ${typeof property} | 原值: ${target[property]} | 新值: ${value}`);
                return Reflect.set(...arguments);
            }
        };
        
        // 给全局对象套上代理
        try {
            globalThis[objName];
            globalThis[objName] = new Proxy(globalThis[objName], handler);
        } catch (e) {
            globalThis[objName] = {};
            globalThis[objName] = new Proxy(globalThis[objName], handler);
        }
    }
}

// 配置监控对象
const proxyArray = ['window', 'canvas'];
setProxy(proxyArray);

关键代码定位与分析

定位思路

  1. 关键词全局搜索:在开发者工具「Sources」面板搜索 h5stParamsSign(观察到的全局对象关键字)
  2. XHR/fetch 断点:在「网络」面板右键点击接口,选择「在 Fetch/XHR 中断点」,下滑触发断点后查看调用栈
  3. Hook 关键对象:如果全局搜索直接找到暴露的对象,直接 Hook 即可

核心参数与调用

本次实战通过关键词搜索直接找到了全局暴露的 ParamsSign 构造函数

// 提取到的请求参数(body 先拿固定测试值)
const reqParams = {
    "appid": "www-jd-com",
    "body": "224029fa85a1a3b9d6e229f4d578057f080a2f6738837120a79a91934252476f",
    "clientVersion": "1.0.0", 
    "client": "pc",
    "functionId": "pc_home_feed",
    "t": Date.now()
};

// 核心调用流程(浏览器控制台/Node.js 均可)
const signer = new window.ParamsSign();
const h5stResult = signer.sign(reqParams);
console.log("生成的 h5st:", h5stResult);

其他补全思路

如果混淆代码未暴露全局构造函数,或者环境指纹绑定过深,还可以使用浏览器插件一键补全(需要插件可私): 1755507308603-e06939f2-3c19-477d-828f-1e22311cd077.png 1755507287490-bf7263ac-6fb5-4280-bd6f-053eff0075cf.png


常见问题解决

环境补全不完整

现象:Node.js 运行混淆代码时报错 Cannot read properties of undefined (reading 'xxx')
解决步骤

  1. 把报错对象/属性加入 proxyArray 重新运行
  2. 查看控制台打印的 [GET] 记录,找到缺失属性
  3. 在基础环境配置中添加模拟值(通常不需要完全真实的指纹,只要能通过混淆库的「弱校验」即可)

总结

本次实战通过「请求参数观察→基础环境补全→代理监控定位→关键词搜索/Hook 关键对象」的标准流程,快速定位了京东 PC Feed 流接口的 h5st 生成入口。对于更深层的算法还原(如 AES 密钥提取、SHA256 组合规则),需要进一步分析混淆后的 sign() 方法内部逻辑,后续再更新相关内容。