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