某某新闻 app sign逆向
字数 1554 2025-08-29 08:30:31

某某新闻App Sign逆向分析教学文档

1. 前言

本教程详细分析某某新闻App(版本1.2)的sign签名生成机制,适用于Android安全研究人员和逆向工程师。

环境准备:

  • 测试设备: Pixel 2
  • Android版本: 10
  • 工具: Postern(抓包)、frida(动态分析)、jadx(静态分析)、IDA Pro(原生代码分析)

2. 初步抓包分析

  1. 使用Postern配合抓包工具捕获登录请求
  2. 发现请求中包含sign参数,需要逆向分析其生成逻辑

3. 脱壳处理

  1. 原始APK使用了数字壳保护
  2. 使用fundeX工具进行脱壳:
    • 脱出的dex文件位于/data/data/com.dachaun.news/目录下
    • 将多个dex文件拉取到本地
  3. 使用jadx反编译所有dex文件

4. Java层分析

  1. 搜索字符串"sign"定位关键代码

  2. 排除第三方SDK(如阿里、腾讯、魅族等)的干扰

  3. 关键调用链:

    • this.sign
    • getSign()
    • 最终调用到JNI函数nativeGetSign
  4. 参数分析:

    • 第一个参数: account (UUID随机生成)
    • 第二个参数: token (未登录时为空)
    • 第三个参数: timestamp (当前时间戳)
  5. 关键Java代码:

    // account生成
    String account = UUID.randomUUID().toString();
    // timestamp生成
    String timestamp = String.valueOf(System.currentTimeMillis());
    

5. Native层分析

使用IDA Pro分析libwtf.so库:

  1. 搜索getSign函数定位关键实现

  2. 签名生成流程:

    • 首先获取LogShutDown.getAppSign()的返回值
    • 对该值进行MD5加密并转为大写,得到appsignMd5result
    • 拼接字符串: appsignMd5result + account + token + timestamp
    • 对拼接结果再次进行MD5加密并转为大写,得到最终sign
  3. 关键Native代码逻辑:

    // 获取getAppSign返回值
    jstring __s = (jstring)env->CallStaticObjectMethod(cls_LogShutDown, getAppSign);
    
    // 第一次MD5加密
    std::string src = md5(stringFromJstring(env, __s));
    std::string appsignMd5result = toUpperCase(src);
    
    // 字符串拼接
    std::string input = appsignMd5result + account + token + timestamp;
    
    // 第二次MD5加密
    std::string result = toUpperCase(md5(input));
    

6. Hook验证

使用frida进行动态验证:

  1. Hook md5::update函数验证输入参数:

    // 打印md5::update的输入
    console.log("input: " + ptr(input).readCString());
    

    验证拼接逻辑是否正确

  2. Hook LogShutDown.getAppSign:

    // 打印getAppSign返回值
    console.log("getAppSign return: " + retval);
    

    发现返回值为固定值

7. 签名生成复现

示例数据:

  • getAppSign返回: A262FA6ED59F60E49FD49E205F68426D
  • account: 2d5c37ea-c2ef-4453-a87a-103610a90b53
  • token: 空
  • timestamp: 1735787896808

生成步骤:

  1. A262FA6ED59F60E49FD49E205F68426D进行MD5:

    • 结果: f2fd87d83151721b48e869dbff113ac8
    • 转为大写: F2FD87D83151721B48E869DBFF113AC8
  2. 拼接字符串:
    F2FD87D83151721B48E869DBFF113AC82d5c37ea-c2ef-4453-a87a-103610a90b531735787896808

  3. 对拼接结果进行MD5并转为大写,得到最终sign

8. 总结

某某新闻App的sign生成流程:

  1. 获取固定的getAppSign返回值
  2. 对该值进行MD5并转为大写
  3. 拼接account、token(如有)和timestamp
  4. 对拼接结果进行MD5并转为大写
  5. 最终结果作为sign使用

关键点:

  • 使用了双重MD5加密
  • 第一次加密的对象是固定的应用签名
  • 第二次加密的对象是拼接字符串
  • 所有MD5结果都转为大写
  • account使用UUID随机生成
  • token在未登录时为空

9. 防御建议

对于类似签名机制的安全加固建议:

  1. 增加动态密钥或盐值
  2. 引入设备指纹等变量因素
  3. 使用非标准哈希算法或自定义加密
  4. 关键逻辑增加混淆和反调试保护
某某新闻App Sign逆向分析教学文档 1. 前言 本教程详细分析某某新闻App(版本1.2)的sign签名生成机制,适用于Android安全研究人员和逆向工程师。 环境准备 : 测试设备: Pixel 2 Android版本: 10 工具: Postern(抓包)、frida(动态分析)、jadx(静态分析)、IDA Pro(原生代码分析) 2. 初步抓包分析 使用Postern配合抓包工具捕获登录请求 发现请求中包含sign参数,需要逆向分析其生成逻辑 3. 脱壳处理 原始APK使用了数字壳保护 使用fundeX工具进行脱壳: 脱出的dex文件位于 /data/data/com.dachaun.news/ 目录下 将多个dex文件拉取到本地 使用jadx反编译所有dex文件 4. Java层分析 搜索字符串"sign"定位关键代码 排除第三方SDK(如阿里、腾讯、魅族等)的干扰 关键调用链: this.sign getSign() 最终调用到JNI函数 nativeGetSign 参数分析: 第一个参数: account (UUID随机生成) 第二个参数: token (未登录时为空) 第三个参数: timestamp (当前时间戳) 关键Java代码: 5. Native层分析 使用IDA Pro分析 libwtf.so 库: 搜索 getSign 函数定位关键实现 签名生成流程: 首先获取 LogShutDown.getAppSign() 的返回值 对该值进行MD5加密并转为大写,得到 appsignMd5result 拼接字符串: appsignMd5result + account + token + timestamp 对拼接结果再次进行MD5加密并转为大写,得到最终sign 关键Native代码逻辑: 6. Hook验证 使用frida进行动态验证: Hook md5::update 函数验证输入参数: 验证拼接逻辑是否正确 Hook LogShutDown.getAppSign : 发现返回值为固定值 7. 签名生成复现 示例数据: getAppSign返回: A262FA6ED59F60E49FD49E205F68426D account: 2d5c37ea-c2ef-4453-a87a-103610a90b53 token: 空 timestamp: 1735787896808 生成步骤: 对 A262FA6ED59F60E49FD49E205F68426D 进行MD5: 结果: f2fd87d83151721b48e869dbff113ac8 转为大写: F2FD87D83151721B48E869DBFF113AC8 拼接字符串: F2FD87D83151721B48E869DBFF113AC82d5c37ea-c2ef-4453-a87a-103610a90b531735787896808 对拼接结果进行MD5并转为大写,得到最终sign 8. 总结 某某新闻App的sign生成流程: 获取固定的 getAppSign 返回值 对该值进行MD5并转为大写 拼接account、token(如有)和timestamp 对拼接结果进行MD5并转为大写 最终结果作为sign使用 关键点 : 使用了双重MD5加密 第一次加密的对象是固定的应用签名 第二次加密的对象是拼接字符串 所有MD5结果都转为大写 account使用UUID随机生成 token在未登录时为空 9. 防御建议 对于类似签名机制的安全加固建议: 增加动态密钥或盐值 引入设备指纹等变量因素 使用非标准哈希算法或自定义加密 关键逻辑增加混淆和反调试保护