-
-
未解决 [求助]小问题,jni动态注册后在新函数中调用原函数 50.00雪花
-
发表于: 2023-9-26 21:42 2386
-
可以看看这个文章,https://bbs.kanxue.com/thread-276068.htm, 文章最后是关于“动态注册”的代码,我遇到的情况是,可以正常勾到函数,并且能正常的走到自定义函数里边,但是查了很多资料,始终无法实现在自定义函数中调用原函数。文章的源码和我的类似,基本上都跑通了,就是在调用原函数时,不知道如何编写。我试了在 JNI_OnLoad中,保存原始的jmethodID到全局变量中:
jmethodID originalMethodID = env->GetStaticMethodID(clazzC3, "Init", "(Ljava/lang/Object;Lorg/json/JSONObject;)V"); gOriginalConstructorJsonMethodID = originalMethodID;
然后在新函数中调用:
env->CallStaticVoidMethod(clazz, gOriginalConstructorJsonMethodID, obj, jSONObject);
但是这种写法不行,由于是逆向,不知道怎么动态调试so源码,这种写法,用frida打印了一下so内部函数的调用情况,发现只要勾到以后,会一直在自己写的so里边循环,不知道为什么。望请指教。
附上那个链接里边的动态注册源码:
// app\src\main\cpp\dynamic.c #include <jni.h> // 必须引入jni.h的头文件,因为后面声明的方法中,会引用到jni.h中的类型; #include <syslog.h> // native层要用syslog()输出日志 jint add(JNIEnv *env, jobject obj, jint v1, jint v2) { syslog(LOG_ERR, "v7() = %d", (v1 + v2)); return v1 + v2; } jint sub(JNIEnv *env, jobject obj, jint v1, jint v2) { syslog(LOG_ERR, "v8() = %d", (v1 *- v2)); return v1 - v2; } // 描述C语言的函数和Java层native方法的对应关系的数组 static JNINativeMethod gMethods[] = { // java层方法 方法签名 c/c++函数 {"v8", "(II)I", (void *) sub}, {"v7", "(II)I", (void *) add}, }; JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { // 加载.so时候,先执行这个JNI_OnLoad方法 JNIEnv *env = NULL; // 在java虚拟机中获取env if ((*vm)->GetEnv(vm, (void **) &env, JNI_VERSION_1_6) != JNI_OK) { return JNI_ERR; } // 找到Java中的类 jclass clazz = (*env)->FindClass(env, "com/example/ndk_jin01/MainActivity"); // 将类中的方法注册到JNI中 (RegisterNatives) int res = (*env)->RegisterNatives(env, clazz, gMethods, 1); // 第三个参数时描述了描述C语言的函数和Java层native方法的对应关系的数组 if (res < 0) { return JNI_ERR; } return JNI_VERSION_1_6; }
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2023-9-27 11:58
被flashgg编辑
,原因:
赞赏
他的文章
看原图
赞赏
雪币:
留言: