frida的安装和配置暂略
构造函数的hook
function hooktest(){
var mUser=Java.use("com.alex.javahooktarget.MyUser");
mUser.$init.overload().implementation=function(){
console.log("进入MyUser构造函数");
this.$init();
}
}
在这种条件下注入会发现,一开始点击按钮发现,console并没有出现预期的输出,原因是:
在这个MainActivaty开始的时候已经new了一个MyUser对象,就是说已经调用过构造方法了,这个第一次调用的构造方法并没有Hook上,而SubUser对象继承了MyUser对象,当new一个SubUser对象的时候,会调用父类MyUser的构造方法,这时就可以看到Hook的输出了。
hook重载方法
//Hook重载函数
function hooktest2(){
var subUser=Java.use("com.alex.javahooktarget.SubUser");
subUser.greeting.overload().implementation=function(){
var retval=this.greeting();
console.log("ret: ",retval);
return "Hooked "+retval;
}
}
function main(){
Java.perform(function(){
hooktest();
hooktest2();
})
}
setImmediate(main);
要记得main函数里的调用……还有setImmediate……
hook无参构造
//hook无参数的构造函数
function hooktest3(){
//获取要hook的那个类的实例
var userObj=Java.use("com.alex.javahooktarget.MyUser");
userObj.$init.overload().implementation=function(){
console.log("Hook 到 MyUser无参构造函数");
this.$init();//注意这里使用的是当前这个实例化的对象this
}
}
hook有参构造
//hook有参数的构造方法
function hooktest4(){
var userObj=Java.use("com.alex.javahooktarget.MyUser");
userObj.$init.overload('java.lang.String','java.lang.String','int').implementation=function(str1,str2,int){
console.log("Hook 到 MyUser有参构造函数");
console.log(str1,str2,int);
this.$init(str1,str2,int);
}
}