【逆向百例】某电商数据分析平台响应数据解密逆向分析
本文记录了对某电商数据分析平台 API 响应加密机制的完整逆向过程涵盖抓包侦察、参数验证、解密定位、算法识别与本地还原。该加密方案采用AES-ECB PKCS7 gzip的组合模式密钥通过多层 toString(36) 编码混淆属于典型的前端响应加密防护适合作为响应解密类逆向的入门案例。一、目标概况项目说明目标平台某电商数据分析平台页面入口aHR0cHM6Ly93d3cuY2hhbm1hbWEuY29tL3Byb21vdGlvblJhbmsv数据接口aHR0cHM6Ly9hcGktc2VydmljZS5jaGFubWFtYS5jb20vdjYvcHJvZHVjdC9zZWFyY2g鉴权方式请求头固定参数x-client-hash/x-client-id/x-encrypt-version/x-platform-id加密方式响应体加密AES-ECB PKCS7 解密 → WordArray 转 Uint8Array → gzip 解压 → JSON分析日期2026.07.29URL 采用 Base64 编码脱敏解码后可得原始地址。逆向目标还原接口响应中密文数据的解密逻辑使本地可正常获取明文数据。二、抓包侦察2.1 捕获目标请求打开浏览器 DevTools → Network 面板通过翻页操作触发列表数据请求定位到search接口。请求头关键部分x-client-hash: 固定哈希值 x-client-id: 固定ID x-client-version: 1 x-encrypt-version: 2 x-platform-id: 10000请求体明文 JSON{multi_category_id:-1,keyword:,page:2,size:50,sort:duration_volume,day_type:1,platform:平台标识,order_by:desc}响应体密文状态码 2002.2 初步判断通过观察请求体与响应体可以得出两个关键结论数据层存在加密响应体为密文信息需逆向解密方法才能获取明文数据请求层无动态鉴权请求头中的参数均为固定值无需逆向生成逻辑2.3 参数固定性验证拦截多页请求对比各参数变化情况参数多次请求对比结论x-client-hash始终相同固定值硬编码在代码中x-client-id始终相同固定值x-encrypt-version始终相同固定值x-platform-id始终相同固定值结论请求头参数均为固定值无需逆向生成逻辑。核心逆向目标为响应体解密。三、解密定位3.1 Hook 定位在 DevTools Sources 面板中注入 Hook 脚本拦截JSON.parse方法的调用定位解密入口Hook 触发后出现明文信息根据堆栈调用信息向上追溯找到解密方法的调用位置。3.2 断点验证在解密方法处设置断点观察变量值此时可以清晰看到完整的解密链路密文 e → AES 解密 → WordArray a → u(a) 转换 → Uint8Array o → ungzip 解压 → 明文 r → JSON.parse四、解密逻辑分析4.1 源码还原从断点位置提取的关键代码如下// AES 密钥推导ns.enc.Utf8.parse(27..toString(36).toLowerCase().split().map(function(t){returnString.fromCharCode(t.charCodeAt()-39);}).join()24901..toString(36).toLowerCase()33..toString(36).toLowerCase().split().map(function(t){returnString.fromCharCode(t.charCodeAt()-39);}).join()976..toString(36).toLowerCase()20..toString(36).toLowerCase().split().map(function(t){returnString.fromCharCode(t.charCodeAt()-39);}).join()(function(){vartArray.prototype.slice.call(arguments),et.shift();returnt.reverse().map(function(t,n){returnString.fromCharCode(t-e-24-n);}).join();})(10,127,154,91,151,91,136)11..toString(36).toLowerCase()13..toString(36).toLowerCase().split().map(function(t){returnString.fromCharCode(t.charCodeAt()-13);}).join());// AES-ECB 解密as.AES.decrypt(e,n,{mode:s.mode.ECB,padding:s.pad.Pkcs7});// WordArray → Uint8Arrayou(a);// gzip 解压rc.ungzip(o,{to:string});// JSON 解析returnJSON.parse(r);4.2 逻辑拆解将上述代码逐步拆解解密流程如下┌─────────────────────────────────────────────────────────┐ │ Step 1: 推导 AES 密钥 │ │ key 多层 toString(36) 编码 charCode 偏移拼接 │ │ 最终结果: 16字节字符串 (AES-128) │ ├─────────────────────────────────────────────────────────┤ │ Step 2: AES-ECB 解密 │ │ plaintext AES.decrypt(ciphertext, key, { │ │ mode: ECB, padding: PKCS7 │ │ }) │ │ // 输出为 CryptoJS WordArray 对象 │ ├─────────────────────────────────────────────────────────┤ │ Step 3: WordArray → Uint8Array │ │ bytes u(wordArray) │ │ // 逐字提取 4 字节按大端序拆分 │ ├─────────────────────────────────────────────────────────┤ │ Step 4: gzip 解压 │ │ jsonStr pako.ungzip(bytes, { to: string }) │ ├─────────────────────────────────────────────────────────┤ │ Step 5: JSON 解析 │ │ data JSON.parse(jsonStr) │ └─────────────────────────────────────────────────────────┘4.3 子函数验证密钥推导将混淆代码在 Node.js 中执行得到 AES 密钥为 16 字节字符串对应 AES-128。u 方法WordArray → Uint8Array 转换functionu(t){vare,n,it.words.length,anewUint8Array(t.sigBytes),o0;for(n0;ni;n)et.words[n],a[o]e24,a[o]e16255,a[o]e8255,a[o]255e;returna;}该函数将 CryptoJS 的 WordArray32 位整数数组按大端序逐字节拆分为 Uint8Array属于标准转换操作。AES 解密验证使用推导出的密钥对密文进行 AES-ECB PKCS7 解密解密后的数据经u方法转换后为 gzip 压缩的二进制数据符合预期。gzip 解压验证使用pako库对解密后的 Uint8Array 进行解压得到明文 JSON 字符串与浏览器中观察到的明文数据完全一致。五、本地还原5.1 Node.js 实现constCryptoJSrequire(crypto-js);constpakorequire(pako);functionu(t){vare,n,it.words.length,anewUint8Array(t.sigBytes),o0;for(n0;ni;n)et.words[n],a[o]e24,a[o]e16255,a[o]e8255,a[o]255e;returna;}functiondecryptResponse(ciphertext){constkeyCryptoJS.enc.Utf8.parse(推导出的AES密钥);constdecryptedCryptoJS.AES.decrypt(ciphertext,key,{mode:CryptoJS.mode.ECB,padding:CryptoJS.pad.Pkcs7});constbytesu(decrypted);constjsonStrpako.ungzip(bytes,{to:string});returnJSON.parse(jsonStr);}constciphertext...;// 接口返回的密文console.log(decryptResponse(ciphertext));5.2 Python 实现fromCrypto.CipherimportAESfromCrypto.Util.Paddingimportunpadimportgzipimportjsonimportbase64defdecrypt_response(ciphertext_b64):keyb推导出的AES密钥ciphertextbase64.b64decode(ciphertext_b64)cipherAES.new(key,AES.MODE_ECB)plaintextunpad(cipher.decrypt(ciphertext),AES.block_size)json_strgzip.decompress(plaintext).decode(utf-8)returnjson.loads(json_str)ciphertext...# 接口返回的密文Base64编码print(decrypt_response(ciphertext))5.3 验证结果通过本地还原的解密方法能够正常解密接口返回的密文信息得到明文数据六、总结加密方案特征维度分析算法类型标准 AES-128-ECB PKCS7无魔改配合 gzip 压缩密钥来源前端 JS 中通过 toString(36) charCode 偏移多层混淆但可本地执行还原防护强度较低——密钥推导逻辑硬编码在前端ECB 模式无 IV算法均为标准实现压缩层gzip 压缩服务端加密前压缩客户端解密后解压请求鉴权无动态鉴权参数请求头均为固定值逆向思路回顾抓包侦察 → 参数验证固定性→ Hook JSON.parse 定位 → 断点确认解密链路 → 源码提取 → 密钥推导还原 → 子函数验证u方法/ungzip→ 本地还原 → 一致性验证本案例属于前端响应加密的入门级难度核心难点在于定位解密入口和还原混淆的密钥推导逻辑。解密链路清晰AES → WordArray转换 → gzip解压 → JSON算法均为标准实现还原过程非常直接。免责声明本文仅用于技术学习与研究目的请勿将相关技术用于非法用途。数据采集行为应遵守《网络安全法》等相关法律法规尊重网站的服务条款和 robots.txt 协议。

