首页
社区
课程
招聘
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只是为了学习一下,满足一下好奇心,大佬勿喷)
有没有巨巨知道的,不吝赐教一下

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

在 Frida 中,您可以使用 Java.use 函数来构建一个 jclass 的类引用。这个函数的参数是您要构建类引用的类的名称,例如:

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

上面的代码将会构建一个名为 MyClass 的 jclass 类引用。您可以使用这个类引用来访问该类的属性和方法,例如:

1
2
3
4
5
// 访问属性
console.log(MyClass.someField);
 
// 调用方法
MyClass.someMethod();

此外,您还可以使用 Frida 的 enumerateLoadedClasses 函数来枚举所有已加载的类,并获取它们的 jclass 类引用。例如:

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

上面的代码会枚举所有已加载的类,并对每个类调用 onMatch 函数。您可以在 onMatch 函数中获取每个类的 jclass 类引用,并进行相应的处理。当枚举完所有类后,会调用 onComplete 函数,您可以在这里处理枚举完成后的逻辑。

回复
frida jclass 类引用
  参与学习     人
  提问次数     100 个
我的问答 领取收益
0
我的提问
0
我的回答
0
学习收益