frida中要怎么獲取(構(gòu)建)jclass的類引用
有一個native方法如下
1 2 3 4 5 6 | Java_com_xxxxxxxxxx_xxx_xxxxxxxxx_add(
JNIEnv * env,
jclass clazz,
int a3,
int a4,
int a5)
|
函數(shù)很簡單,內(nèi)容就是三個數(shù)相加,并返回
目的:想通過調(diào)用new NativeFunction來主動調(diào)用這個native方法
(我知道可以通過Java層來主動調(diào)用)
問題:怎么獲得jclass或者構(gòu)建jclass?
思路:
1.通過Java.vm.tryGetEnv()來得到env,然后主動調(diào)用封裝好的findClass來獲得類引用jclass
結(jié)果:報錯,提示找不到類。通過了解以后知道frida-java所在的線程是通過pthread_create創(chuàng)造的,然后通過AttachCurrentThread獲取的JNIEnv,此時FindClass只會從系統(tǒng)的classloader開始查找,所以app自身的類是無法通過env->findClass來獲取
2.通過Java.vm.tryGetEnv()來得到env,然后主動調(diào)用封裝好的getObjectClass來獲得類引用jclass
那么我們就需要先獲得jobject,jobject的獲取比較簡單
1 2 | var jobject = Java.use( "com.xxxxxxxxxx.xxx.xxxxxxxxx" ).$new().$h;
console.log( "jobject => " + jobject);
|
實(shí)例化一個對象,然后得到的直接就是一個地址,然后用env.getObjectClass來調(diào)用
結(jié)果:崩潰,直接進(jìn)程崩潰了,有沒有佬知道什么原因的?
3.通過Java.use來獲取類引用
Java.use本身返回的應(yīng)該就是一個類引用,返回的是一個js的object
結(jié)果:通過Java.cast將js的object轉(zhuǎn)換成Java的Object后,想著通過寫入內(nèi)存來得到pointer,但是寫入的過程中發(fā)現(xiàn)兩個問題
一個就是Memory.alloc()需要長度,而現(xiàn)在的數(shù)據(jù)類型是一個Java的Object,怎么確定長度呢?
另一個就是怎么寫入?frida提供的API里面并沒有直接可以將一個Java的Object寫入的方法
最后
(研究這個jclass只是為了學(xué)習(xí)一下,滿足一下好奇心,大佬勿噴)
有沒有巨巨知道的,不吝賜教一下