From 68656521259bdf5b12c8d2a6177f6907dfc65f1a Mon Sep 17 00:00:00 2001 From: vvb2060 Date: Thu, 18 Mar 2021 13:36:42 +0800 Subject: [PATCH] Fix process name in MagiskHide close #3997 --- .../main/java/com/topjohnwu/magisk/core/tasks/FlashZip.kt | 2 +- .../main/java/com/topjohnwu/magisk/ui/hide/HideRvItems.kt | 2 +- native/jni/magiskhide/hide_utils.cpp | 8 +++++++- native/jni/magiskhide/magiskhide.hpp | 2 +- native/jni/magiskhide/proc_monitor.cpp | 2 +- native/jni/utils/misc.hpp | 2 +- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/topjohnwu/magisk/core/tasks/FlashZip.kt b/app/src/main/java/com/topjohnwu/magisk/core/tasks/FlashZip.kt index 0634fff6d..f6e1dd3ed 100644 --- a/app/src/main/java/com/topjohnwu/magisk/core/tasks/FlashZip.kt +++ b/app/src/main/java/com/topjohnwu/magisk/core/tasks/FlashZip.kt @@ -66,7 +66,7 @@ open class FlashZip( console.add("- Installing ${mUri.displayName}") - return Shell.su("sh $installDir/update-binary dummy 1 \"$zipFile\"") + return Shell.su("sh $installDir/update-binary dummy 1 \'$zipFile\'") .to(console, logs).exec().isSuccess } diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideRvItems.kt b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideRvItems.kt index a4d8ae448..ed8b77c7b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideRvItems.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideRvItems.kt @@ -99,7 +99,7 @@ class HideProcessRvItem( set(value) = set(value, process.isHidden, { process.isHidden = it }, BR.hidden) { val arg = if (it) "add" else "rm" val (name, pkg) = process - Shell.su("magiskhide $arg $pkg $name").submit() + Shell.su("magiskhide $arg $pkg \'$name\'").submit() } fun toggle() { diff --git a/native/jni/magiskhide/hide_utils.cpp b/native/jni/magiskhide/hide_utils.cpp index 6bed7f6a8..ec45a7812 100644 --- a/native/jni/magiskhide/hide_utils.cpp +++ b/native/jni/magiskhide/hide_utils.cpp @@ -108,6 +108,8 @@ static bool validate(const char *s) { (c >= '0' && c <= '9') || c == '_' || c == ':') { continue; } + if (SDK_INT >= 29 && c == '$') + continue; if (c == '.') { dot = true; continue; @@ -333,7 +335,7 @@ void auto_start_magiskhide(bool late_props) { } } -bool is_hide_target(int uid, string_view process) { +bool is_hide_target(int uid, string_view process, int max_len) { mutex_guard lock(hide_state_lock); if (uid % 100000 >= 90000) { @@ -343,6 +345,8 @@ bool is_hide_target(int uid, string_view process) { return false; for (auto &s : it->second) { + if (s.length() > max_len && process.length() > max_len && str_starts(s, process)) + return true; if (str_starts(process, s)) return true; } @@ -352,6 +356,8 @@ bool is_hide_target(int uid, string_view process) { return false; for (auto &s : it->second) { + if (s.length() > max_len && process.length() > max_len && str_starts(s, process)) + return true; if (s == process) return true; } diff --git a/native/jni/magiskhide/magiskhide.hpp b/native/jni/magiskhide/magiskhide.hpp index fa2bb64cb..d9fb26e13 100644 --- a/native/jni/magiskhide/magiskhide.hpp +++ b/native/jni/magiskhide/magiskhide.hpp @@ -36,7 +36,7 @@ void crawl_procfs(const std::function &fn); void crawl_procfs(DIR *dir, const std::function &fn); bool hide_enabled(); void update_uid_map(); -bool is_hide_target(int uid, std::string_view process); +bool is_hide_target(int uid, std::string_view process, int max_len = 1024); // Hide policies void hide_daemon(int pid); diff --git a/native/jni/magiskhide/proc_monitor.cpp b/native/jni/magiskhide/proc_monitor.cpp index 3c8ed3230..fa43b981a 100644 --- a/native/jni/magiskhide/proc_monitor.cpp +++ b/native/jni/magiskhide/proc_monitor.cpp @@ -212,7 +212,7 @@ static bool check_pid(int pid) { cmdline == "usap32"sv || cmdline == "usap64"sv) return false; - if (!is_hide_target(uid, cmdline)) + if (!is_hide_target(uid, cmdline, 95)) goto not_target; // Ensure ns is separated diff --git a/native/jni/utils/misc.hpp b/native/jni/utils/misc.hpp index bd0ee34ab..0854ba314 100644 --- a/native/jni/utils/misc.hpp +++ b/native/jni/utils/misc.hpp @@ -71,7 +71,7 @@ static inline bool str_contains(std::string_view s, std::string_view ss) { return s.find(ss) != std::string::npos; } static inline bool str_starts(std::string_view s, std::string_view ss) { - return s.rfind(ss, 0) == 0; + return s.size() >= ss.size() && s.compare(0, ss.size(), ss) == 0; } static inline bool str_ends(std::string_view s, std::string_view ss) { return s.size() >= ss.size() && s.compare(s.size() - ss.size(), std::string::npos, ss) == 0;