安卓编写常见的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加密方法获取原始数据
- 通过抓包发现
jsonstr特征 - 追踪到
multipartEntity.addPart方法 - 定位加密方法
com.showself.f.a.a(str2, Utils.h()) - 最终找到加密核心方法
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参数分析
分析点:
- 抓包发现
App-Info参数 - 定位到
AppInfoModel类 - 发现
visitor_sign参数使用MD5加密 - 追踪参数来源
Client.p()和Client.o()
关键发现:
Client.p()返回A:34f770f3177f0146Client.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脚本:
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和AES算法 - 密钥字节数组示例:
51,52,54,54,57,99,54,54,...
深入分析:
- 发现so文件
libjdbitmapkit.so中的签名逻辑 - 定位到JNI方法
Java_com_jingdong_common_utils_BitmapkitUtils_getSignFromJni - 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);
三、关键技巧总结
- 方法定位:从网络请求特征字符串入手,逆向追踪调用链
- 参数获取:通过Hook关键方法打印输入参数和返回值
- 加密分析:重点关注加密算法类和方法
- Native层:当Java层无法找到关键逻辑时,需分析so文件
- 多方法配合:结合构造函数、普通方法和属性Hook全面分析
四、注意事项
- 构造函数Hook使用
$init而非普通方法名 - 重载方法必须指定准确的参数类型
- 对象创建使用
$new方法 - 属性访问可能需要先设置
setAccessible(true) - Native层分析需要结合IDA等工具逆向so文件