相关新闻

手游联运合作流程实操:步骤、指标与复盘重点

手游联运合作流程实操:步骤、指标与复盘重点

手游联运合作流程实操的核心,是从渠道选择、资质提交、合同签署、技术接入、数据联调、正式上线、分成结算到运营复盘的完整链条。对于刚接触联运的发行团队、公会或MCN机构来说,流程中的每一个环节都可能影响最终的合作效果和收益。以下是对全流程的拆解…

2026/10/14 9:10:21 阅读更多 →
大模型应用开发工程师:开启AI落地新时代,小白程序员必备收藏指南

大模型应用开发工程师:开启AI落地新时代,小白程序员必备收藏指南

AI大模型应用开发工程师是连接技术与产业的关键角色,负责将复杂AI技术转化为实用工具。他们需对接业务需求,进行技术选型、应用开发、测试优化,并确保产品安全合规。这一职业薪资高、前景好,是程序员转行或提升技能的重要方向&…

2026/10/14 9:09:40 阅读更多 →
MathType公式在技术博客中的完美呈现方案

MathType公式在技术博客中的完美呈现方案

1. 项目背景与需求分析在技术博客写作过程中,数学公式的呈现一直是个痛点。特别是对于科研工作者、工程师等需要频繁使用数学表达式的群体,如何在博客中完美保留MathType公式的属性和格式,成为提升内容质量的关键需求。我最近在迁移一批学术文…

