問題是SuperSU包含一個與標準GNU su
不兼容的su
二進制文件。
如果你編譯su
與NDK的android,並替換二進制它會好起來的。
您可以使用此代碼:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <pwd.h>
#include <sys/types.h>
#include <string.h>
#include <errno.h>
int main (int ac, char **av, char **env) {
int iret;
if (ac == 1) { // Run /bin/bash as root
iret = setuid(0);
if (iret == -1) {
fprintf(stderr, "This binary is u-s, use chmod u+s %s as root.\n", av[0]);
exit(-1);
}
strcpy(av[0], "/bin/bash");
iret = execve(av[0], av, env);
if (iret == -1) {
fprintf(stderr, "Can't execute a shell.\n");
exit(-1);
}
} else {
struct passwd *pswd = getpwnam(av[1]);
//printf("%d\n", pswd->pw_uid);
if (pswd == NULL) {
fprintf(stderr, "User %s does not exist.\n", av[1]);
exit(-1);
}
iret = setuid(pswd->pw_uid);
if (iret == -1) {
fprintf(stderr, "This binary is u-s, use chmod u+s %s as root.\n", av[0]);
exit(-1);
}
iret = execve(av[2], (char **)&av[2], env);
if (iret == -1) {
fprintf(stderr, "%s\n", strerror(errno));
exit(-1);
}
}
return 0;
}
編譯它,將所有者更改爲根。然後以root身份運行chmod u + s ./su。最後,作爲普通用戶的身份運行命令的時間:
$ ./su系統/斌/慶典-c 「ls -l命令/」