首页
社区
课程
招聘
未解决 [求助]小问题,jni动态注册后在新函数中调用原函数 50.00雪花
发表于: 2023-9-26 21:42 2386

未解决 [求助]小问题,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编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//