admin 发表于 2020-5-31 15:18:20

frida java 反射

1、hook类构造方法var targetClass = Java.use("com.eumnq.app.XXXX");
targetClass.$init.implementation = function(a,b){
console.log("hook start...");
send(arguments);
send(arguments);
return this.$init(a,b);
}


2、hook类的重载方法
在方法后面加一个overload属性,参数为函数的类型,类型用字符串传入,用于指定具体要hook的方法。例如XXXX.test.overload("int").implementation。
注意,要填写类的路径,例如如果是字符串类型,则要用overload("int","java.lang.String")
XXXX.test.overload('int').implementation = function(a){
console.log('hook start...');
send(arguments);
console.log('hook success...');
return 'this overload func is hooked';
}



3、hook对象参数的构造
使用一个类型的$new来实例化一个类对象


4、修改对象属性值
【公有属性】
如果obj.Attr获取到的还是对象,例如a.name的返回值是 {'value': '美元', 'fieldType': 2, 'fieldReturnType': {'className': 'java.lang.String', 'name': 'Ljava/lang/String;', 'type': 'pointer', 'size': 1}} 美元
这个时候使用a.name.value就能获取对象属性的值了。
【私有属性或者保护属性】
可以用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在此处会打印对象。

Java.perform(function(){
    var testutils = Java.use('com.eumnq.app.Utils');
    var XXXX = Java.use('com.eumnq.app.XXXX');
    testutils.test.overload('com.eumnq.app.XXXX').implementation = function(a){
      console.log('hook start...');
      var m = XXXX.$new(6666,"RMB");
      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);
      num_id.setInt(m,23333);
      console.log(num_id.get(m));
      return this.test(m);
    }
}
);

5、获取frida js里一个对象类型Object.prototype.toString.call(jsobj)//返回代表一个字符串 代表一个对象



页: [1]
查看完整版本: frida java 反射