frida中要怎么获取(构建)jclass的类引用
有一个native方法如下
1 2 3 4 5 6 | Java_com_xxxxxxxxxx_xxx_xxxxxxxxx_add(
JNIEnv * env,
jclass clazz,
int a3,
int a4,
int a5)
|
函数很简单,内容就是三个数相加,并返回
目的:想通过调用new NativeFunction来主动调用这个native方法
(我知道可以通过Java层来主动调用)
问题:怎么获得jclass或者构建jclass?
思路:
1.通过Java.vm.tryGetEnv()来得到env,然后主动调用封装好的findClass来获得类引用jclass
结果:报错,提示找不到类。通过了解以后知道frida-java所在的线程是通过pthread_create创造的,然后通过AttachCurrentThread获取的JNIEnv,此时FindClass只会从系统的classloader开始查找,所以app自身的类是无法通过env->findClass来获取
2.通过Java.vm.tryGetEnv()来得到env,然后主动调用封装好的getObjectClass来获得类引用jclass
那么我们就需要先获得jobject,jobject的获取比较简单
1 2 | var jobject = Java.use( "com.xxxxxxxxxx.xxx.xxxxxxxxx" ).$new().$h;
console.log( "jobject => " + jobject);
|
实例化一个对象,然后得到的直接就是一个地址,然后用env.getObjectClass来调用
结果:崩溃,直接进程崩溃了,有没有佬知道什么原因的?
3.通过Java.use来获取类引用
Java.use本身返回的应该就是一个类引用,返回的是一个js的object
结果:通过Java.cast将js的object转换成Java的Object后,想着通过写入内存来得到pointer,但是写入的过程中发现两个问题
一个就是Memory.alloc()需要长度,而现在的数据类型是一个Java的Object,怎么确定长度呢?
另一个就是怎么写入?frida提供的API里面并没有直接可以将一个Java的Object写入的方法
最后
(研究这个jclass只是为了学习一下,满足一下好奇心,大佬勿喷)
有没有巨巨知道的,不吝赐教一下