在逆向分析东方财富自选股接口时,常见的技术问题是:其请求参数中的 `token` 和 `signature` 存在动态加密机制,且随版本更新频繁变更。如何通过抓包分析与反编译 APK 或 Web JS 代码,定位加密入口函数?特别是当加密逻辑涉及混淆的 JavaScript 或 native 层 SO 库时,应如何结合 Frida 挂钩、AST 解析或模拟执行还原加密算法?此外,`signature` 是否依赖时间戳、设备指纹或会话状态?这些因素使得参数生成难以复现,阻碍自动化采集。
1条回答 默认 最新
小丸子书单 2025-11-05 11:29关注逆向分析东方财富自选股接口:动态加密参数的破解路径
1. 常见技术问题概述
在对东方财富自选股接口进行逆向分析时,开发者常面临的核心挑战是请求中携带的
token和signature参数采用动态加密机制。这些参数通常由客户端生成,并随应用版本频繁更新其加密算法。- token:可能为会话凭证或用户身份标识,具有时效性。
- signature:用于验证请求合法性,常基于时间戳、URL路径、请求体等数据拼接后加密生成。
- 加密逻辑常被混淆或下沉至 native 层(如 SO 库),极大增加静态分析难度。
- 防爬策略包括设备指纹绑定、请求频率限制、SSL Pinning 等。
2. 抓包分析与初步定位
使用工具如 Charles、Fiddler 或 mitmproxy 搭配代理抓包,可捕获 App 发出的真实 HTTP 请求:
GET /api/stock/getMyStocks?token=abc123&signature=xyz789&t=1718000000 HTTP/1.1 Host: api.eastmoney.com User-Agent: EastMoney Android 12.0通过观察多组请求发现:
参数名 是否变化 变化规律 token 是 每次登录刷新 signature 是 每请求均不同 t (时间戳) 是 精确到秒 3. 反编译 APK 定位关键函数
使用 JADX-GUI 打开反编译后的 APK,搜索关键词 “signature”、“signData”、“generateToken” 等:
public class SignUtils { public static String generateSignature(Map params) { String sorted = sortParams(params); return nativeSign(sorted); // 调用 native 方法 } }若发现调用
native方法,则需进一步分析 SO 库。4. 处理混淆 JS 与 Web 层加密
对于网页端接口,加密逻辑常位于压缩混淆的 JavaScript 文件中。可通过以下方式处理:
- 使用浏览器 DevTools 设置断点于 XHR 请求发出前。
- 查找
XMLHttpRequest.prototype.send的 hook 点。 - 利用 AST 解析(如 Babel)还原控制流平坦化、字符串加密等混淆手法。
- 提取核心签名函数并重构为 Python 可执行代码。
5. Frida 动态挂钩 Native 层加密函数
当加密逻辑位于 SO 库时,可使用 Frida 注入进程并监控 JNI 调用:
Java.perform(function () { var SignUtils = Java.use("com.eastmoney.security.SignUtils"); SignUtils.generateSignature.overload('java.util.Map').implementation = function (params) { console.log("Signing params:", params.toString()); var result = this.generateSignature(params); console.log("Signature result:", result); return result; }; });结合
frida-trace -U -n app.eastmoney -i "*sign*"自动追踪符号。6. 模拟执行与脱壳还原
针对高强度混淆或加壳情况,需采用模拟执行技术:
- 使用 Unidbg 模拟 ARM 环境加载 SO 库,调用 native 函数获取签名结果。
- 通过 JEB 或 IDA Pro 静态分析 SO 导出表,识别加密入口地址。
- 配合 LIEF 修改 ELF 属性绕过完整性校验。
7. signature 依赖因素分析
经实测与日志分析,signature 生成通常依赖以下因子:
graph TD A[原始请求参数] --> B{按字典序排序} B --> C[拼接成字符串] C --> D[附加时间戳t] D --> E[加入设备ID/AndroidID/OAID] E --> F[调用HMAC-SHA256或AES加密] F --> G[转为hex或base64] G --> H[作为signature提交]8. 自动化采集可行性方案
为实现稳定自动化采集,建议构建如下架构:
class EastMoneyClient: def __init__(self): self.device_id = gen_fingerprint() self.session = self.login() def sign_request(self, url, params): params['t'] = int(time.time()) sig = frida_call_native("sign", params) params['signature'] = sig return requests.get(url, params=params)通过容器化部署多个设备指纹实例,降低封禁风险。
9. 加密机制演进趋势与对抗策略
近年来,东方财富逐步将加密逻辑迁移至:
- SO 层 + inline assembly 提高逆向成本
- 动态下发 JS Bundle 实现热更新加密算法
- 引入行为验证码(如滑块)阻断机器请求
应对策略包括:
- 建立版本差异比对系统,自动识别加密函数变更。
- 使用 headless Chrome + Puppeteer 模拟真实用户行为。
- 搭建私有化抓包集群,集中管理 token 生命周期。
10. 工具链整合建议
推荐构建一体化逆向分析平台,集成以下组件:
工具 用途 备注 JADX/GDA APK 反编译 支持 Kotlin 解析 Frida 运行时 Hook 支持 SO 层拦截 Unidbg SO 模拟执行 无需真机 Babel/Esprima JS AST 分析 去混淆利器 mitmproxy 流量劫持 支持脚本扩展 本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报