复现某APP的最新版本签名算法分析
字数 1117 2025-08-22 12:22:36
复现某APP最新版本签名算法分析教学文档
1. 目标分析
- 目标APP: 某安卓应用(疑似京东)
- 安卓版本: 10.0.2
- 分析目标: 抓包并探索sign签名算法
2. 初步分析
2.1 定位签名相关代码
通过全局搜索sign=关键词,发现签名操作主要在以下两个包中:
com.jingdong.sdk.gatewaysigncom.jingdong.jdsdk.network.toolbox
2.2 加密算法识别
通过hook javax.crypto.spec.SecretKeySpec 类的构造函数,识别出使用了两种加密算法:
- HmacSHA256
- AES
Hook代码示例:
function hook(){
Java.perform(function (){
var hookclass = Java.use("javax.crypto.spec.SecretKeySpec");
hookclass.$init.overload('[B','java.lang.String').implementation = function (a,b){
var result = this.$init(a,b);
console.log("算法为: "+ b);
console.log(a);
return result;
}
});
}
setImmediate(hook);
输出示例:
算法为: HmacSHA256
51,52,54,54,57,99,54,54,97,101,56,51,52,53,55,97,57,97,56,101,55,98,52,100,48,52,49,55,102,48,50,102
算法为: AES
92,71,-78,37,6,27,-125,-92,21,103,84,15,88,-112,-80,45
3. 深入分析
3.1 发现SO层实现
初步分析发现:
- 未找到Java层组装request参数的代码
- 判断签名组装逻辑在SO文件中
定位到关键SO文件:
libjdbitmapkit.so
通过搜索关键词"sign",发现关键函数地址:
- 00012EB0
- 00012C4E
3.2 定位JNI接口
发现关键JNI函数:
Java_com_jingdong_common_utils_BitmapkitUtils_getSignFromJni
对应的Java类:
com.jingdong.common.utils.BitmapkitUtils
对应的Java方法:
getSignFromJni
4. Hook实现
Hook getSignFromJni 方法的示例代码:
function hook(){
Java.perform(function (){
var hookclass = Java.use('com.jingdong.common.utils.BitmapkitUtils');
hookclass.getSignFromJni.implementation = function(a,b,c,d,e,f){
var result = this.getSignFromJni(a,b,c,d,e,f);
console.log(">>> hook = " + b + c + d + e + f + ' \n rc= ' + result);
return result;
}
});
}
setImmediate(hook);
5. 关键点总结
- 加密算法:同时使用了HmacSHA256和AES两种加密算法
- 签名流程:
- Java层初始化密钥
- 通过JNI调用SO层实现签名计算
- 关键类:
BitmapkitUtils- 提供签名接口SecretKeySpec- 密钥规范类
- 关键SO:
libjdbitmapkit.so- 包含核心签名算法实现
- Hook技巧:
- 构造函数需要使用
$init形式hook - JNI方法需要hook对应的Java包装方法
- 构造函数需要使用
6. 后续分析建议
- SO逆向:深入分析
libjdbitmapkit.so中的签名算法实现 - 参数分析:完整记录
getSignFromJni方法的参数和返回值 - 密钥来源:追踪HmacSHA256和AES密钥的生成和存储位置
- 签名规则:分析请求参数的组装规则和签名计算流程
7. 注意事项
- 构造函数hook需要使用
$init而非普通方法名 - hook构造函数时需要调用原始实现(
this.$init) - SO层分析需要结合静态分析和动态调试
- 多算法组合使用时需理清各算法的用途和调用顺序