使用 JNI 授予对 Android 应用程序的 C/C++ 本机端的 root 访问权限,这似乎是不可能的
Give root access to C/C++ native side of an Android application using JNI, it seems to be impossible
我想让本机代码获得 root 访问权限,即使 Java 端正确地具有 root 权限...这似乎非常具有挑战性。
示例应用程序:
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.
不知道为什么,进程执行他的native代码的时候,就失去了root权限。
这是出于某种安全原因吗?
如果是,是否可以禁用?
您不能使用 rootManager.runCommand
神奇地将您的进程或线程提升为根。您能做的最好的事情就是以 root 身份生成一个不同的进程(这就是 runCommand
所做的)并使用各种 IPC 机制与其对话。
我想让本机代码获得 root 访问权限,即使 Java 端正确地具有 root 权限...这似乎非常具有挑战性。
示例应用程序:
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.
不知道为什么,进程执行他的native代码的时候,就失去了root权限。 这是出于某种安全原因吗? 如果是,是否可以禁用?
您不能使用 rootManager.runCommand
神奇地将您的进程或线程提升为根。您能做的最好的事情就是以 root 身份生成一个不同的进程(这就是 runCommand
所做的)并使用各种 IPC 机制与其对话。