From 9de6e8846bf2cd46adcc20bde9934600cbc0a4a9 Mon Sep 17 00:00:00 2001 From: vvb2060 Date: Fri, 18 Mar 2022 04:04:13 +0800 Subject: [PATCH] Dump stub app to MAGISKTMP/stub.apk --- native/jni/core/bootstages.cpp | 18 ++++++++++++++---- native/jni/init/init.cpp | 2 +- native/jni/init/init.hpp | 1 + native/jni/init/rootdir.cpp | 4 ++++ 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/native/jni/core/bootstages.cpp b/native/jni/core/bootstages.cpp index 7bfdf12d7..f1eca6a91 100644 --- a/native/jni/core/bootstages.cpp +++ b/native/jni/core/bootstages.cpp @@ -18,6 +18,7 @@ using namespace std; static bool safe_mode = false; +static int stub_fd = -1; bool zygisk_enabled = false; /********* @@ -122,6 +123,10 @@ static bool magisk_env() { LOGI("* Initializing Magisk environment\n"); + string stub_path = MAGISKTMP + "/stub.apk"; + stub_fd = xopen(stub_path.data(), O_RDONLY | O_CLOEXEC); + unlink(stub_path.data()); + string pkg; get_manager(&pkg); @@ -370,10 +375,15 @@ void boot_complete(int client) { if (access(SECURE_DIR, F_OK) != 0) xmkdir(SECURE_DIR, 0700); - if (!get_manager()) { + if (stub_fd > 0 && !get_manager()) { // Install stub - auto init = MAGISKTMP + "/magiskinit"; - exec_command_sync(init.data(), "-x", "manager", "/data/magisk.apk"); - install_apk("/data/magisk.apk"); + struct stat st{}; + fstat(stub_fd, &st); + int dfd = xopen("/data/stub.apk", O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, 0600); + xsendfile(dfd, stub_fd, nullptr, st.st_size); + close(stub_fd); + close(dfd); + stub_fd = -1; + install_apk("/data/stub.apk"); } } diff --git a/native/jni/init/init.cpp b/native/jni/init/init.cpp index 940e57f76..e248f6c72 100644 --- a/native/jni/init/init.cpp +++ b/native/jni/init/init.cpp @@ -35,7 +35,7 @@ bool unxz(int fd, const uint8_t *buf, size_t size) { return true; } -static int dump_manager(const char *path, mode_t mode) { +int dump_manager(const char *path, mode_t mode) { int fd = xopen(path, O_WRONLY | O_CREAT | O_TRUNC | O_CLOEXEC, mode); if (fd < 0) return 1; diff --git a/native/jni/init/init.hpp b/native/jni/init/init.hpp index d5e93c1b5..192bbc2f9 100644 --- a/native/jni/init/init.hpp +++ b/native/jni/init/init.hpp @@ -32,6 +32,7 @@ void load_kernel_info(BootConfig *config); bool check_two_stage(); void setup_klog(); const char *backup_init(); +int dump_manager(const char *path, mode_t mode); /*************** * Base classes diff --git a/native/jni/init/rootdir.cpp b/native/jni/init/rootdir.cpp index ff1cb1ecf..d9e358cbd 100644 --- a/native/jni/init/rootdir.cpp +++ b/native/jni/init/rootdir.cpp @@ -233,6 +233,8 @@ void SARBase::patch_ro_root() { } else { xsymlink("./magisk32", "magisk"); } + + dump_manager("stub.apk", 0644); } if ((access(SPLIT_PLAT_CIL, F_OK) != 0 && access("/sepolicy", F_OK) == 0) || !hijack_sepolicy()) { @@ -305,6 +307,8 @@ void MagiskInit::patch_rw_root() { } else { xsymlink("./magisk32", "magisk"); } + + dump_manager("stub.apk", 0644); } if ((!treble && access("/sepolicy", F_OK) == 0) || !hijack_sepolicy()) {