From d4167581357fcc65076a32b4872e9ab7495daff4 Mon Sep 17 00:00:00 2001 From: Nullptr Date: Thu, 2 Feb 2023 20:51:36 +0800 Subject: [PATCH] Add basic hide --- loader/src/injector/deny.hpp | 52 ---------------------------------- loader/src/injector/hide.cpp | 23 +++++++++++++++ loader/src/injector/hook.cpp | 2 +- loader/src/injector/misc.cpp | 12 ++++++++ loader/src/injector/misc.hpp | 14 +++++---- loader/src/injector/zygisk.hpp | 2 ++ 6 files changed, 47 insertions(+), 58 deletions(-) delete mode 100644 loader/src/injector/deny.hpp create mode 100644 loader/src/injector/hide.cpp diff --git a/loader/src/injector/deny.hpp b/loader/src/injector/deny.hpp deleted file mode 100644 index 656b1dc..0000000 --- a/loader/src/injector/deny.hpp +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -#include - -#define ISOLATED_MAGIC "isolated" - -namespace DenyRequest { -enum : int { - ENFORCE, - DISABLE, - ADD, - REMOVE, - LIST, - STATUS, - - END -}; -} - -namespace DenyResponse { -enum : int { - OK, - ENFORCED, - NOT_ENFORCED, - ITEM_EXIST, - ITEM_NOT_EXIST, - INVALID_PKG, - NO_NS, - ERROR, - - END -}; -} - -// CLI entries -int enable_deny(); -int disable_deny(); -int add_list(int client); -int rm_list(int client); -void ls_list(int client); - -// Utility functions -bool is_deny_target(int uid, std::string_view process); -void revert_unmount(); - -extern std::atomic denylist_enforced; diff --git a/loader/src/injector/hide.cpp b/loader/src/injector/hide.cpp new file mode 100644 index 0000000..a3ac031 --- /dev/null +++ b/loader/src/injector/hide.cpp @@ -0,0 +1,23 @@ +#include + +#include "logging.h" +#include "misc.hpp" +#include "zygisk.hpp" + +using namespace std::string_view_literals; + +static void lazy_unmount(const char* mountpoint) { + if (umount2(mountpoint, MNT_DETACH) != -1) + LOGD("Unmounted (%s)", mountpoint); +} + +#define OVERLAY_MNT(dir) (mentry->mnt_type == "overlay"sv && std::string_view(mentry->mnt_dir).starts_with("/" #dir)) + +void revert_unmount() { + parse_mnt("/proc/self/mounts", [](mntent* mentry) { + if (OVERLAY_MNT("system") || OVERLAY_MNT("vendor") || OVERLAY_MNT("product") || OVERLAY_MNT("system_ext")) { + lazy_unmount(mentry->mnt_fsname); + } + return true; + }); +} diff --git a/loader/src/injector/hook.cpp b/loader/src/injector/hook.cpp index 8dcebc6..7024036 100644 --- a/loader/src/injector/hook.cpp +++ b/loader/src/injector/hook.cpp @@ -193,7 +193,7 @@ DCL_HOOK_FUNC(int, unshare, int flags) { // Simply avoid doing any unmounts for SysUI to avoid potential issues. (g_ctx->info_flags & PROCESS_IS_SYS_UI) == 0) { if (g_ctx->flags[DO_REVERT_UNMOUNT]) { - // FIXME: revert_unmount(); + revert_unmount(); } /* Zygisksu changed: No umount app_process */ diff --git a/loader/src/injector/misc.cpp b/loader/src/injector/misc.cpp index 959c733..d7b5131 100644 --- a/loader/src/injector/misc.cpp +++ b/loader/src/injector/misc.cpp @@ -23,6 +23,18 @@ int parse_int(std::string_view s) { return val; } +void parse_mnt(const char* file, const std::function& fn) { + auto fp = sFILE(setmntent(file, "re"), endmntent); + if (fp) { + mntent mentry{}; + char buf[PATH_MAX]; + while (getmntent_r(fp.get(), &mentry, buf, sizeof(buf))) { + if (!fn(&mentry)) + break; + } + } +} + sDIR make_dir(DIR *dp) { return sDIR(dp, [](DIR *dp){ return dp ? closedir(dp) : 1; }); } diff --git a/loader/src/injector/misc.hpp b/loader/src/injector/misc.hpp index 6f45852..6d09dce 100644 --- a/loader/src/injector/misc.hpp +++ b/loader/src/injector/misc.hpp @@ -1,12 +1,14 @@ #pragma once -#include -#include "logging.h" #include -#include - -#include +#include #include +#include +#include +#include +#include + +#include "logging.h" #define DISALLOW_COPY_AND_MOVE(clazz) \ clazz(const clazz &) = delete; \ @@ -93,6 +95,8 @@ struct StringCmp { */ int parse_int(std::string_view s); +void parse_mnt(const char* file, const std::function& fn); + template static inline T align_to(T v, int a) { static_assert(std::is_integral::value); diff --git a/loader/src/injector/zygisk.hpp b/loader/src/injector/zygisk.hpp index de3673c..addfdea 100644 --- a/loader/src/injector/zygisk.hpp +++ b/loader/src/injector/zygisk.hpp @@ -7,3 +7,5 @@ extern void *self_handle; void hook_functions(); + +void revert_unmount();