复现某APP的最新版本签名算法分析
字数 1117 2025-08-22 12:22:36

复现某APP最新版本签名算法分析教学文档

1. 目标分析

  • 目标APP: 某安卓应用(疑似京东)
  • 安卓版本: 10.0.2
  • 分析目标: 抓包并探索sign签名算法

2. 初步分析

2.1 定位签名相关代码

通过全局搜索sign=关键词,发现签名操作主要在以下两个包中:

  • com.jingdong.sdk.gatewaysign
  • com.jingdong.jdsdk.network.toolbox

2.2 加密算法识别

通过hook javax.crypto.spec.SecretKeySpec 类的构造函数,识别出使用了两种加密算法:

  1. HmacSHA256
  2. 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. 关键点总结

  1. 加密算法:同时使用了HmacSHA256和AES两种加密算法
  2. 签名流程
    • Java层初始化密钥
    • 通过JNI调用SO层实现签名计算
  3. 关键类
    • BitmapkitUtils - 提供签名接口
    • SecretKeySpec - 密钥规范类
  4. 关键SO
    • libjdbitmapkit.so - 包含核心签名算法实现
  5. Hook技巧
    • 构造函数需要使用$init形式hook
    • JNI方法需要hook对应的Java包装方法

6. 后续分析建议

  1. SO逆向:深入分析libjdbitmapkit.so中的签名算法实现
  2. 参数分析:完整记录getSignFromJni方法的参数和返回值
  3. 密钥来源:追踪HmacSHA256和AES密钥的生成和存储位置
  4. 签名规则:分析请求参数的组装规则和签名计算流程

7. 注意事项

  1. 构造函数hook需要使用$init而非普通方法名
  2. hook构造函数时需要调用原始实现(this.$init)
  3. SO层分析需要结合静态分析和动态调试
  4. 多算法组合使用时需理清各算法的用途和调用顺序
复现某APP最新版本签名算法分析教学文档 1. 目标分析 目标APP: 某安卓应用(疑似京东) 安卓版本: 10.0.2 分析目标: 抓包并探索sign签名算法 2. 初步分析 2.1 定位签名相关代码 通过全局搜索 sign= 关键词,发现签名操作主要在以下两个包中: com.jingdong.sdk.gatewaysign com.jingdong.jdsdk.network.toolbox 2.2 加密算法识别 通过hook javax.crypto.spec.SecretKeySpec 类的构造函数,识别出使用了两种加密算法: HmacSHA256 AES Hook代码示例: 输出示例: 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 方法的示例代码: 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层分析需要结合静态分析和动态调试 多算法组合使用时需理清各算法的用途和调用顺序