function test(){
Java.perform(function () {
/* 重载方法的hook
public static int getCalc(int i, int i2) {
return i + i2;
}
public static int getCalc(int i, int i2, int i3) {
return i + i2 + i3;
}
public static int getCalc(int i, int i2, int i3, int i4) {
return i + i2 + i3 + i4;
}
} */
var Utils=Java.use("com.dudu.hook.Utils");
Utils.getCalc.overload('int', 'int').implementation=function (a,b) {
console.log("传入参数 - 》 "+a+" "+b);
return this.getCalc(a,b);
}
Utils.getCalc.overload('int', 'int', 'int').implementation=function (a,b,c) {
console.log("传入参数 - 》 "+a+" "+b+" "+c);
return this.getCalc(a,b,c);
}
Utils.getCalc.overload('int', 'int', 'int', 'int').implementation=function (a,b,c,d) {
console.log("传入参数 - 》 "+a+" "+b+" "+c+" "+d);
return this.getCalc(a,b,c,d);
}
})};
setImmediate(function(){
setTimeout(test(), 5000);
});
根据提示加重载的参数
hook方法的所有重载
function test(){
Java.perform(function () {
/* 重载方法的hook
public static int getCalc(int i, int i2) {
return i + i2;
}
public static int getCalc(int i, int i2, int i3) {
return i + i2 + i3;
}
public static int getCalc(int i, int i2, int i3, int i4) {
return i + i2 + i3 + i4;
}
} */
var Utils=Java.use("com.dudu.hook.Utils");
var overloads_Arr =Utils.getCalc.overloads;//通过overloads生成重载方法数组
console.log(overloads_Arr)
for (var i = 0; i <overloads_Arr.length; i++) {
overloads_Arr[i].implementation=function (){//传入的参数为空
var dd="";
for (let j = 0; j < arguments.length; j++) {
dd+=arguments[j]+" ";
console.log(dd);
}
console.log("------------------------------------");
return this.getCalc.apply(this,arguments);
}
}
})};
setImmediate(function(){
setTimeout(test(), 5000);
});
效果如下:
注意arguments的使用,this的指向,以及apply的后面传入的参数
ps:this当实例对象的调用时则指向的就是实例对象,静态方法调用时则this指向的是类,替换成该类也可以;