2016-12-30 19:44:24 +01:00
|
|
|
#include "magiskhide.h"
|
|
|
|
|
|
|
|
char **file_to_str_arr(FILE *fp, int *size) {
|
|
|
|
int allocated = 16;
|
|
|
|
char *line = NULL, **array;
|
|
|
|
size_t len = 0;
|
|
|
|
ssize_t read;
|
|
|
|
|
|
|
|
array = (char **) malloc(sizeof(char*) * allocated);
|
|
|
|
|
|
|
|
*size = 0;
|
|
|
|
while ((read = getline(&line, &len, fp)) != -1) {
|
|
|
|
if (*size >= allocated) {
|
|
|
|
// Double our allocation and re-allocate
|
|
|
|
allocated *= 2;
|
|
|
|
array = (char **) realloc(array, sizeof(char*) * allocated);
|
|
|
|
}
|
|
|
|
// Remove end newline
|
|
|
|
if (line[read - 1] == '\n') {
|
|
|
|
line[read - 1] = '\0';
|
|
|
|
}
|
|
|
|
array[*size] = line;
|
|
|
|
line = NULL;
|
|
|
|
++(*size);
|
|
|
|
}
|
|
|
|
return array;
|
|
|
|
}
|
|
|
|
|
|
|
|
void read_namespace(const int pid, char* target, const size_t size) {
|
|
|
|
char path[32];
|
|
|
|
snprintf(path, sizeof(path), "/proc/%d/ns/mnt", pid);
|
|
|
|
ssize_t len = readlink(path, target, size);
|
|
|
|
target[len] = '\0';
|
|
|
|
}
|
|
|
|
|
|
|
|
void lazy_unmount(const char* mountpoint) {
|
|
|
|
if (umount2(mountpoint, MNT_DETACH) != -1)
|
|
|
|
fprintf(logfile, "MagiskHide: Unmounted (%s)\n", mountpoint);
|
|
|
|
else
|
|
|
|
fprintf(logfile, "MagiskHide: Unmount Failed (%s)\n", mountpoint);
|
|
|
|
}
|
|
|
|
|
|
|
|
void run_as_daemon() {
|
|
|
|
switch(fork()) {
|
|
|
|
case -1:
|
|
|
|
exit(-1);
|
|
|
|
case 0:
|
|
|
|
if (setsid() < 0)
|
|
|
|
exit(-1);
|
|
|
|
close(STDIN_FILENO);
|
|
|
|
close(STDOUT_FILENO);
|
|
|
|
close(STDERR_FILENO);
|
|
|
|
logfile = fopen(LOGFILE, "a+");
|
|
|
|
setbuf(logfile, NULL);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
exit(0);
|
|
|
|
}
|
2017-02-05 16:42:17 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void manage_selinux() {
|
|
|
|
char *argv[] = { SEPOLICY_INJECT, "--live", "permissive *", NULL };
|
2017-03-28 20:23:10 +02:00
|
|
|
char val[1];
|
2017-02-05 16:42:17 +01:00
|
|
|
int fd, ret;
|
2017-03-28 20:23:10 +02:00
|
|
|
fd = open(ENFORCE_FILE, O_RDWR);
|
2017-02-05 16:42:17 +01:00
|
|
|
if (fd < 0)
|
|
|
|
return;
|
2017-03-28 20:23:10 +02:00
|
|
|
if (read(fd, val, 1) < 1)
|
2017-02-05 16:42:17 +01:00
|
|
|
return;
|
2017-03-28 20:23:10 +02:00
|
|
|
lseek(fd, 0, SEEK_SET);
|
2017-02-05 16:42:17 +01:00
|
|
|
// Permissive
|
2017-03-28 20:23:10 +02:00
|
|
|
if (val[0] == '0') {
|
|
|
|
|
|
|
|
fprintf(logfile, "MagiskHide: Permissive detected\n");
|
|
|
|
|
|
|
|
if (write(fd, "1", 1) < 1)
|
|
|
|
return;
|
|
|
|
lseek(fd, 0, SEEK_SET);
|
|
|
|
|
|
|
|
if (read(fd, val, 1) < 1)
|
2017-02-05 16:42:17 +01:00
|
|
|
return;
|
2017-03-28 20:23:10 +02:00
|
|
|
lseek(fd, 0, SEEK_SET);
|
2017-02-05 16:42:17 +01:00
|
|
|
close(fd);
|
2017-03-28 20:23:10 +02:00
|
|
|
|
|
|
|
if (val[0] == '0') {
|
|
|
|
fprintf(logfile, "MagiskHide: Unable to set to enforce, hide the state\n");
|
|
|
|
chmod(ENFORCE_FILE, 0640);
|
|
|
|
chmod(POLICY_FILE, 0440);
|
2017-02-05 16:42:17 +01:00
|
|
|
return;
|
2017-03-28 20:23:10 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
fprintf(logfile, "MagiskHide: Calling magiskpolicy for pseudo enforce mode\n");
|
|
|
|
|
2017-02-05 16:42:17 +01:00
|
|
|
switch(fork()) {
|
|
|
|
case -1:
|
|
|
|
return;
|
|
|
|
case 0:
|
|
|
|
execvp(argv[0], argv);
|
|
|
|
default:
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|