Kill target processes properly

This commit is contained in:
topjohnwu 2018-11-27 01:21:59 -05:00
parent 7e6b5363f1
commit e8cba3524e
3 changed files with 38 additions and 21 deletions

View File

@ -15,6 +15,9 @@
#include "daemon.h" #include "daemon.h"
#include "db.h" #include "db.h"
#define SAFETYNET_COMPONENT "com.google.android.gms/.droidguard.DroidGuardService"
#define SAFETYNET_PROCESS "com.google.android.gms.unstable"
Vector<CharArray> hide_list; Vector<CharArray> hide_list;
pthread_mutex_t list_lock; pthread_mutex_t list_lock;
@ -58,6 +61,14 @@ void hide_sensitive_props() {
} }
} }
static bool is_digits(const char *s) {
for (const char *c = s; *c; ++c) {
if (*c < '0' || *c > '9')
return false;
}
return true;
}
static void ps(void (*cb)(int, void*), void *arg) { static void ps(void (*cb)(int, void*), void *arg) {
DIR *dir; DIR *dir;
struct dirent *entry; struct dirent *entry;
@ -66,18 +77,18 @@ static void ps(void (*cb)(int, void*), void *arg) {
return; return;
while ((entry = xreaddir(dir))) { while ((entry = xreaddir(dir))) {
if (entry->d_type == DT_DIR && is_num(entry->d_name)) if (entry->d_type == DT_DIR && is_digits(entry->d_name))
cb(atoi(entry->d_name), arg); cb(atoi(entry->d_name), arg);
} }
closedir(dir); closedir(dir);
} }
static bool check_proc_name(int pid, const char *name) { static bool proc_name_match(int pid, const char *name) {
char buf[4019]; char buf[4019];
FILE *f; FILE *f;
sprintf(buf, "/proc/%d/comm", pid); sprintf(buf, "/proc/%d/comm", pid);
if ((f = fopen(buf, "r"))) { if ((f = fopen(buf, "re"))) {
fgets(buf, sizeof(buf), f); fgets(buf, sizeof(buf), f);
if (strcmp(buf, name) == 0) if (strcmp(buf, name) == 0)
return true; return true;
@ -88,7 +99,7 @@ static bool check_proc_name(int pid, const char *name) {
fclose(f); fclose(f);
sprintf(buf, "/proc/%d/cmdline", pid); sprintf(buf, "/proc/%d/cmdline", pid);
if ((f = fopen(buf, "r"))) { if ((f = fopen(buf, "re"))) {
fgets(buf, sizeof(buf), f); fgets(buf, sizeof(buf), f);
if (strcmp(basename(buf), name) == 0) if (strcmp(basename(buf), name) == 0)
return true; return true;
@ -99,15 +110,16 @@ static bool check_proc_name(int pid, const char *name) {
fclose(f); fclose(f);
sprintf(buf, "/proc/%d/exe", pid); sprintf(buf, "/proc/%d/exe", pid);
if (access(buf, F_OK) != 0) ssize_t len;
if ((len = readlink(buf, buf, sizeof(buf))) < 0)
return false; return false;
xreadlink(buf, buf, sizeof(buf)); buf[len] = '\0';
return strcmp(basename(buf), name) == 0; return strcmp(basename(buf), name) == 0;
} }
static void kill_proc_cb(int pid, void *v) { static void kill_proc_cb(int pid, void *v) {
ps_arg *args = static_cast<ps_arg *>(v); ps_arg *args = static_cast<ps_arg *>(v);
if (check_proc_name(pid, args->name)) if (proc_name_match(pid, args->name))
kill(pid, SIGTERM); kill(pid, SIGTERM);
else if (args->uid > 0) { else if (args->uid > 0) {
char buf[64]; char buf[64];
@ -121,15 +133,29 @@ static void kill_proc_cb(int pid, void *v) {
} }
static void kill_process(const char *name) { static void kill_process(const char *name) {
ps_arg args = { .name = name }; ps_arg args;
char *slash = nullptr;
if (strcmp(name, SAFETYNET_COMPONENT) == 0) {
// We do NOT want to kill gms, it will cause massive system crashes
args.name = SAFETYNET_PROCESS;
} else {
// Only leave the package name part of component name temporarily
slash = strchr((char *)name, '/');
if (slash)
*slash = '\0';
args.name = name;
}
struct stat st; struct stat st;
int fd = xopen("/data/data", O_RDONLY | O_CLOEXEC); int fd = xopen("/data/data", O_RDONLY | O_CLOEXEC);
if (fstatat(fd, name, &st, 0) == 0) if (fstatat(fd, args.name, &st, 0) == 0)
args.uid = st.st_uid; args.uid = st.st_uid;
else else
args.uid = 0; args.uid = 0;
close(fd); close(fd);
ps(kill_proc_cb, &args); ps(kill_proc_cb, &args);
// Revert back to component name
if (slash)
*slash = '/';
} }
void clean_magisk_props() { void clean_magisk_props() {
@ -209,6 +235,7 @@ int rm_list(int client) {
static int collect_list(void *, int, char **data, char**) { static int collect_list(void *, int, char **data, char**) {
LOGI("hide_list: [%s]\n", data[0]); LOGI("hide_list: [%s]\n", data[0]);
hide_list.push_back(data[0]); hide_list.push_back(data[0]);
kill_process(data[0]);
return 0; return 0;
} }
@ -268,8 +295,8 @@ int launch_magiskhide(int client) {
goto error; goto error;
// Add SafetyNet by default // Add SafetyNet by default
rm_list("com.google.android.gms.unstable"); rm_list(SAFETYNET_PROCESS);
add_list("com.google.android.gms/.droidguard.DroidGuardService"); add_list(SAFETYNET_COMPONENT);
// Get thread reference // Get thread reference
proc_monitor_thread = pthread_self(); proc_monitor_thread = pthread_self();

View File

@ -93,7 +93,6 @@ unsigned get_shell_uid();
unsigned get_system_uid(); unsigned get_system_uid();
unsigned get_radio_uid(); unsigned get_radio_uid();
ssize_t fdgets(char *buf, size_t size, int fd); ssize_t fdgets(char *buf, size_t size, int fd);
int is_num(const char *s);
int exec_command_sync(const char *argv0, ...); int exec_command_sync(const char *argv0, ...);
int fork_dont_care(); int fork_dont_care();
void gen_rand_str(char *buf, int len); void gen_rand_str(char *buf, int len);

View File

@ -39,15 +39,6 @@ unsigned get_radio_uid() {
return ppwd->pw_uid; return ppwd->pw_uid;
} }
/* Check if the string only contains digits */
int is_num(const char *s) {
int len = strlen(s);
for (int i = 0; i < len; ++i)
if (s[i] < '0' || s[i] > '9')
return 0;
return 1;
}
/* Read a whole line from file descriptor */ /* Read a whole line from file descriptor */
ssize_t fdgets(char *buf, const size_t size, int fd) { ssize_t fdgets(char *buf, const size_t size, int fd) {
ssize_t len = 0; ssize_t len = 0;