mirror of
https://github.com/topjohnwu/Magisk.git
synced 2025-04-15 14:41:24 +00:00
113 lines
2.8 KiB
C
113 lines
2.8 KiB
C
#include "magiskhide.h"
|
|
|
|
int hideMagisk() {
|
|
close(pipefd[1]);
|
|
|
|
int pid, zygote_num = 0;
|
|
char cache_block[256], zygote_ns[2][32];
|
|
cache_block[0] = '\0';
|
|
|
|
// Set to the top priority
|
|
setpriority(PRIO_PROCESS, 0, -20);
|
|
|
|
// Get the mount namespace of zygote
|
|
FILE *p = popen("/data/busybox/ps | grep zygote | grep -v grep", "r");
|
|
while(fgets(buffer, sizeof(buffer), p)) {
|
|
if (zygote_num == 2) break;
|
|
sscanf(buffer, "%d", &pid);
|
|
read_namespace(pid, zygote_ns[zygote_num], 32);
|
|
++zygote_num;
|
|
}
|
|
pclose(p);
|
|
|
|
for (i = 0; i < zygote_num; ++i)
|
|
fprintf(logfile, "Zygote(%d) ns=%s ", i, zygote_ns[i]);
|
|
fprintf(logfile, "\n");
|
|
|
|
while(1) {
|
|
read(pipefd[0], &pid, sizeof(pid));
|
|
// Termination called
|
|
if(pid == -1) break;
|
|
|
|
int badns, fd;
|
|
while(1) {
|
|
badns = 0;
|
|
read_namespace(pid, buffer, 32);
|
|
printf("%s\n", buffer);
|
|
for (i = 0; i < zygote_num; ++i) {
|
|
if (strcmp(buffer, zygote_ns[i]) == 0) {
|
|
usleep(500);
|
|
badns = 1;
|
|
break;
|
|
}
|
|
}
|
|
if (!badns) break;
|
|
}
|
|
|
|
// Send pause signal ASAP
|
|
if (kill(pid, SIGSTOP) == -1) continue;
|
|
|
|
fprintf(logfile, "ns=%s)\n", buffer);
|
|
|
|
snprintf(buffer, sizeof(buffer), "/proc/%d/ns/mnt", pid);
|
|
if((fd = open(buffer, O_RDONLY)) == -1) continue; // Maybe process died..
|
|
if(setns(fd, 0) == -1) {
|
|
fprintf(logfile, "MagiskHide: Unable to change namespace for pid=%d\n", pid);
|
|
continue;
|
|
}
|
|
close(fd);
|
|
|
|
snprintf(buffer, sizeof(buffer), "/proc/%d/mounts", pid);
|
|
FILE *mount_fp = fopen(buffer, "r");
|
|
if (mount_fp == NULL) {
|
|
fprintf(logfile, "MagiskHide: Error opening mount list!\n");
|
|
continue;
|
|
}
|
|
|
|
int mount_size;
|
|
char **mount_list = file_to_str_arr(mount_fp, &mount_size);
|
|
|
|
// Find the cache block name if not found yet
|
|
if (strlen(cache_block) == 0) {
|
|
for(i = 0; i < mount_size; ++i) {
|
|
if (strstr(mount_list[i], " /cache ")) {
|
|
sscanf(mount_list[i], "%256s", cache_block);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// First unmount the dummy skeletons and the cache mounts
|
|
for(i = mount_size - 1; i >= 0; --i) {
|
|
if (strstr(mount_list[i], "tmpfs /system/") || strstr(mount_list[i], "tmpfs /vendor/")
|
|
|| (strstr(mount_list[i], cache_block) && strstr(mount_list[i], "/system")) ) {
|
|
sscanf(mount_list[i], "%*s %512s", buffer);
|
|
lazy_unmount(buffer);
|
|
}
|
|
free(mount_list[i]);
|
|
}
|
|
free(mount_list);
|
|
|
|
// Re-read mount infos
|
|
fseek(mount_fp, 0, SEEK_SET);
|
|
mount_list = file_to_str_arr(mount_fp, &mount_size);
|
|
fclose(mount_fp);
|
|
|
|
// Unmount loop mounts
|
|
for(i = mount_size - 1; i >= 0; --i) {
|
|
if (strstr(mount_list[i], "/dev/block/loop") && !strstr(mount_list[i], DUMMYPATH)) {
|
|
sscanf(mount_list[i], "%*s %512s", buffer);
|
|
lazy_unmount(buffer);
|
|
}
|
|
free(mount_list[i]);
|
|
}
|
|
free(mount_list);
|
|
|
|
// Send resume signal
|
|
kill(pid, SIGCONT);
|
|
}
|
|
|
|
// Should never go here
|
|
return 1;
|
|
}
|