You've already forked ZygiskNext
mirror of
https://github.com/Dr-TSNG/ZygiskNext.git
synced 2025-08-27 23:46:34 +00:00
use /debug_ramdisk
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 $*
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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)?;
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user