王麑 2025-11-05 11:25 采纳率: 98.7%
浏览 0
已采纳

如何解析东方财富自选股接口加密参数?

在逆向分析东方财富自选股接口时,常见的技术问题是:其请求参数中的 `token` 和 `signature` 存在动态加密机制,且随版本更新频繁变更。如何通过抓包分析与反编译 APK 或 Web JS 代码,定位加密入口函数?特别是当加密逻辑涉及混淆的 JavaScript 或 native 层 SO 库时,应如何结合 Frida 挂钩、AST 解析或模拟执行还原加密算法?此外,`signature` 是否依赖时间戳、设备指纹或会话状态?这些因素使得参数生成难以复现,阻碍自动化采集。
  • 写回答

1条回答 默认 最新

  • 小丸子书单 2025-11-05 11:29
    关注

    逆向分析东方财富自选股接口:动态加密参数的破解路径

    1. 常见技术问题概述

    在对东方财富自选股接口进行逆向分析时,开发者常面临的核心挑战是请求中携带的 tokensignature 参数采用动态加密机制。这些参数通常由客户端生成,并随应用版本频繁更新其加密算法。

    • 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 文件中。可通过以下方式处理:

    1. 使用浏览器 DevTools 设置断点于 XHR 请求发出前。
    2. 查找 XMLHttpRequest.prototype.send 的 hook 点。
    3. 利用 AST 解析(如 Babel)还原控制流平坦化、字符串加密等混淆手法。
    4. 提取核心签名函数并重构为 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 实现热更新加密算法
    • 引入行为验证码(如滑块)阻断机器请求

    应对策略包括:

    1. 建立版本差异比对系统,自动识别加密函数变更。
    2. 使用 headless Chrome + Puppeteer 模拟真实用户行为。
    3. 搭建私有化抓包集群,集中管理 token 生命周期。

    10. 工具链整合建议

    推荐构建一体化逆向分析平台,集成以下组件:

    工具用途备注
    JADX/GDAAPK 反编译支持 Kotlin 解析
    Frida运行时 Hook支持 SO 层拦截
    UnidbgSO 模拟执行无需真机
    Babel/EsprimaJS AST 分析去混淆利器
    mitmproxy流量劫持支持脚本扩展
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 11月6日
  • 创建了问题 11月5日