frida -U -l hook.js -f com.example.app
frida -U -h hook.js -p target_pid
大部分反编译器支持直接生成Frida Hook 代码
主要函数:
Java.use()
implementation
overload
function hook() {
Java.perform(function() {
let classname = Java.use("com.example.app.class"); // Hook 函数的类名
classname[methodname].overload("Java.lang.String").implementation = function(str) {
// 具体的函数名,参数变量
str = "str"; // 修改参数值
var result = this.methodname(str); // 调用原来的函数
result = "result"; // 修改返回值
return result; // 返回结果
};
});
}
SetImmediate(hook); // 异步调用
Java.choose
function hook() {
Java.perform(function() {
// 调用static 函数
let classname = Java.use("com.example.app.class"); // Hook 函数的类名
classname.setStatic_bool_var();
// 调用非static 函数
let classname = "";
Java.choose("com.example.app.class", {
onMatch: function(obj) { // 每枚举到一次
classname = obj;
},
onComplete() { // 当所有的类都被枚举后
if (classname) {
classname.setBool_var();
}
}
})
})
}
SetImmediate(hook); // 异步调用
设置和函数名相同的成员变量
function hook() {
Java.perform(function() {
// 设置静态成员变量
let classname = Java.use("com.example.app.class"); // Hook 函数的类名
classname.setStatic_bool_var.value = true;
// 调用非静态成员变量
let classname = "";
Java.choose("com.example.app.class", {
onMatch: function(obj) { // 每枚举到一次
classname = obj;
classname.bool_var.value = true; // 没有和函数名相同的变量
classname._same_name_bool_var.value = true; // 和函数名相同的变量需要在变量明前加一个下划线
},
onComplete() {} // 当所有的类都被枚举后
})
})
}
SetImmediate(hook); // 异步调用
hook 内部类需要使用$符号
function hook_InnerClasses() {
Java.perform(function() {
// hook 内部类需要使用$符号
var InnerClasses = Java.use("com.example.app.class$InnerClass");
InnerClasses.methodname.implementation = function() {
return this.methodname();
}
})
}
SetImmediate(hook_InnerClasses())
function hook() {
Java.perform(function() {
Java.enumerateClassLoaders({
onMatch: function(loader) {
// 查找加载对应class的classloder
if (loader.findClass("com.example.app.DynamicClass")) {
Java.classFactory.loader = loader;
}
}, onComplete: function() {}
}
});
console.log(Java.ClassFactory.loader)
// 使用classloader加载目标class
var dynamic = Java.use("com.example.DynamicClass");
consolo.log(dynamic);
dynamic.methodname.implementation = function() {
return this.methodname();
}
})
}
SetImmediate(hook())