找到对应的文件:
system/extras/su/su.c
在main函数中,开头我们可以看下以下代码:
uid_t current_uid = getuid(); if (current_uid != AID_ROOT && current_uid != AID_SHELL) error(1, 0, "not allowed");
将其注释掉重新编译系统即可开放安卓系统权限。
int main源码如下:
int main(int argc, char** argv) { /* uid_t current_uid = getuid(); //改变安卓系统权限问题2016.12.5 if (current_uid != AID_ROOT && current_uid != AID_SHELL) error(1, 0, "not allowed"); */ // Handle -h and --help. ++argv; if (*argv && (strcmp(*argv, "--help") == 0 || strcmp(*argv, "-h") == 0)) { fprintf(stderr, "usage: su [UID[,GID[,GID2]...]] [COMMAND [ARG...]]\n" "\n" "Switch to WHO (default 'root') and run the given command (default sh).\n" "\n" "where WHO is a comma-separated list of user, group,\n" "and supplementary groups in that order.\n" "\n"); return 0; } // The default user is root. uid_t uid = 0; gid_t gid = 0; // If there are any arguments, the first argument is the uid/gid/supplementary groups. if (*argv) { gid_t gids[10]; int gids_count = sizeof(gids)/sizeof(gids[0]); extract_uidgids(*argv, &uid, &gid, gids, &gids_count); if (gids_count) { if (setgroups(gids_count, gids)) { error(1, errno, "setgroups failed"); } } ++argv; } if (setgid(gid)) error(1, errno, "setgid failed"); if (setuid(uid)) error(1, errno, "setuid failed"); // Reset parts of the environment. setenv("PATH", _PATH_DEFPATH, 1); unsetenv("IFS"); struct passwd* pw = getpwuid(uid); setenv("LOGNAME", pw->pw_name, 1); setenv("USER", pw->pw_name, 1); // Set up the arguments for exec. char* exec_args[argc + 1]; // Having too much space is fine. size_t i = 0; for (; *argv != NULL; ++i) { exec_args[i] = *argv++; } // Default to the standard shell. if (i == 0) exec_args[i++] = "/system/bin/sh"; exec_args[i] = NULL; execvp(exec_args[0], exec_args); error(1, errno, "failed to exec %s", exec_args[0]); }