安卓编写常见的hook技巧(1)
字数 1156 2025-08-25 22:58:28

Android Hook 技术基础与实战案例

一、Frida Hook 基础框架

1. 基本Hook结构

java.perform(function(){
    var utils = Java.use('要hook的类名');
    
    // hook 普通方法
    utils.类的方法名.implementation = function(参数a, b){
        console.log(a); // 输出参数a,也可用arguments[0]
        send();  // 输出信息
        return this.xxx方法; // 返回值可以是当前方法或其他
    }
});

2. 重载方法Hook

utils.类的方法名.overload("参数类型1", "参数类型2").implementation = function(a, b){
    console.log(a);
    send();
    return this.xxx方法;
}

注意:非常规类型需填写完整路径,如"com.xx.xx.自定义类"

3. 构造函数Hook

utils.$init.implementation = function(a, b){
    console.log(a);
    send();
    
    // 创建对象
    var cls = utils.$new(参数);
    
    return this.xxx方法;
}

4. 类属性Hook

utils.$init.implementation = function(a, b){
    console.log(a);
    send();
    
    // 获取/设置属性值
    var val = $utils.属性.value;
    $utils.属性.value = val;
    
    // 反射方式获取属性
    var val = Java.cast(utils.getClass(), clazz).getDeclaredField("属性名");
    val.setAccessible(true);
    var value = val.get(utils);
    val.set(utils, value);
    
    return this.xxx方法;
}

二、实战案例解析

案例1:直播软件加密分析

目标:Hook加密方法获取原始数据

  1. 通过抓包发现jsonstr特征
  2. 追踪到multipartEntity.addPart方法
  3. 定位加密方法com.showself.f.a.a(str2, Utils.h())
  4. 最终找到加密核心方法com.showself.f.b.b

Hook脚本

function hook() {
    Java.perform(function () {
        var b = Java.use("com.showself.f.b");
        b.b.overload("java.lang.String").implementation = function(a){
            console.log(a); // 打印加密前数据
            var ret = this.b(a);
            return a;
        }
    });
}
setImmediate(hook);

案例2:动漫App参数分析

分析点

  1. 抓包发现App-Info参数
  2. 定位到AppInfoModel
  3. 发现visitor_sign参数使用MD5加密
  4. 追踪参数来源Client.p()Client.o()

关键发现

  • Client.p()返回A:34f770f3177f0146
  • Client.o()返回34f770f3177f0146
  • 原始加密字符串:visiter=A:34f770f3177f0146&y-device=34f770f3177f0146

案例3:京东签名算法分析

目标:分析sign签名算法

分析过程

  1. 全局搜索sign=定位到com.jingdong.sdk.gatewaysigncom.jingdong.jdsdk.network.toolbox
  2. Hook加密类javax.crypto.spec.SecretKeySpec

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);

发现

  • 使用HmacSHA256AES算法
  • 密钥字节数组示例:51,52,54,54,57,99,54,54,...

深入分析

  1. 发现so文件libjdbitmapkit.so中的签名逻辑
  2. 定位到JNI方法Java_com_jingdong_common_utils_BitmapkitUtils_getSignFromJni
  3. Hook签名方法:
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 + ' / ' + f + ' \n rc= ' + result);
            return result;
        }
    });
}
setImmediate(hook);

三、关键技巧总结

  1. 方法定位:从网络请求特征字符串入手,逆向追踪调用链
  2. 参数获取:通过Hook关键方法打印输入参数和返回值
  3. 加密分析:重点关注加密算法类和方法
  4. Native层:当Java层无法找到关键逻辑时,需分析so文件
  5. 多方法配合:结合构造函数、普通方法和属性Hook全面分析

四、注意事项

  1. 构造函数Hook使用$init而非普通方法名
  2. 重载方法必须指定准确的参数类型
  3. 对象创建使用$new方法
  4. 属性访问可能需要先设置setAccessible(true)
  5. Native层分析需要结合IDA等工具逆向so文件
Android Hook 技术基础与实战案例 一、Frida Hook 基础框架 1. 基本Hook结构 2. 重载方法Hook 注意:非常规类型需填写完整路径,如"com.xx.xx.自定义类" 3. 构造函数Hook 4. 类属性Hook 二、实战案例解析 案例1:直播软件加密分析 目标 :Hook加密方法获取原始数据 通过抓包发现 jsonstr 特征 追踪到 multipartEntity.addPart 方法 定位加密方法 com.showself.f.a.a(str2, Utils.h()) 最终找到加密核心方法 com.showself.f.b.b Hook脚本 : 案例2:动漫App参数分析 分析点 : 抓包发现 App-Info 参数 定位到 AppInfoModel 类 发现 visitor_sign 参数使用MD5加密 追踪参数来源 Client.p() 和 Client.o() 关键发现 : Client.p() 返回 A:34f770f3177f0146 Client.o() 返回 34f770f3177f0146 原始加密字符串: visiter=A:34f770f3177f0146&y-device=34f770f3177f0146 案例3:京东签名算法分析 目标 :分析sign签名算法 分析过程 : 全局搜索 sign= 定位到 com.jingdong.sdk.gatewaysign 和 com.jingdong.jdsdk.network.toolbox Hook加密类 javax.crypto.spec.SecretKeySpec Hook脚本 : 发现 : 使用 HmacSHA256 和 AES 算法 密钥字节数组示例: 51,52,54,54,57,99,54,54,... 深入分析 : 发现so文件 libjdbitmapkit.so 中的签名逻辑 定位到JNI方法 Java_com_jingdong_common_utils_BitmapkitUtils_getSignFromJni Hook签名方法: 三、关键技巧总结 方法定位 :从网络请求特征字符串入手,逆向追踪调用链 参数获取 :通过Hook关键方法打印输入参数和返回值 加密分析 :重点关注加密算法类和方法 Native层 :当Java层无法找到关键逻辑时,需分析so文件 多方法配合 :结合构造函数、普通方法和属性Hook全面分析 四、注意事项 构造函数Hook使用 $init 而非普通方法名 重载方法必须指定准确的参数类型 对象创建使用 $new 方法 属性访问可能需要先设置 setAccessible(true) Native层分析需要结合IDA等工具逆向so文件