use /debug_ramdisk

This commit is contained in:
5ec1cff
2024-01-02 18:03:17 +08:00
parent 28f77fa5e2
commit 5c8a67657c
13 changed files with 33 additions and 65 deletions

View File

@@ -24,7 +24,7 @@ val verName by extra("v4-0.8.1")
val verCode by extra(gitCommitCount) val verCode by extra(gitCommitCount)
val commitHash by extra(gitCommitHash) val commitHash by extra(gitCommitHash)
val minKsuVersion by extra(10940) val minKsuVersion by extra(10940)
val minKsudVersion by extra(10942) val minKsudVersion by extra(11412)
val maxKsuVersion by extra(20000) val maxKsuVersion by extra(20000)
val minMagiskVersion by extra(26300) val minMagiskVersion by extra(26300)

View File

@@ -12,8 +12,7 @@
#endif #endif
constexpr auto kCPSocketName = "/" LP_SELECT("cp32", "cp64") ".sock"; constexpr auto kCPSocketName = "/" LP_SELECT("cp32", "cp64") ".sock";
constexpr const auto MAGIC_PATH_ENV = "MAGIC_PATH"; #define TMP_PATH "/debug_ramdisk/zygisksu"
constexpr const auto MAGIC_ENV = "MAGIC";
class UniqueFd { class UniqueFd {
using Fd = int; using Fd = int;
@@ -63,7 +62,7 @@ namespace zygiskd {
ZygoteRestart, ZygoteRestart,
}; };
void Init(const char *path); void Init(const char *path = TMP_PATH);
bool PingHeartbeat(); bool PingHeartbeat();

View File

@@ -8,11 +8,11 @@ using namespace std;
void *self_handle = nullptr; void *self_handle = nullptr;
extern "C" [[gnu::visibility("default")]] extern "C" [[gnu::visibility("default")]]
void entry(void* handle, const char* path) { void entry(void* handle) {
LOGI("Zygisk library injected, version %s", ZKSU_VERSION); LOGI("Zygisk library injected, version %s", ZKSU_VERSION);
self_handle = handle; self_handle = handle;
zygiskd::Init(path); zygiskd::Init();
if (!zygiskd::PingHeartbeat()) { if (!zygiskd::PingHeartbeat()) {
LOGE("Zygisk daemon is not running"); LOGE("Zygisk daemon is not running");
return; return;

View File

@@ -19,7 +19,7 @@ int main(int argc, char **argv) {
return 0; return 0;
} else if (argc >= 3 && argv[1] == "trace"sv) { } else if (argc >= 3 && argv[1] == "trace"sv) {
if (argc >= 4 && argv[3] == "--restart"sv) { if (argc >= 4 && argv[3] == "--restart"sv) {
zygiskd::Init(getenv(MAGIC_PATH_ENV)); zygiskd::Init();
zygiskd::ZygoteRestart(); zygiskd::ZygoteRestart();
} }
auto pid = strtol(argv[2], 0, 0); auto pid = strtol(argv[2], 0, 0);

View File

@@ -37,13 +37,7 @@ enum TracingState {
std::string monitor_stop_reason; std::string monitor_stop_reason;
constexpr char SOCKET_NAME[] = "init_monitor"; constexpr char SOCKET_NAME[] = TMP_PATH "/init_monitor";
std::string GetControlSocketName() {
auto env = getenv(MAGIC_ENV);
if (env == nullptr) return SOCKET_NAME;
return std::string(SOCKET_NAME) + env;
}
struct EventLoop; struct EventLoop;
@@ -141,9 +135,8 @@ struct SocketHandler : public EventHandler {
.sun_family = AF_UNIX, .sun_family = AF_UNIX,
.sun_path={0}, .sun_path={0},
}; };
auto socket_name = GetControlSocketName(); strcpy(addr.sun_path, SOCKET_NAME);
strcpy(addr.sun_path + 1, socket_name.c_str()); socklen_t socklen = sizeof(sa_family_t) + strlen(addr.sun_path);
socklen_t socklen = sizeof(sa_family_t) + strlen(addr.sun_path + 1) + 1;
if (bind(sock_fd_, (struct sockaddr *) &addr, socklen) == -1) { if (bind(sock_fd_, (struct sockaddr *) &addr, socklen) == -1) {
PLOGE("bind socket"); PLOGE("bind socket");
return false; return false;
@@ -542,12 +535,7 @@ static void updateStatus() {
} }
static bool prepare_environment() { static bool prepare_environment() {
auto path = getenv(MAGIC_PATH_ENV); prop_path = TMP_PATH "/module.prop";
if (path == nullptr) {
LOGE("path is null, is MAGIC_PATH_ENV specified?");
return false;
}
prop_path = std::string(path) + "/module.prop";
close(open(prop_path.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0644)); close(open(prop_path.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0644));
auto orig_prop = xopen_file("./module.prop", "r"); auto orig_prop = xopen_file("./module.prop", "r");
if (orig_prop == nullptr) { if (orig_prop == nullptr) {
@@ -618,9 +606,8 @@ void send_control_command(Command cmd) {
.sun_family = AF_UNIX, .sun_family = AF_UNIX,
.sun_path={0}, .sun_path={0},
}; };
auto socket_name = GetControlSocketName(); strcpy(addr.sun_path, SOCKET_NAME);
strcpy(addr.sun_path + 1, socket_name.c_str()); socklen_t socklen = sizeof(sa_family_t) + strlen(addr.sun_path);
socklen_t socklen = sizeof(sa_family_t) + strlen(addr.sun_path + 1) + 1;
auto nsend = sendto(sockfd, (void *) &cmd, sizeof(cmd), 0, (sockaddr *) &addr, socklen); auto nsend = sendto(sockfd, (void *) &cmd, sizeof(cmd), 0, (sockaddr *) &addr, socklen);
if (nsend == -1) { if (nsend == -1) {
err(EXIT_FAILURE, "send"); err(EXIT_FAILURE, "send");

View File

@@ -16,7 +16,7 @@
#include <string> #include <string>
#include "utils.hpp" #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); LOGI("injecting %s to zygote %d", lib_path, pid);
// parsing KernelArgumentBlock // parsing KernelArgumentBlock
// https://cs.android.com/android/platform/superproject/main/+/main:bionic/libc/private/KernelArgumentBlock.h;l=30;drc=6d1ee77ee32220e4202c3066f7e1f69572967ad8 // 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) // call injector entry(handle, magic)
args.clear(); args.clear();
args.push_back(remote_handle); 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); remote_call(pid, regs, injector_entry, (uintptr_t) libc_return_addr, args);
// reset pc to entry // reset pc to entry
@@ -180,9 +178,9 @@ bool trace_zygote(int pid) {
} }
WAIT_OR_DIE WAIT_OR_DIE
if (STOPPED_WITH(SIGSTOP, PTRACE_EVENT_STOP)) { if (STOPPED_WITH(SIGSTOP, PTRACE_EVENT_STOP)) {
std::string magic_path = getenv(MAGIC_PATH_ENV); std::string lib_path = TMP_PATH;
std::string lib_path = magic_path + "/lib" LP_SELECT("", "64") "/libzygisk.so"; lib_path += "/lib" LP_SELECT("", "64") "/libzygisk.so";
if (!inject_on_main(pid, lib_path.c_str(), magic_path.c_str())) { if (!inject_on_main(pid, lib_path.c_str())) {
LOGE("failed to inject"); LOGE("failed to inject");
return false; return false;
} }

View File

@@ -139,11 +139,6 @@ else
mv "$MODPATH/machikado.arm" "$MODPATH/machikado" mv "$MODPATH/machikado.arm" "$MODPATH/machikado"
fi fi
ui_print "- Generating magic"
MAGIC=$(tr -dc 'a-f0-9' </dev/urandom | head -c 18)
mkdir -p /data/adb/zygisksu || abort "failed to create zygisksu dir"
echo -n "$MAGIC" > "/data/adb/zygisksu/magic"
ui_print "- Setting permissions" ui_print "- Setting permissions"
set_perm_recursive "$MODPATH/bin" 0 0 0755 0755 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 set_perm_recursive "$MODPATH/lib" 0 0 0755 0644 u:object_r:system_lib_file:s0

View File

@@ -7,11 +7,6 @@ fi
cd "$MODDIR" cd "$MODDIR"
MAGIC=$(cat /data/adb/zygisksu/magic)
MAGIC_PATH=/dev/zygisk_$MAGIC
export MAGIC
export MAGIC_PATH
if [ "$(which magisk)" ]; then if [ "$(which magisk)" ]; then
for file in ../*; do for file in ../*; do
if [ -d "$file" ] && [ -d "$file/zygisk" ] && ! [ -f "$file/disable" ]; then 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 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 if [ -f $MODDIR/lib64/libzygisk.so ];then
create_sys_perm $MAGIC_PATH/lib64 create_sys_perm $TMP_PATH/lib64
cp $MODDIR/lib64/libzygisk.so $MAGIC_PATH/lib64/libzygisk.so cp $MODDIR/lib64/libzygisk.so $TMP_PATH/lib64/libzygisk.so
chcon u:object_r:system_file:s0 $MAGIC_PATH/lib64/libzygisk.so chcon u:object_r:system_file:s0 $TMP_PATH/lib64/libzygisk.so
fi fi
if [ -f $MODDIR/lib/libzygisk.so ];then if [ -f $MODDIR/lib/libzygisk.so ];then
create_sys_perm $MAGIC_PATH/lib create_sys_perm $TMP_PATH/lib
cp $MODDIR/lib/libzygisk.so $MAGIC_PATH/lib/libzygisk.so cp $MODDIR/lib/libzygisk.so $TMP_PATH/lib/libzygisk.so
chcon u:object_r:system_file:s0 $MAGIC_PATH/lib/libzygisk.so chcon u:object_r:system_file:s0 $TMP_PATH/lib/libzygisk.so
fi fi
[ "$DEBUG" = true ] && export RUST_BACKTRACE=1 [ "$DEBUG" = true ] && export RUST_BACKTRACE=1

View File

@@ -9,9 +9,6 @@ fi
cd "$MODDIR" cd "$MODDIR"
MAGIC_PATH=/dev/zygisk_$(cat ./magic)
export MAGIC_PATH
if [ "$(which magisk)" ]; then if [ "$(which magisk)" ]; then
for file in ../*; do for file in ../*; do
if [ -d "$file" ] && [ -d "$file/zygisk" ] && ! [ -f "$file/disable" ]; then if [ -d "$file" ] && [ -d "$file/zygisk" ] && ! [ -f "$file/disable" ]; then

View File

@@ -1,3 +1,2 @@
MODDIR=${0%/*}/.. MODDIR=${0%/*}/..
export MAGIC=$(cat /data/adb/zygisksu/magic)
exec $MODDIR/bin/zygisk-ptrace64 ctl $* exec $MODDIR/bin/zygisk-ptrace64 ctl $*

View File

@@ -17,13 +17,15 @@ pub const MAX_LOG_LEVEL: LevelFilter = LevelFilter::Trace;
pub const MAX_LOG_LEVEL: LevelFilter = LevelFilter::Info; 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_MODULES_DIR: &str = "..";
pub const PATH_MODULE_PROP: &str = "module.prop"; pub const PATH_MODULE_PROP: &str = "module.prop";
pub const ZYGOTE_INJECTED: i32 = lp_select!(5, 4); pub const ZYGOTE_INJECTED: i32 = lp_select!(5, 4);
pub const DAEMON_SET_INFO: i32 = lp_select!(7, 6); pub const DAEMON_SET_INFO: i32 = lp_select!(7, 6);
pub const DAEMON_SET_ERROR_INFO: i32 = lp_select!(9, 8); 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; pub const MAX_RESTART_COUNT: i32 = 5;

View File

@@ -202,10 +202,10 @@ pub fn unix_listener_from_path(path: &str) -> Result<UnixListener> {
Ok(UnixListener::from(socket)) 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? // FIXME: shall we set create context every time?
set_socket_create_context(get_current_attr()?.as_str())?; 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)?; let socket = socket(AddressFamily::UNIX, SocketType::DGRAM, None)?;
connect_unix(&socket, &addr)?; connect_unix(&socket, &addr)?;
sendto_unix(socket, buf, SendFlags::empty(), &addr)?; sendto_unix(socket, buf, SendFlags::empty(), &addr)?;

View File

@@ -32,9 +32,6 @@ struct Context {
pub fn main() -> Result<()> { pub fn main() -> Result<()> {
log::info!("Welcome to Zygisk Next ({}) !", constants::ZKSU_VERSION); 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()?; let arch = get_arch()?;
log::debug!("Daemon architecture: {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.len() as u32 + 1).to_le_bytes());
msg.extend_from_slice(info.as_bytes()); msg.extend_from_slice(info.as_bytes());
msg.extend_from_slice(&[0u8]); 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 { let context = Context {
@@ -74,7 +71,7 @@ pub fn main() -> Result<()> {
match action { match action {
DaemonSocketAction::PingHeartbeat => { DaemonSocketAction::PingHeartbeat => {
let value = constants::ZYGOTE_INJECTED; 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 => { DaemonSocketAction::ZygoteRestart => {
info!("Zygote restarted, clean up companions"); info!("Zygote restarted, clean up companions");
@@ -166,10 +163,7 @@ fn create_library_fd(so_path: &PathBuf) -> Result<OwnedFd> {
fn create_daemon_socket() -> Result<UnixListener> { fn create_daemon_socket() -> Result<UnixListener> {
utils::set_socket_create_context("u:r:zygote:s0")?; utils::set_socket_create_context("u:r:zygote:s0")?;
let magic_path = std::env::var("MAGIC_PATH")?; let listener = utils::unix_listener_from_path(constants::PATH_CP_NAME)?;
let socket_path = magic_path + constants::PATH_CP_NAME;
log::debug!("Daemon socket: {}", socket_path);
let listener = utils::unix_listener_from_path(&socket_path)?;
Ok(listener) Ok(listener)
} }