diff --git a/native/src/core/zygisk/entry.cpp b/native/src/core/zygisk/entry.cpp index 4d9d981f4..2ec115c32 100644 --- a/native/src/core/zygisk/entry.cpp +++ b/native/src/core/zygisk/entry.cpp @@ -39,6 +39,7 @@ int remote_get_info(int uid, const char *process, uint32_t *flags, vector & if (int fd = zygisk_request(ZygiskRequest::GET_INFO); fd >= 0) { write_int(fd, uid); write_string(fd, process); + write_int(fd, sizeof(void*) == 8 ? 1 : 0); xxread(fd, flags, sizeof(*flags)); if (should_load_modules(*flags)) { fds = recv_fds(fd); @@ -68,13 +69,6 @@ static vector get_module_fds(bool is_64_bit) { return fds; } -static bool get_exe(int pid, char *buf, size_t sz) { - char exe[128]; - if (ssprintf(exe, sizeof(exe), "/proc/%d/exe", pid) < 0) - return false; - return xreadlink(exe, buf, sz) > 0; -} - static pthread_mutex_t zygiskd_lock = PTHREAD_MUTEX_INITIALIZER; static int zygiskd_sockets[] = { -1, -1 }; #define zygiskd_socket zygiskd_sockets[is_64_bit] @@ -125,6 +119,7 @@ static void connect_companion(int client, bool is_64_bit) { static void get_process_info(int client, const sock_cred *cred) { int uid = read_int(client); string process = read_string(client); + int arch = read_int(client); auto &daemon = MagiskD(); uint32_t flags = 0; @@ -145,13 +140,7 @@ static void get_process_info(int client, const sock_cred *cred) { xwrite(client, &flags, sizeof(flags)); if (should_load_modules(flags)) { - char buf[256]; - if (!get_exe(cred->pid, buf, sizeof(buf))) { - LOGW("zygisk: remote process %d probably died, abort\n", cred->pid); - send_fd(client, -1); - return; - } - vector fds = get_module_fds(str_ends(buf, "64")); + vector fds = get_module_fds(arch); send_fds(client, fds.data(), fds.size()); } @@ -191,18 +180,15 @@ static void get_moddir(int client) { void zygisk_handler(int client, const sock_cred *cred) { int code = read_int(client); - char buf[256]; switch (code) { case ZygiskRequest::GET_INFO: get_process_info(client, cred); break; - case ZygiskRequest::CONNECT_COMPANION: - if (get_exe(cred->pid, buf, sizeof(buf))) { - connect_companion(client, str_ends(buf, "64")); - } else { - LOGW("zygisk: remote process %d probably died, abort\n", cred->pid); - } + case ZygiskRequest::CONNECT_COMPANION: { + int arch = read_int(client); + connect_companion(client, arch); break; + } case ZygiskRequest::GET_MODDIR: get_moddir(client); break; diff --git a/native/src/core/zygisk/module.cpp b/native/src/core/zygisk/module.cpp index d84488dde..ca5645fec 100644 --- a/native/src/core/zygisk/module.cpp +++ b/native/src/core/zygisk/module.cpp @@ -78,6 +78,7 @@ bool ZygiskModule::valid() const { int ZygiskModule::connectCompanion() const { if (int fd = zygisk_request(ZygiskRequest::CONNECT_COMPANION); fd >= 0) { + write_int(fd, sizeof(void*) == 8 ? 1 : 0); write_int(fd, id); return fd; }