某某行逆向分析
字数 1665 2025-08-29 08:30:19

某某行APP逆向分析技术文档

前言

  • 测试设备: Google Pixel 2 (Android 10)
  • 目标APP: 6IuPZeih{beihai}jDMuM{beihai}jMuMQ== (某某行APP)
  • 分析重点: 登录过程中的signature、random和password字段的加密算法

一、环境准备与初步分析

1.1 抓包分析

使用抓包工具捕获登录请求,重点关注以下字段:

  • signature
  • random
  • password

1.2 脱壳处理

  • 使用开发者助手检查APP信息,发现存在网易加固
  • 该APP未实现Frida检测机制,可直接运行脱壳脚本
  • 使用Frida脚本dump出尽可能多的dex文件

二、签名(signature)和随机数(random)字段分析

2.1 定位关键函数

通过字符串搜索"signature"定位到关键类:
com.bwton.metro.network.strategy.impl.MSXLocalSignatureStrategy.generateSignature

2.2 加密流程分析

  • signature生成:

    • 对特定JSON字符串(str)取MD5哈希
    • 使用RSA公钥加密(MD5结果)
    • 对应函数: signReqJsonBodyencryptByPublicKey
  • random生成:

    • 使用相同RSA公钥加密另一个字符串(str2)
    • 对应函数: encryptByPublicKey

2.3 RSA加密细节

  • 加密模式: ECB模式
  • 公钥获取: 通过getPublicKey函数获取,经测试公钥固定不变

2.4 参数来源分析

  • str参数:

    • 固定JSON数据,包含password字段
    • 通过hook generateSignature函数获取
  • str2参数:

    • 来自HTTP headers中的HEADER_AES_KEY字段
    • 实际值为headerAesKey
    • genAesKey函数生成

2.5 AES Key生成算法

genAesKey函数逻辑:

  • 从自定义字符表中随机选取8个字符组成key

三、密码(password)字段分析

3.1 加密流程

  • 使用AES算法的ECB模式
  • 使用PKCS5填充方式
  • 加密函数: Aes.encryptByECBPKCS5

3.2 关键参数

  • 明文: 用户输入的原始密码
  • 密钥: 前述genAesKey生成的8字符随机key

四、完整加密流程总结

  1. 客户端生成随机AES Key:

    • 通过genAesKey生成8字符随机字符串
    • 存入HTTP headers的HEADER_AES_KEY字段
  2. 生成random字段:

    • 使用固定RSA公钥加密上述AES Key
  3. 生成signature字段:

    • 构造包含密码的固定JSON格式字符串
    • 计算该字符串的MD5哈希
    • 使用相同RSA公钥加密MD5结果
  4. 生成password字段:

    • 使用AES ECB模式加密原始密码
    • 密钥为前述生成的AES Key

五、技术验证方法

5.1 Hook关键函数

// Hook generateSignature
Interceptor.attach(Module.findExportByName(null, "com.bwton.metro.network.strategy.impl.MSXLocalSignatureStrategy.generateSignature"), {
    onEnter: function(args) {
        console.log("generateSignature called");
        console.log("headers: " + Memory.readUtf8String(args[1]));
        console.log("str: " + Memory.readUtf8String(args[2]));
        console.log("str2: " + Memory.readUtf8String(args[3]));
    }
});

// Hook encryptByPublicKey
Interceptor.attach(Module.findExportByName(null, "encryptByPublicKey"), {
    onEnter: function(args) {
        console.log("encryptByPublicKey called");
        console.log("input: " + Memory.readUtf8String(args[1]));
    },
    onLeave: function(retval) {
        console.log("output: " + Memory.readUtf8String(retval));
    }
});

// Hook genAesKey
Interceptor.attach(Module.findExportByName(null, "genAesKey"), {
    onLeave: function(retval) {
        console.log("genAesKey output: " + Memory.readUtf8String(retval));
    }
});

5.2 调用栈分析技巧

  • 优先Hook基础类如HashMap和JsonObject
  • 在结果中搜索关键字段名(signature, headerAesKey等)
  • 根据调用栈向上追溯加密流程

