首頁(yè)
社區(qū)
課程
招聘
frida中要怎么獲取(構(gòu)建)jclass的類(lèi)引用
ChuXin?. 2022-11-15 1804

有一個(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)有巨巨知道的,不吝賜教一下

收藏
1條回答
Sonshines 2022-12-6

在 Frida 中,您可以使用 Java.use 函數(shù)來(lái)構(gòu)建一個(gè) jclass 的類(lèi)引用。這個(gè)函數(shù)的參數(shù)是您要構(gòu)建類(lèi)引用的類(lèi)的名稱(chēng),例如:

1
var MyClass = Java.use("com.example.MyClass");

上面的代碼將會(huì)構(gòu)建一個(gè)名為 MyClass 的 jclass 類(lèi)引用。您可以使用這個(gè)類(lèi)引用來(lái)訪問(wèn)該類(lèi)的屬性和方法,例如:

1
2
3
4
5
// 訪問(wèn)屬性
console.log(MyClass.someField);
 
// 調(diào)用方法
MyClass.someMethod();

此外,您還可以使用 Frida 的 enumerateLoadedClasses 函數(shù)來(lái)枚舉所有已加載的類(lèi),并獲取它們的 jclass 類(lèi)引用。例如:

1
2
3
4
5
6
7
8
9
Java.enumerateLoadedClasses({
  onMatch: function(className) {
    var clazz = Java.use(className);
    // 在這里處理 clazz
  },
  onComplete: function() {
    // 枚舉完成后的處理
  }
});

上面的代碼會(huì)枚舉所有已加載的類(lèi),并對(duì)每個(gè)類(lèi)調(diào)用 onMatch 函數(shù)。您可以在 onMatch 函數(shù)中獲取每個(gè)類(lèi)的 jclass 類(lèi)引用,并進(jìn)行相應(yīng)的處理。當(dāng)枚舉完所有類(lèi)后,會(huì)調(diào)用 onComplete 函數(shù),您可以在這里處理枚舉完成后的邏輯。

回復(fù)
frida jclass 類(lèi)引用
  參與學(xué)習(xí)     人
  提問(wèn)次數(shù)     100 個(gè)
我的問(wèn)答 領(lǐng)取收益
0
我的提問(wèn)
0
我的回答
0
學(xué)習(xí)收益