有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java允许root用户使用JNI访问Android应用程序的C/C++本机端,这似乎是不可能的

我想让本机代码获得根访问权限,即使Java端正确地拥有根权限。。。这似乎是相当具有挑战性的

示例应用程序:

Java端

[...]
Log.d(TAG, "JAVA ROOT? " + rootManager.runCommand("id -u").getMessage()); // has the process 
root access?
rootTest(); // this is the native C function
Log.d(TAG, "JAVA ROOT? " + rootManager.runCommand("id -u").getMessage()); // check again
[...]

C侧

JNIEXPORT jlong JNICALL Java_com_example_MainActivity_testRoot(JNIEnv* env, jobject obj) {

    FILE *fp;
    char path[1035];

    fp = popen("id -u", "r");
    while (fgets(path, sizeof(path), fp) != NULL) {
        printf("C ROOT?: %s\r\n", path);
    }
    pclose(fp);
    return 0;
}

输出

JAVA ROOT? 0 // -> Yeah, root!
C ROOT?: 10114 // -> :(
JAVA ROOT? 0 // -> Java side still has root.

我不知道为什么,但当进程执行其本机代码时,它会丢失根权限。 这是出于某种安全原因吗? 如果是,可以禁用它吗


共 (1) 个答案

  1. # 1 楼答案

    您不能使用rootManager.runCommand将进程或线程神奇地提升到root。您所能做的最好的事情就是生成一个不同的进程(这就是runCommand所做的)作为root,并使用各种IPC机制与之对话