逆向实战:某东h5st参数加密全解析(附完整环境补全代码)

张开发
2026/4/17 2:24:23 15 分钟阅读

分享文章

逆向实战:某东h5st参数加密全解析(附完整环境补全代码)
逆向工程实战某东H5ST参数加密机制深度剖析与环境模拟最近在研究某东移动端H5页面的数据请求时发现其核心接口都使用了一个名为h5st的加密参数。这个参数看似简单实则包含了多层加密逻辑和环境检测机制。今天我们就来彻底拆解这套防护体系从加密算法到环境模拟手把手教你如何完整复现这个加密过程。1. H5ST参数的核心作用与定位技巧在某东的H5页面中几乎所有重要接口都会携带h5st参数。这个参数的主要作用是防止简单的脚本调用和接口滥用它通过对请求参数、时间戳、环境特征等多维度信息进行加密生成一个动态变化的签名值。要定位这个参数的生成位置最直接的方法是在开发者工具中搜索关键词。以商品搜索接口为例// 在Chrome开发者工具的Sources面板按CtrlShiftF // 搜索关键词h5st搜索结果通常会指向几个关键函数调用点。通过设置断点并触发翻页操作我们很快就能锁定核心加密函数window.PSign.sign(colorParamSign)。这个异步函数接收一个包含请求参数的colorParamSign对象返回带有h5st签名的signedParams。关键定位技巧优先在XHR请求的initiator调用栈中寻找可疑函数对常见加密函数名设置断点如sign、encrypt、hash等注意观察参数传递路径特别是异步回调的处理2. 加密参数生成的全链路解析colorParamSign作为加密函数的输入参数其结构值得我们仔细分析。典型的参数对象包含以下字段字段名类型说明bodystring主要请求参数经过JSON序列化tnumber时间戳appidstring应用标识callbackstring回调函数名其中body字段的加密过程最为关键。通过逆向分析我们发现它使用了标准的SHA256算法// SHA256加密示例代码 const crypto require(crypto); function sha256(content) { return crypto.createHash(sha256) .update(content) .digest(hex); } // 实际调用 const encryptedBody sha256(originalBody);验证加密算法是否正确的最快方法是使用在线SHA256工具对相同输入进行计算比对结果是否一致。如果结果匹配说明我们找对了加密方式。3. PSign签名模块的逆向与提取window.PSign.sign是整个加密流程的核心入口。通过搜索window.PSign的赋值位置我们可以快速定位到初始化代码window.PSign new ParamsSign();ParamsSign类的实现通常包含以下几个关键方法sign主入口方法处理参数序列化和加密调度generateSalt生成随机盐值增加签名随机性combineParams合并多个参数为待签名字符串finalEncrypt执行最终的HMAC或AES加密提取完整代码时需要注意保持原型链结构完整处理可能存在的闭包依赖保留所有辅助函数和常量定义4. 浏览器环境模拟的关键补全策略在某东的反爬体系中环境检测是最具挑战性的部分。以下是必须补全的核心环境要素4.1 Node.js特有对象检测// 移除Node特有对象 delete global; delete process; delete Buffer; delete setImmediate;4.2 document.all的特殊处理// 补全document.all及相关检测 window.document { all: [], // 其他必要属性... };4.3 原型链检测绕过// 补全各种DOM接口的原型 HTMLAllCollection function() {}; HTMLCollection function() {}; // 其他必要接口...4.4 关键API模拟// 补全navigator对象 navigator { userAgent: Mozilla/5.0..., webdriver: false, // 其他必要属性... };环境补全后可以通过以下方式验证是否成功// 验证代码 try { const signed await window.PSign.sign(testParams); console.log(签名成功:, signed); } catch (e) { console.error(环境仍有问题:, e); }5. 异步签名结果的同步获取方案由于某东的签名过程是异步的我们需要将其转换为同步调用。这里提供两种实用方案方案一Promise封装function getH5stSync(params) { return new Promise((resolve) { window.PSign.sign(params, (signed) { resolve(signed); }); }); } // 使用示例 (async () { const signed await getH5stSync(testParams); console.log(signed); })();方案二事件监听// 在全局环境中监听签名完成事件 window.addEventListener(h5stReady, (e) { console.log(收到签名:, e.detail); }); // 修改原始回调触发事件 const originalCallback window.originalSignCallback; window.originalSignCallback function(signed) { const event new CustomEvent(h5stReady, { detail: signed }); window.dispatchEvent(event); originalCallback.apply(this, arguments); };6. 完整环境补全代码实现以下是经过实战验证的环境补全方案包含了所有必要的对象和属性// 基础环境设置 window global; __pro__ process; // DOM接口补全 CSSRuleList function() {}; CSSStyleDeclaration function() {}; // 其他必要接口补全... // document对象模拟 window.document { querySelector: function() {}, all: [], createElement: function(tagName) { if (tagName canvas) { return { getContext: () ({ fillRect: function() {}, // 其他canvas方法... }) }; } return {}; }, // 其他必要方法... }; // navigator对象模拟 navigator { userAgent: Mozilla/5.0..., webdriver: false, // 其他必要属性... }; // 移除Node特有对象 delete global; delete process; delete Buffer;在实际项目中你可能还需要根据具体接口调整某些环境属性。建议通过逐步调试的方式定位缺失的环境要素。

更多文章