2026/10/1 10:13:11 阅读更多 →

最新新闻

SpringBoot+Vue构建高效办公管理系统实战

SpringBoot+Vue构建高效办公管理系统实战

1. 项目背景与核心价值 办公管理系统作为企业数字化转型的基础设施,正在从传统的C/S架构向B/S架构快速迁移。这个基于SpringBootVue的前后端分离项目,完美契合了现代企业对高效协同、移动办公和低维护成本的核心需求。 我去年为一家中型科技公司实施类似…

2026/10/14 9:09:51 阅读更多 →
多技术栈融合的在线蛋糕商城系统架构实践

多技术栈融合的在线蛋糕商城系统架构实践

1. 项目概述与核心价值 在线蛋糕商城系统是烘焙行业数字化转型的典型解决方案,它通过多技术栈融合实现了从商品展示到订单履约的全流程线上化。这个项目最显著的特点在于采用了PHP、ASP.NET、Java三大后端技术体系,同时整合了SpringBoot、SSM等主流框架&…

2026/10/14 9:09:51 阅读更多 →
PS5全场景调校指南:从开箱设置到串流与存储

PS5全场景调校指南:从开箱设置到串流与存储

“AnyPS5”这个名字,我第一次看到时第一反应是“这怕不是个万能折腾工具”,后来仔细一想,把它理解成“一台PS5能不能适配你的全部使用场景”其实更有意思。我在玩PS5的这几年里,踩过的坑和摸索出的方法不算少,从新机开…

2026/10/14 9:09:51 阅读更多 →
SpringBoot+Vue高校实验室管理系统开发实践

SpringBoot+Vue高校实验室管理系统开发实践

1. 项目概述高校实验室教学管理系统是基于SpringBoot框架开发的一套综合性管理平台,旨在解决传统实验室管理中存在的信息孤岛、流程繁琐、资源利用率低等问题。作为一名有10年开发经验的Java全栈工程师,我在实际教学管理场景中经常遇到以下痛点&#xff…

2026/10/14 9:09:51 阅读更多 →
Oracle 19c OPatch升级实战:p6880880补丁包替换与避坑指南

Oracle 19c OPatch升级实战:p6880880补丁包替换与避坑指南

简介:此压缩包是Oracle 19c数据库的官方更新补丁,面向64位Linux平台,供DBA、系统管理员在修复已知缺陷、加固安全防护或进行版本维护时使用。补丁编号p6880880来自Oracle标准发布渠道,配套内置的OPatch工具,支持补丁安…

2026/10/14 9:09:51 阅读更多 →
Vue3调度系统:任务队列、优先级与更新机制解密

Vue3调度系统:任务队列、优先级与更新机制解密

Vue3架构设计里,调度系统是最容易被忽略、却又实打实决定应用流畅度的核心模块。很多人把Vue3的更新机制简单理解为“数据变了就通知视图更新”,但实际上,从响应式数据发生变化,到DOM真正被修改,中间隔着一整套复杂且有…

2026/10/14 9:08:50 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →