1. function test(){
  2. Java.perform(function () {
  3. /* 重载方法的hook
  4. public static int getCalc(int i, int i2) {
  5. return i + i2;
  6. }
  7. public static int getCalc(int i, int i2, int i3) {
  8. return i + i2 + i3;
  9. }
  10. public static int getCalc(int i, int i2, int i3, int i4) {
  11. return i + i2 + i3 + i4;
  12. }
  13. } */
  14. var Utils=Java.use("com.dudu.hook.Utils");
  15. Utils.getCalc.overload('int', 'int').implementation=function (a,b) {
  16. console.log("传入参数 - 》 "+a+" "+b);
  17. return this.getCalc(a,b);
  18. }
  19. Utils.getCalc.overload('int', 'int', 'int').implementation=function (a,b,c) {
  20. console.log("传入参数 - 》 "+a+" "+b+" "+c);
  21. return this.getCalc(a,b,c);
  22. }
  23. Utils.getCalc.overload('int', 'int', 'int', 'int').implementation=function (a,b,c,d) {
  24. console.log("传入参数 - 》 "+a+" "+b+" "+c+" "+d);
  25. return this.getCalc(a,b,c,d);
  26. }
  27. })};
  28. setImmediate(function(){
  29. setTimeout(test(), 5000);
  30. });

image.png
根据提示加重载的参数

hook方法的所有重载

  1. function test(){
  2. Java.perform(function () {
  3. /* 重载方法的hook
  4. public static int getCalc(int i, int i2) {
  5. return i + i2;
  6. }
  7. public static int getCalc(int i, int i2, int i3) {
  8. return i + i2 + i3;
  9. }
  10. public static int getCalc(int i, int i2, int i3, int i4) {
  11. return i + i2 + i3 + i4;
  12. }
  13. } */
  14. var Utils=Java.use("com.dudu.hook.Utils");
  15. var overloads_Arr =Utils.getCalc.overloads;//通过overloads生成重载方法数组
  16. console.log(overloads_Arr)
  17. for (var i = 0; i <overloads_Arr.length; i++) {
  18. overloads_Arr[i].implementation=function (){//传入的参数为空
  19. var dd="";
  20. for (let j = 0; j < arguments.length; j++) {
  21. dd+=arguments[j]+" ";
  22. console.log(dd);
  23. }
  24. console.log("------------------------------------");
  25. return this.getCalc.apply(this,arguments);
  26. }
  27. }
  28. })};
  29. setImmediate(function(){
  30. setTimeout(test(), 5000);
  31. });

效果如下:
image.png

注意arguments的使用,this的指向,以及apply的后面传入的参数
ps:this当实例对象的调用时则指向的就是实例对象,静态方法调用时则this指向的是类,替换成该类也可以;