某某新闻 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. 初步抓包分析
- 使用Postern配合抓包工具捕获登录请求
- 发现请求中包含sign参数,需要逆向分析其生成逻辑
3. 脱壳处理
- 原始APK使用了数字壳保护
- 使用fundeX工具进行脱壳:
- 脱出的dex文件位于
/data/data/com.dachaun.news/目录下 - 将多个dex文件拉取到本地
- 脱出的dex文件位于
- 使用jadx反编译所有dex文件
4. Java层分析
-
搜索字符串"sign"定位关键代码
-
排除第三方SDK(如阿里、腾讯、魅族等)的干扰
-
关键调用链:
this.signgetSign()- 最终调用到JNI函数
nativeGetSign
-
参数分析:
- 第一个参数: account (UUID随机生成)
- 第二个参数: token (未登录时为空)
- 第三个参数: timestamp (当前时间戳)
-
关键Java代码:
// account生成 String account = UUID.randomUUID().toString(); // timestamp生成 String timestamp = String.valueOf(System.currentTimeMillis());
5. Native层分析
使用IDA Pro分析libwtf.so库:
-
搜索
getSign函数定位关键实现 -
签名生成流程:
- 首先获取
LogShutDown.getAppSign()的返回值 - 对该值进行MD5加密并转为大写,得到
appsignMd5result - 拼接字符串:
appsignMd5result + account + token + timestamp - 对拼接结果再次进行MD5加密并转为大写,得到最终sign
- 首先获取
-
关键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进行动态验证:
-
Hook
md5::update函数验证输入参数:// 打印md5::update的输入 console.log("input: " + ptr(input).readCString());验证拼接逻辑是否正确
-
Hook
LogShutDown.getAppSign:// 打印getAppSign返回值 console.log("getAppSign return: " + retval);发现返回值为固定值
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. 防御建议
对于类似签名机制的安全加固建议:
- 增加动态密钥或盐值
- 引入设备指纹等变量因素
- 使用非标准哈希算法或自定义加密
- 关键逻辑增加混淆和反调试保护