某某行逆向分析
字数 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结果)
- 对应函数:
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函数生成
- 来自HTTP headers中的
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关键函数
// 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等)
- 根据调用栈向上追溯加密流程
六、安全建议
-
加密改进建议:
- 避免使用固定RSA公钥
- 考虑使用更安全的加密模式如RSA-OAEP
- AES应使用CBC或GCM模式而非ECB
-
混淆加固建议:
- 增加Frida等调试工具检测
- 加强关键函数的代码混淆
-
传输安全建议:
- 考虑实现动态密钥交换机制
- 增加时间戳防重放攻击
七、总结
本分析完整还原了某某行APP登录过程中关键字段的加密流程,包括:
- RSA公钥加密的signature和random生成
- AES加密的password处理
- 随机AES Key的生成机制
通过Hook关键函数和调用栈分析,验证了加密算法的实现细节,为安全评估和进一步研究提供了技术基础。