diff --git a/build.gradle.kts b/build.gradle.kts index e98b9c1..1d66768 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,7 +24,7 @@ val verName by extra("v4-0.8.1") val verCode by extra(gitCommitCount) val commitHash by extra(gitCommitHash) val minKsuVersion by extra(10940) -val minKsudVersion by extra(10942) +val minKsudVersion by extra(11412) val maxKsuVersion by extra(20000) val minMagiskVersion by extra(26300) diff --git a/loader/src/include/daemon.h b/loader/src/include/daemon.h index f44eb89..c762a75 100644 --- a/loader/src/include/daemon.h +++ b/loader/src/include/daemon.h @@ -12,8 +12,7 @@ #endif constexpr auto kCPSocketName = "/" LP_SELECT("cp32", "cp64") ".sock"; -constexpr const auto MAGIC_PATH_ENV = "MAGIC_PATH"; -constexpr const auto MAGIC_ENV = "MAGIC"; +#define TMP_PATH "/debug_ramdisk/zygisksu" class UniqueFd { using Fd = int; @@ -63,7 +62,7 @@ namespace zygiskd { ZygoteRestart, }; - void Init(const char *path); + void Init(const char *path = TMP_PATH); bool PingHeartbeat(); diff --git a/loader/src/injector/entry.cpp b/loader/src/injector/entry.cpp index 0abbffa..1c976c8 100644 --- a/loader/src/injector/entry.cpp +++ b/loader/src/injector/entry.cpp @@ -8,11 +8,11 @@ using namespace std; void *self_handle = nullptr; extern "C" [[gnu::visibility("default")]] -void entry(void* handle, const char* path) { +void entry(void* handle) { LOGI("Zygisk library injected, version %s", ZKSU_VERSION); self_handle = handle; - zygiskd::Init(path); + zygiskd::Init(); if (!zygiskd::PingHeartbeat()) { LOGE("Zygisk daemon is not running"); return; diff --git a/loader/src/ptracer/main.cpp b/loader/src/ptracer/main.cpp index bbb5185..b4c9527 100644 --- a/loader/src/ptracer/main.cpp +++ b/loader/src/ptracer/main.cpp @@ -19,7 +19,7 @@ int main(int argc, char **argv) { return 0; } else if (argc >= 3 && argv[1] == "trace"sv) { if (argc >= 4 && argv[3] == "--restart"sv) { - zygiskd::Init(getenv(MAGIC_PATH_ENV)); + zygiskd::Init(); zygiskd::ZygoteRestart(); } auto pid = strtol(argv[2], 0, 0); diff --git a/loader/src/ptracer/monitor.cpp b/loader/src/ptracer/monitor.cpp index d26e252..193b666 100644 --- a/loader/src/ptracer/monitor.cpp +++ b/loader/src/ptracer/monitor.cpp @@ -37,13 +37,7 @@ enum TracingState { std::string monitor_stop_reason; -constexpr char SOCKET_NAME[] = "init_monitor"; - -std::string GetControlSocketName() { - auto env = getenv(MAGIC_ENV); - if (env == nullptr) return SOCKET_NAME; - return std::string(SOCKET_NAME) + env; -} +constexpr char SOCKET_NAME[] = TMP_PATH "/init_monitor"; struct EventLoop; @@ -141,9 +135,8 @@ struct SocketHandler : public EventHandler { .sun_family = AF_UNIX, .sun_path={0}, }; - auto socket_name = GetControlSocketName(); - strcpy(addr.sun_path + 1, socket_name.c_str()); - socklen_t socklen = sizeof(sa_family_t) + strlen(addr.sun_path + 1) + 1; + strcpy(addr.sun_path, SOCKET_NAME); + socklen_t socklen = sizeof(sa_family_t) + strlen(addr.sun_path); if (bind(sock_fd_, (struct sockaddr *) &addr, socklen) == -1) { PLOGE("bind socket"); return false; @@ -542,12 +535,7 @@ static void updateStatus() { } static bool prepare_environment() { - auto path = getenv(MAGIC_PATH_ENV); - if (path == nullptr) { - LOGE("path is null, is MAGIC_PATH_ENV specified?"); - return false; - } - prop_path = std::string(path) + "/module.prop"; + prop_path = TMP_PATH "/module.prop"; close(open(prop_path.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0644)); auto orig_prop = xopen_file("./module.prop", "r"); if (orig_prop == nullptr) { @@ -618,9 +606,8 @@ void send_control_command(Command cmd) { .sun_family = AF_UNIX, .sun_path={0}, }; - auto socket_name = GetControlSocketName(); - strcpy(addr.sun_path + 1, socket_name.c_str()); - socklen_t socklen = sizeof(sa_family_t) + strlen(addr.sun_path + 1) + 1; + strcpy(addr.sun_path, SOCKET_NAME); + socklen_t socklen = sizeof(sa_family_t) + strlen(addr.sun_path); auto nsend = sendto(sockfd, (void *) &cmd, sizeof(cmd), 0, (sockaddr *) &addr, socklen); if (nsend == -1) { err(EXIT_FAILURE, "send"); diff --git a/loader/src/ptracer/ptracer.cpp b/loader/src/ptracer/ptracer.cpp index 2c96061..3b785a1 100644 --- a/loader/src/ptracer/ptracer.cpp +++ b/loader/src/ptracer/ptracer.cpp @@ -16,7 +16,7 @@ #include #include "utils.hpp" -bool inject_on_main(int pid, const char *lib_path, const char* magic_path) { +bool inject_on_main(int pid, const char *lib_path) { LOGI("injecting %s to zygote %d", lib_path, pid); // parsing KernelArgumentBlock // https://cs.android.com/android/platform/superproject/main/+/main:bionic/libc/private/KernelArgumentBlock.h;l=30;drc=6d1ee77ee32220e4202c3066f7e1f69572967ad8 @@ -145,8 +145,6 @@ bool inject_on_main(int pid, const char *lib_path, const char* magic_path) { // call injector entry(handle, magic) args.clear(); args.push_back(remote_handle); - str = push_string(pid, regs, magic_path); - args.push_back((long) str); remote_call(pid, regs, injector_entry, (uintptr_t) libc_return_addr, args); // reset pc to entry @@ -180,9 +178,9 @@ bool trace_zygote(int pid) { } WAIT_OR_DIE if (STOPPED_WITH(SIGSTOP, PTRACE_EVENT_STOP)) { - std::string magic_path = getenv(MAGIC_PATH_ENV); - std::string lib_path = magic_path + "/lib" LP_SELECT("", "64") "/libzygisk.so"; - if (!inject_on_main(pid, lib_path.c_str(), magic_path.c_str())) { + std::string lib_path = TMP_PATH; + lib_path += "/lib" LP_SELECT("", "64") "/libzygisk.so"; + if (!inject_on_main(pid, lib_path.c_str())) { LOGE("failed to inject"); return false; } diff --git a/module/src/customize.sh b/module/src/customize.sh index 46442bc..70693f7 100644 --- a/module/src/customize.sh +++ b/module/src/customize.sh @@ -139,11 +139,6 @@ else mv "$MODPATH/machikado.arm" "$MODPATH/machikado" fi -ui_print "- Generating magic" -MAGIC=$(tr -dc 'a-f0-9' "/data/adb/zygisksu/magic" - ui_print "- Setting permissions" set_perm_recursive "$MODPATH/bin" 0 0 0755 0755 set_perm_recursive "$MODPATH/lib" 0 0 0755 0644 u:object_r:system_lib_file:s0 diff --git a/module/src/post-fs-data.sh b/module/src/post-fs-data.sh index 309fd0b..6948ef8 100644 --- a/module/src/post-fs-data.sh +++ b/module/src/post-fs-data.sh @@ -7,11 +7,6 @@ fi cd "$MODDIR" -MAGIC=$(cat /data/adb/zygisksu/magic) -MAGIC_PATH=/dev/zygisk_$MAGIC -export MAGIC -export MAGIC_PATH - if [ "$(which magisk)" ]; then for file in ../*; do if [ -d "$file" ] && [ -d "$file/zygisk" ] && ! [ -f "$file/disable" ]; then @@ -31,18 +26,20 @@ create_sys_perm() { chcon u:object_r:system_file:s0 $1 } -create_sys_perm $MAGIC_PATH +TMP_PATH="/debug_ramdisk/zygisksu" + +create_sys_perm $TMP_PATH if [ -f $MODDIR/lib64/libzygisk.so ];then - create_sys_perm $MAGIC_PATH/lib64 - cp $MODDIR/lib64/libzygisk.so $MAGIC_PATH/lib64/libzygisk.so - chcon u:object_r:system_file:s0 $MAGIC_PATH/lib64/libzygisk.so + create_sys_perm $TMP_PATH/lib64 + cp $MODDIR/lib64/libzygisk.so $TMP_PATH/lib64/libzygisk.so + chcon u:object_r:system_file:s0 $TMP_PATH/lib64/libzygisk.so fi if [ -f $MODDIR/lib/libzygisk.so ];then - create_sys_perm $MAGIC_PATH/lib - cp $MODDIR/lib/libzygisk.so $MAGIC_PATH/lib/libzygisk.so - chcon u:object_r:system_file:s0 $MAGIC_PATH/lib/libzygisk.so + create_sys_perm $TMP_PATH/lib + cp $MODDIR/lib/libzygisk.so $TMP_PATH/lib/libzygisk.so + chcon u:object_r:system_file:s0 $TMP_PATH/lib/libzygisk.so fi [ "$DEBUG" = true ] && export RUST_BACKTRACE=1 diff --git a/module/src/service.sh b/module/src/service.sh index 12107c2..d544d9d 100644 --- a/module/src/service.sh +++ b/module/src/service.sh @@ -9,9 +9,6 @@ fi cd "$MODDIR" -MAGIC_PATH=/dev/zygisk_$(cat ./magic) -export MAGIC_PATH - if [ "$(which magisk)" ]; then for file in ../*; do if [ -d "$file" ] && [ -d "$file/zygisk" ] && ! [ -f "$file/disable" ]; then diff --git a/module/src/zygisk-ctl.sh b/module/src/zygisk-ctl.sh index 3bd38af..85d0d1b 100644 --- a/module/src/zygisk-ctl.sh +++ b/module/src/zygisk-ctl.sh @@ -1,3 +1,2 @@ MODDIR=${0%/*}/.. -export MAGIC=$(cat /data/adb/zygisksu/magic) exec $MODDIR/bin/zygisk-ptrace64 ctl $* diff --git a/zygiskd/src/constants.rs b/zygiskd/src/constants.rs index 70d5ba3..c3a95f0 100644 --- a/zygiskd/src/constants.rs +++ b/zygiskd/src/constants.rs @@ -17,13 +17,15 @@ pub const MAX_LOG_LEVEL: LevelFilter = LevelFilter::Trace; pub const MAX_LOG_LEVEL: LevelFilter = LevelFilter::Info; -pub const PATH_CP_NAME: &str = lp_select!("/cp32.sock", "/cp64.sock"); pub const PATH_MODULES_DIR: &str = ".."; pub const PATH_MODULE_PROP: &str = "module.prop"; pub const ZYGOTE_INJECTED: i32 = lp_select!(5, 4); pub const DAEMON_SET_INFO: i32 = lp_select!(7, 6); pub const DAEMON_SET_ERROR_INFO: i32 = lp_select!(9, 8); +pub const TMP_DIR: &str = "/debug_ramdisk/zygisksu"; +pub const CONTROLLER_SOCKET: &str = concatcp!(TMP_DIR, "/init_monitor"); +pub const PATH_CP_NAME: &str = concatcp!(TMP_DIR, lp_select!("/cp32.sock", "/cp64.sock")); pub const MAX_RESTART_COUNT: i32 = 5; diff --git a/zygiskd/src/utils.rs b/zygiskd/src/utils.rs index 7cd80d2..51b6ee0 100644 --- a/zygiskd/src/utils.rs +++ b/zygiskd/src/utils.rs @@ -202,10 +202,10 @@ pub fn unix_listener_from_path(path: &str) -> Result { Ok(UnixListener::from(socket)) } -pub fn unix_datagram_sendto_abstract(path: &str, buf: &[u8]) -> Result<()> { +pub fn unix_datagram_sendto(path: &str, buf: &[u8]) -> Result<()> { // FIXME: shall we set create context every time? set_socket_create_context(get_current_attr()?.as_str())?; - let addr = SocketAddrUnix::new_abstract_name(path.as_bytes())?; + let addr = SocketAddrUnix::new(path.as_bytes())?; let socket = socket(AddressFamily::UNIX, SocketType::DGRAM, None)?; connect_unix(&socket, &addr)?; sendto_unix(socket, buf, SendFlags::empty(), &addr)?; diff --git a/zygiskd/src/zygiskd.rs b/zygiskd/src/zygiskd.rs index fc995e5..7e6fd56 100644 --- a/zygiskd/src/zygiskd.rs +++ b/zygiskd/src/zygiskd.rs @@ -32,9 +32,6 @@ struct Context { pub fn main() -> Result<()> { log::info!("Welcome to Zygisk Next ({}) !", constants::ZKSU_VERSION); - let magic_path = std::env::var("MAGIC")?; - let controller_path = format!("init_monitor{}", magic_path); - log::info!("socket path {}", controller_path); let arch = get_arch()?; log::debug!("Daemon architecture: {arch}"); @@ -57,7 +54,7 @@ pub fn main() -> Result<()> { msg.extend_from_slice(&(info.len() as u32 + 1).to_le_bytes()); msg.extend_from_slice(info.as_bytes()); msg.extend_from_slice(&[0u8]); - utils::unix_datagram_sendto_abstract(controller_path.as_str(), msg.as_slice()).expect("failed to send info"); + utils::unix_datagram_sendto(constants::CONTROLLER_SOCKET, msg.as_slice()).expect("failed to send info"); } let context = Context { @@ -74,7 +71,7 @@ pub fn main() -> Result<()> { match action { DaemonSocketAction::PingHeartbeat => { let value = constants::ZYGOTE_INJECTED; - utils::unix_datagram_sendto_abstract(controller_path.as_str(), &value.to_le_bytes())?; + utils::unix_datagram_sendto(constants::CONTROLLER_SOCKET, &value.to_le_bytes())?; } DaemonSocketAction::ZygoteRestart => { info!("Zygote restarted, clean up companions"); @@ -166,10 +163,7 @@ fn create_library_fd(so_path: &PathBuf) -> Result { fn create_daemon_socket() -> Result { utils::set_socket_create_context("u:r:zygote:s0")?; - let magic_path = std::env::var("MAGIC_PATH")?; - let socket_path = magic_path + constants::PATH_CP_NAME; - log::debug!("Daemon socket: {}", socket_path); - let listener = utils::unix_listener_from_path(&socket_path)?; + let listener = utils::unix_listener_from_path(constants::PATH_CP_NAME)?; Ok(listener) }