饿了么H5端bxet与sign逆向实战:从插桩到环境补全

张开发
2026/4/11 17:06:35 15 分钟阅读

分享文章

饿了么H5端bxet与sign逆向实战:从插桩到环境补全
1. 饿了么H5端加密参数逆向分析入门第一次接触饿了么H5端的加密逆向时我发现它的加密逻辑看似简单但实际操作中会遇到不少坑。主要需要破解两个关键参数sign和bxet。这两个参数都出现在请求的headers或data中是服务端验证请求合法性的重要依据。我在实际逆向过程中发现饿了么的反调试手段主要集中在三个方面修改原生console.log函数、原型链检测和环境变量校验。最让人头疼的是他们修改了console.log导致我们常用的调试输出方法失效。这时候就需要先hook住console.log恢复其原始功能后才能正常输出调试信息。逆向分析这类Web端加密我总结出一个黄金法则缺啥补啥。简单来说就是先找到加密函数的入口然后观察它依赖哪些环境变量或函数缺什么我们就补什么。这种方法特别适合应对饿了么这种会检测浏览器环境的场景。2. 逆向准备工作与环境搭建2.1 必备工具清单工欲善其事必先利其器。在开始逆向之前我们需要准备好以下工具Chrome开发者工具必备Fiddler/Charles抓包工具Node.js环境用于模拟执行油猴脚本用于快速hook函数我强烈建议在虚拟机或独立环境中进行这些操作避免影响正常浏览体验。记得每次修改代码后都要清除缓存并硬刷新页面CtrlF5否则可能会因为缓存问题导致修改不生效。2.2 解决console.log被修改的问题饿了么H5端最基础的反调试就是修改了console.log函数。这个问题看似简单但会让很多新手卡住。我的解决方案是使用以下油猴脚本// UserScript // name Fix Console // namespace http://tampermonkey.net/ // version 0.1 // description 恢复被修改的console.log // author You // match *://h5.ele.me/* // grant none // /UserScript (function() { use strict; if(window.console console.log) { var original console.log; console.log function() { original.apply(console, arguments); }; } })();这个脚本会在页面加载前先hook住console.log确保我们能正常输出调试信息。安装后记得刷新页面才能生效。3. sign参数逆向分析实战3.1 定位sign生成函数sign参数是饿了么H5端最基础的加密参数通常出现在请求的data中。我通过以下步骤找到了它的生成位置在Chrome开发者工具中打开饿了么H5页面搜索关键词sign:找到所有相关代码在所有匹配位置打上断点刷新页面触发断点通过堆栈回溯我发现sign的生成依赖于两个关键数据请求参数中的data对象cookie中的_m_h5_tk值取前半部分作为token3.2 逆向sign生成算法经过多次断点调试和参数对比我总结出sign的生成规律function generateSign(data, token) { // 1. 将data对象按key排序后转为query string const sortedParams Object.keys(data).sort().map(key { return ${key}${data[key]}; }).join(); // 2. 拼接token和排序后的参数字符串 const rawSign token sortedParams; // 3. 使用MD5加密 return md5(rawSign); }实际逆向时我发现饿了么会检测window对象下的某些属性所以直接复制这个函数可能无法正常运行。这时候就需要用到缺啥补啥的策略逐步补全它检测的环境变量。4. bxet参数逆向分析进阶4.1 定位bxet生成入口bxet参数比sign复杂得多它出现在请求headers的x-ele-check字段中。我通过以下方法找到了生成入口在控制台输入window查看全局对象发现可疑函数window.x_check和window.etSign对这些函数进行插桩调试插桩代码示例const originalXCheck window.x_check; window.x_check function(...args) { console.log(x_check调用参数:, args); const result originalXCheck.apply(this, args); console.log(x_check返回结果:, result); return result; };4.2 解析bxet生成逻辑通过多次插桩分析我发现bxet的生成流程如下接收请求URL作为输入参数内部调用多个加密函数进行处理依赖浏览器环境信息如navigator、location等最终生成一个固定长度的加密字符串最难的部分在于它会对浏览器环境进行严格检测包括原型链完整性检查location对象属性验证时间戳校验5. 环境补全策略详解5.1 基础环境补全针对饿了么的环境检测我总结出以下补全方案// 补全location对象 const fakeLocation { href: https://h5.ele.me/, protocol: https:, host: h5.ele.me, // 其他必要属性... }; // 补全navigator对象 const fakeNavigator { userAgent: Mozilla/5.0..., // 其他必要属性... }; // 替换全局对象 window.location fakeLocation; window.navigator fakeNavigator;5.2 高级检测绕过对于更复杂的原型链检测我们需要更精细的补全// 创建一个纯净的环境 const cleanWindow {}; const iframe document.createElement(iframe); iframe.style.display none; document.body.appendChild(iframe); const pureWindow iframe.contentWindow; // 复制必要函数到我们的环境 window.Object pureWindow.Object; window.Function pureWindow.Function; // 其他必要对象...这种方法能有效绕过大多数原型链检测但要注意保持对象关系的完整性。6. 完整逆向流程与注意事项6.1 逆向工作流总结经过多次实践我优化出以下高效逆向流程使用油猴脚本恢复console.log功能通过全局搜索定位关键加密函数对可疑函数进行插桩调试分析函数依赖的环境变量按需补全缺失的环境验证参数生成结果6.2 常见问题与解决方案在逆向过程中我遇到过几个典型问题函数调用栈断裂解决方案是使用debugger语句配合条件断点环境检测失败需要更精细地补全环境对象加密结果不一致检查时间戳和随机数的影响特别提醒所有逆向分析都应遵守法律法规仅用于学习交流目的。在实际操作中我建议使用测试账号进行操作避免影响正常用户体验。

更多文章