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創(chuàng)造的,,然后通過AttachCurrentThread獲取的JNIEnv,,此時FindClass只會從系統(tǒng)的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,,但是寫入的過程中發(fā)現兩個問題
一個就是Memory.alloc()需要長度,而現在的數據類型是一個Java的Object,,怎么確定長度呢,?
另一個就是怎么寫入?frida提供的API里面并沒有直接可以將一個Java的Object寫入的方法
最后
(研究這個jclass只是為了學習一下,,滿足一下好奇心,,大佬勿噴)
有沒有巨巨知道的,,不吝賜教一下