六、安全建议

  1. 加密改进建议:

    • 避免使用固定RSA公钥
    • 考虑使用更安全的加密模式如RSA-OAEP
    • AES应使用CBC或GCM模式而非ECB
  2. 混淆加固建议:

    • 增加Frida等调试工具检测
    • 加强关键函数的代码混淆
  3. 传输安全建议:

    • 考虑实现动态密钥交换机制
    • 增加时间戳防重放攻击

七、总结

本分析完整还原了某某行APP登录过程中关键字段的加密流程,包括:

  • RSA公钥加密的signature和random生成
  • AES加密的password处理
  • 随机AES Key的生成机制

通过Hook关键函数和调用栈分析,验证了加密算法的实现细节,为安全评估和进一步研究提供了技术基础。

某某行APP逆向分析技术文档 前言 测试设备 : Google Pixel 2 (Android 10) 目标APP : 6IuPZeih{beihai}jDMuM{beihai}jMuMQ== (某某行APP) 分析重点 : 登录过程中的signature、random和password字段的加密算法 一、环境准备与初步分析 1.1 抓包分析 使用抓包工具捕获登录请求,重点关注以下字段: signature random password 1.2 脱壳处理 使用开发者助手检查APP信息,发现存在网易加固 该APP未实现Frida检测机制,可直接运行脱壳脚本 使用Frida脚本dump出尽可能多的dex文件 二、签名(signature)和随机数(random)字段分析 2.1 定位关键函数 通过字符串搜索"signature"定位到关键类: com.bwton.metro.network.strategy.impl.MSXLocalSignatureStrategy.generateSignature 2.2 加密流程分析 signature生成 : 对特定JSON字符串(str)取MD5哈希 使用RSA公钥加密(MD5结果) 对应函数: signReqJsonBody → encryptByPublicKey random生成 : 使用相同RSA公钥加密另一个字符串(str2) 对应函数: encryptByPublicKey 2.3 RSA加密细节 加密模式: ECB模式 公钥获取: 通过 getPublicKey 函数获取,经测试公钥固定不变 2.4 参数来源分析 str参数 : 固定JSON数据,包含password字段 通过hook generateSignature 函数获取 str2参数 : 来自HTTP headers中的 HEADER_AES_KEY 字段 实际值为 headerAesKey 由 genAesKey 函数生成 2.5 AES Key生成算法 genAesKey 函数逻辑: 从自定义字符表中随机选取8个字符组成key 三、密码(password)字段分析 3.1 加密流程 使用AES算法的ECB模式 使用PKCS5填充方式 加密函数: Aes.encryptByECBPKCS5 3.2 关键参数 明文 : 用户输入的原始密码 密钥 : 前述 genAesKey 生成的8字符随机key 四、完整加密流程总结 客户端生成随机AES Key: 通过 genAesKey 生成8字符随机字符串 存入HTTP headers的 HEADER_AES_KEY 字段 生成random字段: 使用固定RSA公钥加密上述AES Key 生成signature字段: 构造包含密码的固定JSON格式字符串 计算该字符串的MD5哈希 使用相同RSA公钥加密MD5结果 生成password字段: 使用AES ECB模式加密原始密码 密钥为前述生成的AES Key 五、技术验证方法 5.1 Hook关键函数 5.2 调用栈分析技巧 优先Hook基础类如HashMap和JsonObject 在结果中搜索关键字段名(signature, headerAesKey等) 根据调用栈向上追溯加密流程 六、安全建议 加密改进建议 : 避免使用固定RSA公钥 考虑使用更安全的加密模式如RSA-OAEP AES应使用CBC或GCM模式而非ECB 混淆加固建议 : 增加Frida等调试工具检测 加强关键函数的代码混淆 传输安全建议 : 考虑实现动态密钥交换机制 增加时间戳防重放攻击 七、总结 本分析完整还原了某某行APP登录过程中关键字段的加密流程,包括: RSA公钥加密的signature和random生成 AES加密的password处理 随机AES Key的生成机制 通过Hook关键函数和调用栈分析,验证了加密算法的实现细节,为安全评估和进一步研究提供了技术基础。