Commit 24da3485 authored by Park Ju Hyung's avatar Park Ju Hyung Committed by John Wu

Hardcode GMS unstable to MagiskHide

With the new detection method, it is impossible to check for components.

Remove additional checks for components and simply hardcode string to
proc_monitor.cpp and query cmdline to see if it's GMS unstable.

This addresses wasted resources on applying custom namespace
on all GMS processes.
Signed-off-by: 's avatarPark Ju Hyung <qkrwngud825@gmail.com>
parent 7384d2d3
......@@ -17,9 +17,6 @@
using namespace std;
#define SAFETYNET_COMPONENT "com.google.android.gms/.droidguard.DroidGuardService"
#define SAFETYNET_PROCESS "com.google.android.gms.unstable"
vector<string> hide_list;
pthread_mutex_t list_lock;
......@@ -305,7 +302,8 @@ int launch_magiskhide(int client) {
// Add SafetyNet by default
rm_list(SAFETYNET_PROCESS);
add_list(SAFETYNET_COMPONENT);
rm_list(SAFETYNET_COMPONENT);
add_list(SAFETYNET_PKG);
// Get thread reference
proc_monitor_thread = pthread_self();
......
......@@ -9,6 +9,10 @@
#define TERM_THREAD SIGUSR1
#define SAFETYNET_COMPONENT "com.google.android.gms/.droidguard.DroidGuardService"
#define SAFETYNET_PROCESS "com.google.android.gms.unstable"
#define SAFETYNET_PKG "com.google.android.gms"
// Daemon entries
int launch_magiskhide(int client);
int stop_magiskhide();
......
......@@ -84,6 +84,25 @@ static inline uid_t get_uid(const int pid) {
return st.st_uid;
}
static bool is_pid_safetynet_process(const int pid) {
char path[32];
char buf[64];
int fd;
ssize_t len;
sprintf(path, "/proc/%d/cmdline", pid);
fd = open(path, O_RDONLY);
if (fd == -1)
return false;
len = read(fd, buf, sizeof(buf));
close(fd);
if (len == -1)
return false;
return !strcmp(buf, SAFETYNET_PROCESS);
}
static void hide_daemon(int pid) {
LOGD("hide_daemon: handling pid=[%d]\n", pid);
......@@ -147,6 +166,8 @@ static DIR *dfd;
static unordered_map<int, uint64_t> pid_ns_map;
// Use set for slow insertion but fast searching(which we'd encounter a lot more)
static set<uid_t> hide_uid;
// Treat GMS separately as we're only interested in one component
static int gms_uid = -1;
static void detect_new_processes() {
struct dirent *dp;
......@@ -187,6 +208,14 @@ static void detect_new_processes() {
}
if (hide) {
if (uid == gms_uid) {
// Check /proc/uid/cmdline to see if it's SAFETYNET_PROCESS
if (!is_pid_safetynet_process(pid))
continue;
LOGI("proc_monitor: found %s\n", SAFETYNET_PROCESS);
}
// Send pause signal ASAP
if (kill(pid, SIGSTOP) == -1)
continue;
......@@ -209,9 +238,7 @@ static void listdir_apk(const char *name) {
DIR *dir;
struct dirent *entry;
const char *ext;
char buf[4096];
char path[4096];
char *ptr;
if (!(dir = opendir(name)))
return;
......@@ -230,13 +257,8 @@ static void listdir_apk(const char *name) {
if (!strncmp(".apk", ext, 4)) {
pthread_mutex_lock(&list_lock);
for (auto &s : hide_list) {
// Replace '/' with '\0' to stop reading beyond the actual package name
strcpy(buf, s.c_str());
if ((ptr = strchr(buf, '/')))
ptr[0] = '\0';
// Compare with (path + 10) to trim "/data/app/"
if (strncmp(path + 10, buf, strlen(buf)) == 0) {
if (strncmp(path + 10, s.c_str(), s.length()) == 0) {
if (inotify_add_watch(inotify_fd, path, IN_OPEN | IN_DELETE) > 0) {
LOGI("proc_monitor: Monitoring %s\n", path, inotify_fd);
} else {
......@@ -257,9 +279,8 @@ static void update_pkg_list() {
DIR *dir;
struct dirent *entry;
struct stat st;
char buf[4096];
char path[4096];
char *ptr;
const char* target;
const char data_path[] = "/data/data";
if (!(dir = opendir(data_path)))
......@@ -279,17 +300,18 @@ static void update_pkg_list() {
if (entry->d_type == DT_DIR) {
pthread_mutex_lock(&list_lock);
for (auto &s : hide_list) {
// Replace '/' with '\0' to stop reading beyond the actual package name
strcpy(buf, s.c_str());
if ((ptr = strchr(buf, '/')))
ptr[0] = '\0';
if (strcmp(entry->d_name, buf) == 0) {
target = s.c_str();
if (strcmp(entry->d_name, target) == 0) {
if (stat(path, &st) == -1)
continue;
LOGI("proc_monitor: %s UID is %d\n", buf, st.st_uid);
LOGI("proc_monitor: %s UID is %d\n", target, st.st_uid);
hide_uid.insert(st.st_uid);
if (strcmp(entry->d_name, SAFETYNET_PKG) == 0) {
LOGI("proc_monitor: Got GMS: %d\n", st.st_uid);
gms_uid = st.st_uid;
}
}
}
pthread_mutex_unlock(&list_lock);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment