java hook方法_frida-Java层代码Hook

Hook构造方法

要hook的是一个类的构造函数1

2

3

4

5

6public class Utils{

public static Money getMoney(){

return new Money(60, "RMB");

}

...

}

我们可以通过$init来获取并修改一个类的构造方法。(注意,js是弱类型语言,而Java强类型,注意构造的时候的类型转换。)

获取参数可以通过自定义参数名也可以直接用系统隐含的arguments变量获取即可

下面是jscode1

2

3

4

5

6

7

8var money=Java.use("com.XXXX.app.Money");

money.$init.implementation = function(a, b)

{

console.log("Hook Start...");

send(arguments[0]);

send(arguments[1]);

return this.$init(a,b);

}

Hook重载方法

要hook的重载方法1

2

3

4

5

6

7

8

9

10public class Utils{

public static String test(){

return "this is test without argument";

}

public static String test(int num){

return "this is test with num "+num;

}

...

}

在方法后面加一个overload属性,参数为函数的类型,类型用字符串传入,用于指定具体要hook的方法。例如utils.test.overload("int").implementation。

注意,要填写类的路径,例如如果是字符串类型,则要用overload("int","java.lang.String")

jscode:1

2

3

4

5

6

7utils.test.overload("int").implementation = function(a)

{

console.log("Hook Start...");

send(arguments[0]);

console.log("Hook Success...");

return "This overload func is hooked";

}

Hook对象参数的构造

要hook的以对象为参数的方法1

2

3

4

5

6

7

8package com.XXXX.app;

public class Utils{

public static String test(Money money){

return money.getInfo();

}

....

}

这里我们使用一个类型的$new来实例化一个类

jscode:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16jscode = """

Java.perform(function(){

var utils = Java.use("com.XXXX.app.Utils");

var money=Java.use("com.XXXX.app.Money");

utils.test.overload("com.XXXX.app.Money").implementation = function(a)

{

console.log("Hook Start...");

send(a.getInfo());

var m = money.$new(6666,"DOLLAR");

send(m.getInfo());

return m.getInfo();

//return this.test(m);

}

});

"""

修改对象属性的值

常规方法如果obj.Attr的话,获取到的还是对象,例如a.name的返回值是[*] {'value': '美元', 'fieldType': 2, 'fieldReturnType': {'className': 'java.lang.String', 'name': 'Ljava/lang/String;', 'type': 'pointer', 'size': 1}} [*] 美元

我们使用a.name.value就能获取对象属性的值了。

例如1

2

3

4

5

6

7

8

9

10

11utils.test.overload("com.xiaojianbang.app.Money").implementation = function(a)

{

console.log("Hook Start...");

send(a.name); //object

send(a.name.value); //real value

var m = money.$new(6666,"DOLLAR");

m.name.value="ForeignMoney";

send(m.getInfo());

return m.getInfo();

//return this.test(m);

}

Java反射

对于私有属性,我们可以用Java反射的方法设置。

在Java反射中,通过Java.cast(m.getClass(),clazz).getDeclaredField('num'),m为一个实例化对象,后面getDeclaredField可以获得属性。通过Java.use('java.lang.Class');获取类的构造器

这里,通过属性的get(ObjectsInstantiated)可以获取值,通过属性的setInt(ObjectsInstantiated,value)可以设置一个对象的属性值。ObjectsInstantiated为一个对象。

这里,对于反射后的值,用console.log可以很好的输出值,而send在此处会打印对象。1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19Java.perform(function(){

var utils = Java.use("com.XXXX.app.Utils");

var money=Java.use("com.XXXX.app.Money");

utils.test.overload("com.XXXX.app.Money").implementation = function(a)

{

console.log("Hook Start...");

var m = money.$new(6666,"DOLLAR");

var clazz = Java.use('java.lang.Class');

var num_id = Java.cast(m.getClass(),clazz).getDeclaredField('num');

num_id.setAccessible(true);

var value = num_id.get(m);

console.log(value);

send(value); // have format problem

num_id.setInt(m,23333);

console.log(num_id.get(m));

return this.test(m);

}

});

Hook内部类

要hook的内部类。

在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。1

2

3

4

5

6

7

8

9

10

11

12

13class Circle{

double radius = 0;

public Circle(double radius){

this.radius = radius;

}

class Draw{ //内部类

public void drawSahpe(){

System.out.println("drawshape");

}

}

}

在获取要hook的类后加$和内部类名。1

2

3

4

5

6var inInnerClass = Java.use('com.XXXX.app.Circle$Draw');

inInnerClass.drawSahpe.implementation = function()

{

...

}

打印方法堆栈信息

用Java.use方法获取类型变量:var Exception = Java.use(“java.lang.Exception”)

然后是js中支持throw语法的,直接在需要打印堆栈信息的方法中调用即可。1

2

3

4

5AndroidLog = Java.use("android.util.Log")

AndroidException = Java.use("java.lang.Exception")

function printStackTrace(){

console.log(AndroidLog .getStackTraceString(AndroidException .$new()));

}

总结

Java层代码Hook操作1、hook方法包括构造方法和对象方法,构造方法固定写法是$init,普通方法直接是方法名,参数可以自己定义也可以使用系统隐含的变量arguments获取。

2、修改方法的参数和返回值,直接调用原始方法通过传入想要修改的参数来做到修改参数的目的,以及修改返回值即可。

3、构造对象和修改对象的属性值,直接用反射进行操作,构造对象用固定写法的$new即可。

4、直接用Java的Exception对象打印堆栈信息,然后通过adb logcat -s AndroidRuntime来查看异常信息跟踪代码。

总结:获取对象的类类型是Java.use方法,方法有重载的话用overload(…….)解决。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值