Last active
November 13, 2025 03:48
-
-
Save ayasa520/f5325bac7bf279dd8d248dc386ea9c68 to your computer and use it in GitHub Desktop.
waydroid magisk
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| service bootanim /system/bin/bootanimation | |
| class core animation | |
| user graphics | |
| group graphics audio | |
| disabled | |
| oneshot | |
| ioprio rt 0 | |
| task_profiles MaxPerformance | |
| on post-fs-data | |
| start logd | |
| exec u:r:su:s0 root root -- $MAGISKSYSTEMDIR/magiskpolicy --live --magisk | |
| exec u:r:magisk:s0 root root -- $MAGISKSYSTEMDIR/magiskpolicy --live --magisk | |
| exec u:r:update_engine:s0 root root -- $MAGISKSYSTEMDIR/magiskpolicy --live --magisk | |
| exec u:r:su:s0 root root -- $MAGISKSYSTEMDIR/$magisk_name --auto-selinux --setup-sbin $MAGISKSYSTEMDIR $MAGISKTMP | |
| exec u:r:su:s0 root root -- $MAGISKTMP/magisk --auto-selinux --post-fs-data | |
| on nonencrypted | |
| exec u:r:su:s0 root root -- $MAGISKTMP/magisk --auto-selinux --service | |
| on property:vold.decrypt=trigger_restart_framework | |
| exec u:r:su:s0 root root -- $MAGISKTMP/magisk --auto-selinux --service | |
| on property:sys.boot_completed=1 | |
| mkdir /data/adb/magisk 755 | |
| exec u:r:su:s0 root root -- $MAGISKTMP/magisk --auto-selinux --boot-complete | |
| on property:init.svc.zygote=restarting | |
| exec u:r:su:s0 root root -- $MAGISKTMP/magisk --auto-selinux --zygote-restart | |
| on property:init.svc.zygote=stopped | |
| exec u:r:su:s0 root root -- $MAGISKTMP/magisk --auto-selinux --zygote-restart |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| link="https://github.com/ayasa520/Magisk/releases/download/canary-30403/app-release.apk" | |
| sha256="59f7de2f69751feb8d8b759fa9645c4b43790c0ef659f2b54024864b736984c8" | |
| # Function: Show usage help | |
| show_help() { | |
| echo "Usage:" | |
| echo " $0 -i <apk_file> Install Magisk from specified APK file" | |
| echo " $0 -p|--prebuilt Download and install prebuilt Magisk APK" | |
| echo " $0 -h|--help Show this help message" | |
| } | |
| # Parse arguments | |
| apk_file="" | |
| use_prebuilt=false | |
| while [[ $# -gt 0 ]]; do | |
| case $1 in | |
| -i) | |
| apk_file="$2" | |
| shift 2 | |
| ;; | |
| -p|--prebuilt) | |
| use_prebuilt=true | |
| shift | |
| ;; | |
| -h|--help) | |
| show_help | |
| exit 0 | |
| ;; | |
| *) | |
| echo "Error: Unknown option $1" | |
| show_help | |
| exit 1 | |
| ;; | |
| esac | |
| done | |
| # Validate arguments | |
| if [[ "$use_prebuilt" == "true" ]]; then | |
| # Prebuilt mode: download APK to cache directory | |
| cache_dir="$HOME/.cache" | |
| mkdir -p "$cache_dir" | |
| apk_filename=$(basename "$link") | |
| apk_file="$cache_dir/$apk_filename" | |
| echo "Downloading prebuilt Magisk APK..." | |
| if ! wget -O "$apk_file" "$link"; then | |
| echo "Error: Download failed" | |
| exit 1 | |
| fi | |
| echo "Download completed: $apk_file" | |
| # Verify SHA256 checksum | |
| echo "Verifying file integrity..." | |
| calculated_hash=$(sha256sum "$apk_file" | cut -d' ' -f1) | |
| if [[ "$calculated_hash" != "$sha256" ]]; then | |
| echo "Error: SHA256 verification failed" | |
| echo "Expected: $sha256" | |
| echo "Actual: $calculated_hash" | |
| rm -f "$apk_file" | |
| exit 1 | |
| fi | |
| echo "SHA256 verification passed" | |
| elif [[ -n "$apk_file" ]]; then | |
| # Verify specified APK file exists | |
| if [[ ! -f "$apk_file" ]]; then | |
| echo "Error: APK file does not exist: $apk_file" | |
| exit 1 | |
| fi | |
| else | |
| echo "Error: Must specify -i <apk_file> or -p/--prebuilt" | |
| show_help | |
| exit 1 | |
| fi | |
| # Setup working directories | |
| basedir=$(dirname "$(realpath "$apk_file")") | |
| srcdir="$basedir/unpack" | |
| pkgdir="/var/lib/waydroid/overlay" | |
| magisk_dir="$pkgdir/system/etc/init/magisk" | |
| # Clean previous extraction directory | |
| rm -rf "$srcdir" | |
| arch=$(uname -m) | |
| case "$arch" in | |
| i386|i686) | |
| mapped_arch="x86" | |
| bit=32 | |
| ;; | |
| x86_64) | |
| mapped_arch="x86_64" | |
| bit=64 | |
| ;; | |
| armv7l|armv6l) | |
| mapped_arch="armeabi-v7a" | |
| bit=32 | |
| ;; | |
| aarch64) | |
| mapped_arch="arm64-v8a" | |
| bit=64 | |
| ;; | |
| *) | |
| echo "unknown: $arch" | |
| exit 1 | |
| ;; | |
| esac | |
| lib_dir="$srcdir/lib/$mapped_arch" | |
| echo "Preparing installation directories..." | |
| sudo mkdir -p "$magisk_dir" | |
| sudo mkdir -p "$pkgdir/sbin" | |
| echo "Extracting APK file..." | |
| unzip "$apk_file" -d "$srcdir" | |
| echo "Installing Magisk components..." | |
| sudo install -Dm755 "$lib_dir/libbusybox.so" "$magisk_dir/busybox" | |
| sudo install -Dm755 "$lib_dir/libmagisk.so" "$magisk_dir/magisk" | |
| sudo install -Dm755 "$lib_dir/libmagiskboot.so" "$magisk_dir/magiskboot" | |
| sudo install -Dm755 "$lib_dir/libmagiskinit.so" "$magisk_dir/magiskinit" | |
| sudo install -Dm755 "$lib_dir/libmagiskpolicy.so" "$magisk_dir/magiskpolicy" | |
| sudo install -Dm755 "$srcdir/assets/chromeos/futility" "$magisk_dir/chromeos/futility" | |
| sudo install -Dm755 "$srcdir/assets/chromeos/kernel.keyblock" "$magisk_dir/chromeos/kernel.keyblock" | |
| sudo install -Dm755 "$srcdir/assets/chromeos/kernel_data_key.vbprivk" "$magisk_dir/chromeos/kernel_data_key.vbprivk" | |
| sudo install -Dm755 "$srcdir/assets/addon.d.sh" "$magisk_dir/addon.d.sh" | |
| sudo install -Dm755 "$srcdir/assets/boot_patch.sh" "$magisk_dir/boot_patch.sh" | |
| sudo install -Dm755 "$srcdir/assets/stub.apk" "$magisk_dir/stub.apk" | |
| sudo install -Dm755 "$srcdir/assets/util_functions.sh" "$magisk_dir/util_functions.sh" | |
| sudo install -Dm644 bootanim.rc "$pkgdir/system/etc/init/bootanim.rc" | |
| sudo install -Dm755 "$apk_file" "$magisk_dir/magisk.apk" | |
| echo "Configuring boot scripts..." | |
| sudo sed -e "s/\$MAGISKSYSTEMDIR/\/system\/etc\/init\/magisk/g" -e "s/\$MAGISKTMP/\/sbin/g" -e "s/\$magisk_name/magisk/g" -i "$pkgdir/system/etc/init/bootanim.rc" | |
| echo "Setting file permissions..." | |
| sudo chown 2000:root -R "$magisk_dir" | |
| echo "Copying to ADB directory..." | |
| sudo mkdir -p ~/.local/share/waydroid/data/adb | |
| sudo cp -rf "$pkgdir/system/etc/init/magisk" ~/.local/share/waydroid/data/adb | |
| # Clean up temporary files | |
| echo "Cleaning up temporary files..." | |
| rm -rf "$srcdir" | |
| echo "Magisk installation completed!" | |
| echo "APK file used: $apk_file" | |
| echo "Architecture: $mapped_arch (${bit}-bit)" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| From c53a4704c087d924916a546c783286426aaef8f7 Mon Sep 17 00:00:00 2001 | |
| From: rikka <[email protected]> | |
| Date: Fri, 8 Aug 2025 04:24:06 +0800 | |
| Subject: [PATCH 01/16] support installing into system partition | |
| --- | |
| .../magisk/ui/flash/FlashFragment.kt | 8 +- | |
| .../magisk/ui/flash/FlashViewModel.kt | 3 + | |
| .../magisk/ui/install/InstallViewModel.kt | 6 +- | |
| .../main/res/layout/fragment_install_md2.xml | 8 + | |
| .../java/com/topjohnwu/magisk/core/Const.kt | 1 + | |
| .../java/com/topjohnwu/magisk/core/Info.kt | 2 + | |
| .../magisk/core/tasks/MagiskInstaller.kt | 11 +- | |
| app/core/src/main/res/values/strings.xml | 1 + | |
| native/src/Android.mk | 3 +- | |
| native/src/base/Android.mk | 1 + | |
| native/src/base/cus.cpp | 57 ++++ | |
| native/src/base/cus.hpp | 9 + | |
| native/src/base/include/base.hpp | 1 + | |
| native/src/core/deny/revert.cpp | 115 +++++++ | |
| native/src/core/include/core.hpp | 4 + | |
| native/src/core/lib.rs | 2 + | |
| native/src/core/magisk.rs | 144 +++++++- | |
| native/src/init/init.rs | 16 +- | |
| native/src/init/lib.rs | 30 ++ | |
| scripts/addon.d.sh | 104 +++--- | |
| scripts/app_functions.sh | 321 +++++++++++++++++- | |
| scripts/flash_script.sh | 60 +++- | |
| scripts/uninstaller.sh | 105 +++++- | |
| scripts/util_functions.sh | 46 +++ | |
| 24 files changed, 995 insertions(+), 63 deletions(-) | |
| create mode 100644 native/src/base/cus.cpp | |
| create mode 100644 native/src/base/cus.hpp | |
| create mode 100644 native/src/core/deny/revert.cpp | |
| diff --git a/app/apk/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt b/app/apk/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt | |
| index 7231a9b9f..de71f6752 100644 | |
| --- a/app/apk/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt | |
| +++ b/app/apk/src/main/java/com/topjohnwu/magisk/ui/flash/FlashFragment.kt | |
| @@ -111,12 +111,14 @@ class FlashFragment : BaseFragment<FragmentFlashMd2Binding>(), MenuProvider { | |
| .setArguments(args.toBundle()) | |
| .createPendingIntent() | |
| - private fun flashType(isSecondSlot: Boolean) = | |
| - if (isSecondSlot) Const.Value.FLASH_INACTIVE_SLOT else Const.Value.FLASH_MAGISK | |
| + private fun flashType(isSecondSlot: Int) = | |
| + if (isSecondSlot == 1) Const.Value.FLASH_INACTIVE_SLOT | |
| + else if (isSecondSlot == 2) Const.Value.FLASH_MAGISK_SYSTEM | |
| + else Const.Value.FLASH_MAGISK | |
| /* Flashing is understood as installing / flashing magisk itself */ | |
| - fun flash(isSecondSlot: Boolean) = MainDirections.actionFlashFragment( | |
| + fun flash(isSecondSlot: Int) = MainDirections.actionFlashFragment( | |
| action = flashType(isSecondSlot) | |
| ) | |
| diff --git a/app/apk/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt b/app/apk/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt | |
| index 56704d869..3466c5089 100644 | |
| --- a/app/apk/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt | |
| +++ b/app/apk/src/main/java/com/topjohnwu/magisk/ui/flash/FlashViewModel.kt | |
| @@ -71,6 +71,9 @@ class FlashViewModel : BaseViewModel() { | |
| else | |
| MagiskInstaller.Direct(outItems, logItems).exec() | |
| } | |
| + Const.Value.FLASH_MAGISK_SYSTEM -> { | |
| + MagiskInstaller.Direct_system(outItems, logItems).exec() | |
| + } | |
| Const.Value.FLASH_INACTIVE_SLOT -> { | |
| showReboot = false | |
| MagiskInstaller.SecondSlot(outItems, logItems).exec() | |
| diff --git a/app/apk/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt b/app/apk/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt | |
| index 6508ce4e1..867bf51bf 100644 | |
| --- a/app/apk/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt | |
| +++ b/app/apk/src/main/java/com/topjohnwu/magisk/ui/install/InstallViewModel.kt | |
| @@ -39,6 +39,7 @@ class InstallViewModel(svc: NetworkService, markwon: Markwon) : BaseViewModel() | |
| val isRooted get() = Info.isRooted | |
| val skipOptions = Info.isEmulator || (Info.isSAR && !Info.isFDE && Info.ramdisk) | |
| val noSecondSlot = !isRooted || !Info.isAB || Info.isEmulator | |
| + val allowSystemInstall = isRooted && !Info.isBootPatched | |
| @get:Bindable | |
| var step = if (skipOptions) 1 else 0 | |
| @@ -92,8 +93,9 @@ class InstallViewModel(svc: NetworkService, markwon: Markwon) : BaseViewModel() | |
| fun install() { | |
| when (method) { | |
| R.id.method_patch -> FlashFragment.patch(data.value!!).navigate(true) | |
| - R.id.method_direct -> FlashFragment.flash(false).navigate(true) | |
| - R.id.method_inactive_slot -> FlashFragment.flash(true).navigate(true) | |
| + R.id.method_direct -> FlashFragment.flash(0).navigate(true) | |
| + R.id.method_inactive_slot -> FlashFragment.flash(1).navigate(true) | |
| + R.id.method_direct_system -> FlashFragment.flash(2).navigate(true) | |
| else -> error("Unknown value") | |
| } | |
| } | |
| diff --git a/app/apk/src/main/res/layout/fragment_install_md2.xml b/app/apk/src/main/res/layout/fragment_install_md2.xml | |
| index 7a7364379..aade1053e 100644 | |
| --- a/app/apk/src/main/res/layout/fragment_install_md2.xml | |
| +++ b/app/apk/src/main/res/layout/fragment_install_md2.xml | |
| @@ -198,6 +198,14 @@ | |
| android:layout_height="wrap_content" | |
| android:text="@string/direct_install" /> | |
| + <RadioButton | |
| + android:id="@+id/method_direct_system" | |
| + style="@style/WidgetFoundation.RadioButton" | |
| + gone="@{!viewModel.allowSystemInstall}" | |
| + android:layout_width="match_parent" | |
| + android:layout_height="wrap_content" | |
| + android:text="@string/direct_install_system" /> | |
| + | |
| <RadioButton | |
| android:id="@+id/method_inactive_slot" | |
| style="@style/WidgetFoundation.RadioButton" | |
| diff --git a/app/core/src/main/java/com/topjohnwu/magisk/core/Const.kt b/app/core/src/main/java/com/topjohnwu/magisk/core/Const.kt | |
| index e6f432d29..5738ab935 100644 | |
| --- a/app/core/src/main/java/com/topjohnwu/magisk/core/Const.kt | |
| +++ b/app/core/src/main/java/com/topjohnwu/magisk/core/Const.kt | |
| @@ -57,6 +57,7 @@ object Const { | |
| const val FLASH_ZIP = "flash" | |
| const val PATCH_FILE = "patch" | |
| const val FLASH_MAGISK = "magisk" | |
| + const val FLASH_MAGISK_SYSTEM = "magisk_system" | |
| const val FLASH_INACTIVE_SLOT = "slot" | |
| const val UNINSTALL = "uninstall" | |
| } | |
| diff --git a/app/core/src/main/java/com/topjohnwu/magisk/core/Info.kt b/app/core/src/main/java/com/topjohnwu/magisk/core/Info.kt | |
| index 8aa8df540..1ef6964b4 100644 | |
| --- a/app/core/src/main/java/com/topjohnwu/magisk/core/Info.kt | |
| +++ b/app/core/src/main/java/com/topjohnwu/magisk/core/Info.kt | |
| @@ -36,6 +36,7 @@ object Info { | |
| var isRooted = false | |
| var noDataExec = false | |
| var patchBootVbmeta = false | |
| + var isBootPatched = false | |
| @JvmStatic var env = Env() | |
| private set | |
| @@ -116,6 +117,7 @@ object Info { | |
| slot = getVar("SLOT") | |
| legacySAR = getBool("LEGACYSAR") | |
| isVendorBoot = getBool("VENDORBOOT") | |
| + isBootPatched = getBool("BOOTIMAGE_PATCHED") | |
| // Default presets | |
| Config.recovery = getBool("RECOVERYMODE") | |
| diff --git a/app/core/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt b/app/core/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt | |
| index 4468d3a9c..8bbd0dc5f 100644 | |
| --- a/app/core/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt | |
| +++ b/app/core/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt | |
| @@ -553,7 +553,7 @@ abstract class MagiskInstallImpl protected constructor( | |
| return isSuccess | |
| } | |
| - private fun flashBoot() = "direct_install $installDir $srcBoot".sh().isSuccess | |
| + private fun flashBoot() = "direct_install \"$installDir\" \"$srcBoot\" \"$AppApkPath\"".sh().isSuccess | |
| private suspend fun postOTA(): Boolean { | |
| try { | |
| @@ -583,6 +583,8 @@ abstract class MagiskInstallImpl protected constructor( | |
| protected suspend fun direct() = findImage() && extractFiles() && patchBoot() && flashBoot() | |
| + protected suspend fun direct_system() = extractFiles() && "xdirect_install_system \"$installDir\" \"dummy\" \"$AppApkPath\"".sh().isSuccess | |
| + | |
| protected suspend fun secondSlot() = | |
| findSecondary() && extractFiles() && patchBoot() && flashBoot() && postOTA() | |
| @@ -662,6 +664,13 @@ class MagiskInstaller { | |
| override suspend fun operations() = direct() | |
| } | |
| + class Direct_system( | |
| + console: MutableList<String>, | |
| + logs: MutableList<String> | |
| + ) : MagiskInstaller(console, logs) { | |
| + override suspend fun operations() = direct_system() | |
| + } | |
| + | |
| class Emulator( | |
| console: MutableList<String>, | |
| logs: MutableList<String> | |
| diff --git a/app/core/src/main/res/values/strings.xml b/app/core/src/main/res/values/strings.xml | |
| index 19c56810c..f247e7fbd 100644 | |
| --- a/app/core/src/main/res/values/strings.xml | |
| +++ b/app/core/src/main/res/values/strings.xml | |
| @@ -40,6 +40,7 @@ | |
| <string name="install_start">Let\'s go</string> | |
| <string name="manager_download_install">Press to download and install</string> | |
| <string name="direct_install">Direct install (Recommended)</string> | |
| + <string name="direct_install_system">Direct Install to System</string> | |
| <string name="install_inactive_slot">Install to inactive slot (After OTA)</string> | |
| <string name="install_inactive_slot_msg">Your device will be FORCED to boot to the current inactive slot after a reboot!\nOnly use this option after OTA is done.\nContinue?</string> | |
| <string name="setup_title">Additional setup</string> | |
| diff --git a/native/src/Android.mk b/native/src/Android.mk | |
| index 37e2fce53..e6b7f763d 100644 | |
| --- a/native/src/Android.mk | |
| +++ b/native/src/Android.mk | |
| @@ -27,7 +27,8 @@ LOCAL_SRC_FILES := \ | |
| core/zygisk/hook.cpp \ | |
| core/deny/cli.cpp \ | |
| core/deny/utils.cpp \ | |
| - core/deny/logcat.cpp | |
| + core/deny/logcat.cpp \ | |
| + core/deny/revert.cpp | |
| LOCAL_LDLIBS := -llog | |
| LOCAL_LDFLAGS := -Wl,--dynamic-list=src/exported_sym.txt | |
| diff --git a/native/src/base/Android.mk b/native/src/base/Android.mk | |
| index 652e2dd7d..54634421a 100644 | |
| --- a/native/src/base/Android.mk | |
| +++ b/native/src/base/Android.mk | |
| @@ -14,5 +14,6 @@ LOCAL_STATIC_LIBRARIES := libcxx | |
| LOCAL_SRC_FILES := \ | |
| base.cpp \ | |
| base-rs.cpp \ | |
| + cus.cpp \ | |
| ../external/cxx-rs/src/cxx.cc | |
| include $(BUILD_STATIC_LIBRARY) | |
| diff --git a/native/src/base/cus.cpp b/native/src/base/cus.cpp | |
| new file mode 100644 | |
| index 000000000..2b4602759 | |
| --- /dev/null | |
| +++ b/native/src/base/cus.cpp | |
| @@ -0,0 +1,57 @@ | |
| +#include <sys/types.h> | |
| +#include <sys/mount.h> | |
| +#include <sys/stat.h> | |
| +#include <unistd.h> | |
| +#include <fcntl.h> | |
| +#include <signal.h> | |
| +#include <iostream> | |
| + | |
| +#include <base.hpp> | |
| + | |
| +#define GET_CURRENT_FAILED "null" | |
| +#define SET_CURRENT_FAILED -1 | |
| +#define SET_CURRENT_SUCCESS 0 | |
| +#define READ 0 | |
| +#define WRITE 1 | |
| + | |
| +#define VLOGDG(tag, from, to) LOGD("%-8s: %s <- %s\n", tag, to, from) | |
| + | |
| +using namespace std; | |
| + | |
| +std::string getcurrent() { | |
| + int fd = open("/proc/self/attr/current", O_RDONLY); | |
| + if (fd < 0) return GET_CURRENT_FAILED; | |
| + char buf[1024] = {}; | |
| + read(fd, buf, sizeof(buf)); | |
| + return std::string(buf); | |
| +} | |
| + | |
| +int setcurrent(const char *con) { | |
| + int fd = open("/proc/self/attr/current", O_WRONLY); | |
| + if (fd < 0) return SET_CURRENT_FAILED; | |
| + return (write(fd, con, strlen(con)+1) > 0)? SET_CURRENT_SUCCESS : SET_CURRENT_FAILED; | |
| +} | |
| + | |
| + | |
| + | |
| +bool is_dir_exist(const char *s){ | |
| + struct stat st; | |
| + if(stat(s,&st) == 0) | |
| + if((st.st_mode & S_IFDIR) != 0) | |
| + return true; | |
| + return false; | |
| +} | |
| + | |
| +int bind_mount_(const char *from, const char *to) { | |
| + int ret = xmount(from, to, nullptr, MS_BIND, nullptr); | |
| + if (ret == 0) | |
| + VLOGDG("bind_mnt", from, to); | |
| + return ret; | |
| +} | |
| + | |
| +int tmpfs_mount(Utf8CStr from, Utf8CStr to){ | |
| + int ret = xmount(from.c_str(), to.c_str(), "tmpfs", 0, "mode=755"); | |
| + if (ret == 0) | |
| + VLOGDG("mnt_tmp", "tmpfs", to.c_str()); | |
| + return ret; | |
| +} | |
| \ No newline at end of file | |
| diff --git a/native/src/base/cus.hpp b/native/src/base/cus.hpp | |
| new file mode 100644 | |
| index 000000000..18f617371 | |
| --- /dev/null | |
| +++ b/native/src/base/cus.hpp | |
| @@ -0,0 +1,9 @@ | |
| +#pragma once | |
| +#include <sys/wait.h> | |
| +#include <signal.h> | |
| + | |
| +bool is_dir_exist(const char *s); | |
| +int bind_mount_(const char *from, const char *to); | |
| +int tmpfs_mount(Utf8CStr from, Utf8CStr to); | |
| +int setcurrent(const char *con); | |
| +std::string getcurrent(); | |
| \ No newline at end of file | |
| diff --git a/native/src/base/include/base.hpp b/native/src/base/include/base.hpp | |
| index 649676c99..0fefedec2 100644 | |
| --- a/native/src/base/include/base.hpp | |
| +++ b/native/src/base/include/base.hpp | |
| @@ -5,6 +5,7 @@ | |
| #include "../base-rs.hpp" | |
| #include "../files.hpp" | |
| #include "../logging.hpp" | |
| +#include "../cus.hpp" | |
| using rust::xpipe2; | |
| using kv_pairs = std::vector<std::pair<std::string, std::string>>; | |
| diff --git a/native/src/core/deny/revert.cpp b/native/src/core/deny/revert.cpp | |
| new file mode 100644 | |
| index 000000000..04342a1c0 | |
| --- /dev/null | |
| +++ b/native/src/core/deny/revert.cpp | |
| @@ -0,0 +1,115 @@ | |
| +#include <set> | |
| +#include <sys/mount.h> | |
| +#include <sys/wait.h> | |
| +#include <unistd.h> | |
| +#include <sys/stat.h> | |
| + | |
| +#include <consts.hpp> | |
| +#include <base.hpp> | |
| +#include <core.hpp> | |
| +#include <selinux.hpp> | |
| + | |
| +#include <link.h> | |
| + | |
| +#include "deny.hpp" | |
| + | |
| +using namespace std; | |
| + | |
| +#include <sys/stat.h> | |
| +#include <unistd.h> | |
| +#include <errno.h> | |
| +#include <sys/vfs.h> | |
| + | |
| +#define VLOGD(tag, from, to) LOGD("%-8s: %s <- %s\n", tag, to, from) | |
| + | |
| +bool is_rootfs() | |
| +{ | |
| +#define TST_RAMFS_MAGIC 0x858458f6 | |
| +#define TST_TMPFS_MAGIC 0x01021994 | |
| +#define TST_OVERLAYFS_MAGIC 0x794c7630 | |
| + const char *path= "/"; | |
| + struct statfs s; | |
| + statfs(path, &s); | |
| + | |
| + switch (s.f_type) { | |
| + case TST_TMPFS_MAGIC: | |
| + case TST_RAMFS_MAGIC: | |
| + case TST_OVERLAYFS_MAGIC: | |
| + return true; | |
| + default: | |
| + return false; | |
| + } | |
| +} | |
| + | |
| +static bool system_lnk(const char *path){ | |
| + char buff[4098]; | |
| + ssize_t len = readlink(path, buff, sizeof(buff)-1); | |
| + if (len != -1) { | |
| + return true; | |
| + } | |
| + return false; | |
| +} | |
| + | |
| +void recreate_sbin_v2(const char *mirror, bool use_bind_mount) { | |
| + auto dp = xopen_dir(mirror); | |
| + int src = dirfd(dp.get()); | |
| + char buf[4096]; | |
| + char mbuf[4096]; | |
| + for (dirent *entry; (entry = xreaddir(dp.get()));) { | |
| + string sbin_path = "/sbin/"s + entry->d_name; | |
| + struct stat st; | |
| + fstatat(src, entry->d_name, &st, AT_SYMLINK_NOFOLLOW); | |
| + sprintf(buf, "%s/%s", mirror, entry->d_name); | |
| + sprintf(mbuf, "%s/%s", get_magisk_tmp(), entry->d_name); | |
| + if (access(mbuf, F_OK) == 0) continue; | |
| + if (S_ISLNK(st.st_mode)) { | |
| + xreadlinkat(src, entry->d_name, buf, sizeof(buf)); | |
| + xsymlink(buf, sbin_path.data()); | |
| + VLOGD("create", buf, sbin_path.data()); | |
| + } else { | |
| + if (use_bind_mount) { | |
| + auto mode = st.st_mode & 0777; | |
| + // Create dummy | |
| + if (S_ISDIR(st.st_mode)) | |
| + xmkdir(sbin_path.data(), mode); | |
| + else | |
| + close(xopen(sbin_path.data(), O_CREAT | O_WRONLY | O_CLOEXEC, mode)); | |
| + | |
| + bind_mount_(buf, sbin_path.data()); | |
| + } else { | |
| + xsymlink(buf, sbin_path.data()); | |
| + VLOGD("create", buf, sbin_path.data()); | |
| + } | |
| + } | |
| + } | |
| +} | |
| + | |
| +int mount_sbin() { | |
| + if (is_rootfs()){ | |
| + if (xmount(nullptr, "/", nullptr, MS_REMOUNT, nullptr) != 0) return -1; | |
| + mkdir("/sbin", 0750); | |
| + rm_rf("/root"); | |
| + mkdir("/root", 0750); | |
| + clone_attr("/sbin", "/root"); | |
| + link_path("/sbin", "/root"); | |
| + if (tmpfs_mount("magisk", "/sbin") != 0) return -1; | |
| + setfilecon("/sbin", "u:object_r:rootfs:s0"); | |
| + recreate_sbin_v2("/root", false); | |
| + xmount(nullptr, "/", nullptr, MS_REMOUNT | MS_RDONLY, nullptr); | |
| + } else { | |
| + if (tmpfs_mount("magisk", "/sbin") != 0) return -1; | |
| + setfilecon("/sbin", "u:object_r:rootfs:s0"); | |
| + xmkdir("/sbin/" INTLROOT, 0755); | |
| + xmkdir("/sbin/" MIRRDIR, 0755); | |
| + xmkdir("/sbin/" MIRRDIR "/system_root", 0755); | |
| + xmount("/", "/sbin/" MIRRDIR "/system_root", nullptr, MS_BIND, nullptr); | |
| + recreate_sbin_v2("/sbin/" MIRRDIR "/system_root/sbin", true); | |
| + umount2("/sbin/" MIRRDIR "/system_root", MNT_DETACH); | |
| + } | |
| + return 0; | |
| +} | |
| + | |
| +static void lazy_unmount(const char* mountpoint) { | |
| + if (umount2(mountpoint, MNT_DETACH) != -1) | |
| + LOGD("denylist: Unmounted (%s)\n", mountpoint); | |
| +} | |
| diff --git a/native/src/core/include/core.hpp b/native/src/core/include/core.hpp | |
| index ee42f1ae4..a7e099595 100644 | |
| --- a/native/src/core/include/core.hpp | |
| +++ b/native/src/core/include/core.hpp | |
| @@ -84,6 +84,10 @@ void update_deny_flags(int uid, rust::Str process, uint32_t &flags); | |
| // MagiskSU | |
| void exec_root_shell(int client, int pid, SuRequest &req, MntNsMode mode); | |
| +// Mount operations | |
| +int mount_sbin(); | |
| +int tmpfs_mount(Utf8CStr from, Utf8CStr to); | |
| + | |
| // Rust bindings | |
| inline Utf8CStr get_magisk_tmp_rs() { return get_magisk_tmp(); } | |
| inline rust::String resolve_preinit_dir_rs(Utf8CStr base_dir) { | |
| diff --git a/native/src/core/lib.rs b/native/src/core/lib.rs | |
| index e031f8ff2..94e13e190 100644 | |
| --- a/native/src/core/lib.rs | |
| +++ b/native/src/core/lib.rs | |
| @@ -149,6 +149,8 @@ pub mod ffi { | |
| fn resolve_preinit_dir(base_dir: Utf8CStrRef) -> String; | |
| fn check_key_combo() -> bool; | |
| fn unlock_blocks(); | |
| + fn mount_sbin() -> i32; | |
| + fn tmpfs_mount(from: Utf8CStrRef, to: Utf8CStrRef) -> i32; | |
| fn update_deny_flags(uid: i32, process: &str, flags: &mut u32); | |
| fn initialize_denylist(); | |
| fn switch_mnt_ns(pid: i32) -> i32; | |
| diff --git a/native/src/core/magisk.rs b/native/src/core/magisk.rs | |
| index dfa7a8b04..11d0b556f 100644 | |
| --- a/native/src/core/magisk.rs | |
| +++ b/native/src/core/magisk.rs | |
| @@ -1,16 +1,37 @@ | |
| -use crate::consts::{APPLET_NAMES, MAGISK_VER_CODE, MAGISK_VERSION, POST_FS_DATA_WAIT_TIME}; | |
| +use crate::consts::{APPLET_NAMES, DEVICEDIR, INTERNAL_DIR, MAGISK_PROC_CON, MAGISK_VER_CODE, MAGISK_VERSION, POST_FS_DATA_WAIT_TIME}; | |
| use crate::daemon::connect_daemon; | |
| -use crate::ffi::{RequestCode, denylist_cli, get_magisk_tmp, install_module, unlock_blocks}; | |
| +use crate::ffi::{RequestCode, denylist_cli, get_magisk_tmp, install_module, mount_sbin, tmpfs_mount, unlock_blocks}; | |
| use crate::mount::find_preinit_device; | |
| use crate::selinux::restorecon; | |
| use crate::socket::{Decodable, Encodable}; | |
| use argh::FromArgs; | |
| -use base::{CmdArgs, EarlyExitExt, LoggedResult, Utf8CString, argh, clone_attr}; | |
| +use base::{CmdArgs, EarlyExitExt, LoggedResult, Utf8CString, argh, clone_attr, cstr}; | |
| use nix::poll::{PollFd, PollFlags, PollTimeout}; | |
| use std::ffi::c_char; | |
| +use std::fs; | |
| use std::os::fd::AsFd; | |
| +use std::os::unix::fs::{PermissionsExt, symlink}; | |
| use std::process::exit; | |
| +/// 在指定路径创建 applet 符号链接 | |
| +fn install_applet(path: &str) -> LoggedResult<()> { | |
| + let path_obj = std::path::Path::new(path); | |
| + | |
| + // 为每个 applet 创建符号链接 | |
| + for name in APPLET_NAMES { | |
| + let link_path = path_obj.join(name); | |
| + let _ = fs::remove_file(&link_path); // 删除可能存在的旧链接 | |
| + symlink("./magisk", &link_path)?; | |
| + } | |
| + | |
| + // 创建 supolicy 符号链接 | |
| + let supolicy_path = path_obj.join("supolicy"); | |
| + let _ = fs::remove_file(&supolicy_path); | |
| + symlink("./magiskpolicy", &supolicy_path)?; | |
| + | |
| + Ok(()) | |
| +} | |
| + | |
| fn print_usage() { | |
| eprintln!( | |
| r#"Magisk - Multi-purpose Utility | |
| @@ -76,6 +97,9 @@ enum MagiskAction { | |
| Path(PathCmd), | |
| DenyList(DenyList), | |
| PreInitDevice(PreInitDevice), | |
| + MountSbin(MountSbin), | |
| + SetupSbin(SetupSbin), | |
| + Install(InstallApplets), | |
| } | |
| #[derive(FromArgs)] | |
| @@ -180,6 +204,26 @@ struct DenyList { | |
| #[argh(subcommand, name = "--preinit-device")] | |
| struct PreInitDevice {} | |
| +#[derive(FromArgs)] | |
| +#[argh(subcommand, name = "--mount-sbin")] | |
| +struct MountSbin {} | |
| + | |
| +#[derive(FromArgs)] | |
| +#[argh(subcommand, name = "--setup-sbin")] | |
| +struct SetupSbin { | |
| + #[argh(positional)] | |
| + source_dir: Utf8CString, | |
| + #[argh(positional)] | |
| + target_dir: Option<Utf8CString>, | |
| +} | |
| + | |
| +#[derive(FromArgs)] | |
| +#[argh(subcommand, name = "--install")] | |
| +struct InstallApplets { | |
| + #[argh(positional)] | |
| + path: Option<Utf8CString>, | |
| +} | |
| + | |
| impl MagiskAction { | |
| fn exec(self) -> LoggedResult<i32> { | |
| use MagiskAction::*; | |
| @@ -280,6 +324,59 @@ impl MagiskAction { | |
| println!("{name}"); | |
| } | |
| } | |
| + MountSbin(_) => { | |
| + return Ok(mount_sbin()); | |
| + } | |
| + SetupSbin(self::SetupSbin { source_dir, target_dir }) => { | |
| + let magisk_tmp_cstr; | |
| + let magisk_tmp = if let Some(ref dir) = target_dir { | |
| + magisk_tmp_cstr = dir; | |
| + magisk_tmp_cstr.as_str() | |
| + } else { | |
| + "/sbin" | |
| + }; | |
| + | |
| + if magisk_tmp == "/sbin" { | |
| + if mount_sbin() != 0 { | |
| + return Ok(-1); | |
| + } | |
| + } else { | |
| + let magisk_tmp_ref = target_dir.as_ref().unwrap(); | |
| + if tmpfs_mount(cstr!("magisk"), magisk_tmp_ref) != 0 { | |
| + return Ok(-1); | |
| + } | |
| + } | |
| + | |
| + let bins = ["magisk64", "magisk32", "magiskpolicy", "stub.apk"]; | |
| + for bin in &bins { | |
| + let src = Utf8CString::from(format!("{}/{}", source_dir, bin)); | |
| + let dest = Utf8CString::from(format!("{}/{}", magisk_tmp, bin)); | |
| + | |
| + if std::path::Path::new(src.as_str()).exists() { | |
| + src.copy_to(&dest)?; | |
| + let _ = fs::set_permissions(dest.as_str(), fs::Permissions::from_mode(0o755)); | |
| + } | |
| + } | |
| + | |
| + std::env::set_current_dir(magisk_tmp)?; | |
| + | |
| + cstr!(INTERNAL_DIR).mkdir(0o755)?; | |
| + cstr!(DEVICEDIR).mkdir(0)?; | |
| + | |
| + #[cfg(target_pointer_width = "64")] | |
| + simlink("./magisk64", "./magisk"); | |
| + #[cfg(target_pointer_width = "32")] | |
| + simlink("./magisk32", "./magisk"); | |
| + | |
| + install_applet(magisk_tmp)?; | |
| + } | |
| + Install(self::InstallApplets { path }) => { | |
| + let install_path = path | |
| + .as_ref() | |
| + .map(|s| s.as_str()) | |
| + .unwrap_or("/sbin"); | |
| + install_applet(install_path)?; | |
| + } | |
| }; | |
| Ok(0) | |
| } | |
| @@ -290,7 +387,48 @@ pub fn magisk_main(argc: i32, argv: *mut *mut c_char) -> i32 { | |
| print_usage(); | |
| exit(1); | |
| } | |
| + | |
| let mut cmds = CmdArgs::new(argc, argv.cast()).0; | |
| + | |
| + if cmds.len() >= 2 && cmds[1] == "--auto-selinux" { | |
| + use std::fs::OpenOptions; | |
| + use std::io::{Read, Write, Seek, SeekFrom}; | |
| + | |
| + if let Ok(mut file) = OpenOptions::new() | |
| + .read(true) | |
| + .write(true) | |
| + .open("/proc/self/attr/current") | |
| + { | |
| + if file.write_all(MAGISK_PROC_CON.as_bytes()).is_ok() { | |
| + let _ = file.seek(SeekFrom::Start(0)); | |
| + let mut current_con = [0u8; 128]; | |
| + if let Ok(n) = file.read(&mut current_con) { | |
| + if let Ok(con_str) = std::str::from_utf8(¤t_con[..n]) { | |
| + eprintln!("SeLinux context: {}", con_str.trim_end_matches('\0')); | |
| + } | |
| + } | |
| + } else { | |
| + let _ = file.seek(SeekFrom::Start(0)); | |
| + if file.write_all(b"u:r:su:s0").is_ok() { | |
| + let _ = file.seek(SeekFrom::Start(0)); | |
| + let mut current_con = [0u8; 128]; | |
| + if let Ok(n) = file.read(&mut current_con) { | |
| + if let Ok(con_str) = std::str::from_utf8(¤t_con[..n]) { | |
| + eprintln!("SeLinux context: {}", con_str.trim_end_matches('\0')); | |
| + } | |
| + } | |
| + } | |
| + } | |
| + } | |
| + | |
| + cmds.remove(1); | |
| + } | |
| + | |
| + if cmds.len() < 2 { | |
| + print_usage(); | |
| + exit(1); | |
| + } | |
| + | |
| // We need to manually inject "--" so that all actions can be treated as subcommands | |
| cmds.insert(1, "--"); | |
| let cli = Cli::from_args(&cmds[..1], &cmds[1..]).on_early_exit(print_usage); | |
| diff --git a/native/src/init/init.rs b/native/src/init/init.rs | |
| index 8dfdabe80..d8e0617b5 100644 | |
| --- a/native/src/init/init.rs | |
| +++ b/native/src/init/init.rs | |
| @@ -1,4 +1,4 @@ | |
| -use crate::ffi::{BootConfig, MagiskInit, backup_init, magisk_proxy_main}; | |
| +use crate::ffi::{BootConfig, MagiskInit, backup_init, magisk_proxy_main, patch_sepol}; | |
| use crate::logging::setup_klog; | |
| use crate::mount::is_rootfs; | |
| use crate::twostage::hexpatch_init_for_second_stage; | |
| @@ -181,6 +181,20 @@ pub unsafe extern "C" fn main( | |
| return magisk_proxy_main(argc, argv); | |
| } | |
| + // Handle --patch-sepol argument | |
| + if argc > 2 { | |
| + let arg1 = *argv.offset(1); | |
| + if !arg1.is_null() && CStr::from_ptr(arg1) == c"--patch-sepol" { | |
| + let input = *argv.offset(2); | |
| + let output = if argc > 3 { | |
| + *argv.offset(3) | |
| + } else { | |
| + input // Use input as output if no output specified | |
| + }; | |
| + return patch_sepol(input, output); | |
| + } | |
| + } | |
| + | |
| if getpid() == 1 { | |
| MagiskInit::new(argv).start().log_ok(); | |
| } | |
| diff --git a/native/src/init/lib.rs b/native/src/init/lib.rs | |
| index 3613b921e..1cc8219f4 100644 | |
| --- a/native/src/init/lib.rs | |
| +++ b/native/src/init/lib.rs | |
| @@ -7,6 +7,10 @@ pub use magiskpolicy; | |
| use mount::{is_device_mounted, switch_root}; | |
| use rootdir::{OverlayAttr, inject_magisk_rc}; | |
| +use std::ffi::CStr; | |
| +use base::libc::c_char; | |
| +use magiskpolicy::ffi::SePolicy; | |
| + | |
| #[path = "../include/consts.rs"] | |
| mod consts; | |
| mod getinfo; | |
| @@ -68,6 +72,7 @@ pub mod ffi { | |
| fn inject_magisk_rc(fd: i32, tmp_dir: Utf8CStrRef); | |
| fn switch_root(path: Utf8CStrRef); | |
| fn is_device_mounted(dev: u64, target: Pin<&mut CxxString>) -> bool; | |
| + unsafe fn patch_sepol(input: *const c_char, output: *const c_char) -> i32; | |
| } | |
| // BootConfig | |
| @@ -102,3 +107,28 @@ pub mod ffi { | |
| unsafe fn patch_fissiond(self: &mut MagiskInit, tmp_path: *const c_char); | |
| } | |
| } | |
| + | |
| +// Rust implementation of patch_sepol function | |
| +unsafe fn patch_sepol(input: *const c_char, output: *const c_char) -> i32 { | |
| + let input_path = match CStr::from_ptr(input).to_str() { | |
| + Ok(path) => path, | |
| + Err(_) => return 1, | |
| + }; | |
| + | |
| + let output_path = match CStr::from_ptr(output).to_str() { | |
| + Ok(path) => path, | |
| + Err(_) => return 1, | |
| + }; | |
| + | |
| + let sepol = match SePolicy::from_file(input_path) { | |
| + Ok(policy) => policy, | |
| + Err(_) => return 1, | |
| + }; | |
| + | |
| + sepol.magisk_rules(); | |
| + | |
| + match sepol.to_file(output_path) { | |
| + Ok(_) => 0, | |
| + Err(_) => 2, | |
| + } | |
| +} | |
| diff --git a/scripts/addon.d.sh b/scripts/addon.d.sh | |
| index d284a538a..99a6eaf92 100644 | |
| --- a/scripts/addon.d.sh | |
| +++ b/scripts/addon.d.sh | |
| @@ -7,44 +7,18 @@ | |
| # | |
| ######################################################## | |
| -trampoline() { | |
| - mount /data 2>/dev/null | |
| - if [ -f $MAGISKBIN/addon.d.sh ]; then | |
| - exec sh $MAGISKBIN/addon.d.sh "$@" | |
| - exit $? | |
| - elif [ "$1" = post-restore ]; then | |
| - BOOTMODE=false | |
| - ps | grep zygote | grep -v grep >/dev/null && BOOTMODE=true | |
| - $BOOTMODE || ps -A 2>/dev/null | grep zygote | grep -v grep >/dev/null && BOOTMODE=true | |
| - | |
| - if ! $BOOTMODE; then | |
| - # update-binary|updater <RECOVERY_API_VERSION> <OUTFD> <ZIPFILE> | |
| - OUTFD=$(ps | grep -v 'grep' | grep -oE 'update(.*) 3 [0-9]+' | cut -d" " -f3) | |
| - [ -z $OUTFD ] && OUTFD=$(ps -Af | grep -v 'grep' | grep -oE 'update(.*) 3 [0-9]+' | cut -d" " -f3) | |
| - # update_engine_sideload --payload=file://<ZIPFILE> --offset=<OFFSET> --headers=<HEADERS> --status_fd=<OUTFD> | |
| - [ -z $OUTFD ] && OUTFD=$(ps | grep -v 'grep' | grep -oE 'status_fd=[0-9]+' | cut -d= -f2) | |
| - [ -z $OUTFD ] && OUTFD=$(ps -Af | grep -v 'grep' | grep -oE 'status_fd=[0-9]+' | cut -d= -f2) | |
| - fi | |
| - ui_print() { | |
| - if $BOOTMODE; then | |
| - log -t Magisk -- "$1" | |
| - else | |
| - echo -e "ui_print $1\nui_print" >> /proc/self/fd/$OUTFD | |
| - fi | |
| - } | |
| +SYSTEMINSTALL=false | |
| - ui_print "***********************" | |
| - ui_print " Magisk addon.d failed" | |
| - ui_print "***********************" | |
| - ui_print "! Cannot find Magisk binaries - was data wiped or not decrypted?" | |
| - ui_print "! Reflash OTA from decrypted recovery or reflash Magisk" | |
| - fi | |
| - exit 1 | |
| -} | |
| +# Detect whether in boot mode | |
| +[ -z $BOOTMODE ] && ps | grep zygote | grep -qv grep && BOOTMODE=true | |
| +[ -z $BOOTMODE ] && ps -A 2>/dev/null | grep zygote | grep -qv grep && BOOTMODE=true | |
| +[ -z $BOOTMODE ] && BOOTMODE=false | |
| -# Always use the script in /data | |
| MAGISKBIN=/data/adb/magisk | |
| -[ "$0" = $MAGISKBIN/addon.d.sh ] || trampoline "$@" | |
| +MAGISKTMPDIR=/tmp/magisk | |
| +[ -z "$S" ] && S=/system | |
| +ADDOND="$S/addon.d" | |
| +APK="$S/addon.d/magisk/magisk.apk" | |
| V1_FUNCS=/tmp/backuptool.functions | |
| V2_FUNCS=/postinstall/tmp/backuptool.functions | |
| @@ -58,7 +32,35 @@ else | |
| return 1 | |
| fi | |
| +ui_print() { | |
| + if $BOOTMODE; then | |
| + echo "$1" | |
| + else | |
| + echo -e "ui_print $1\nui_print" >> /proc/self/fd/$OUTFD | |
| + fi | |
| +} | |
| + | |
| initialize() { | |
| + mount /data 2>/dev/null | |
| + local DATA=false | |
| + local DATA_DE=false | |
| + if grep ' /data ' /proc/mounts | grep -vq 'tmpfs'; then | |
| + # Test if data is writable | |
| + touch /data/.rw && rm /data/.rw && DATA=true | |
| + # Test if data is decrypted | |
| + $DATA && [ -d /data/adb ] && touch /data/adb/.rw && rm /data/adb/.rw && DATA_DE=true | |
| + $DATA_DE && [ -d /data/adb/magisk ] || mkdir /data/adb/magisk || DATA_DE=false | |
| + fi | |
| + if [ -d "$MAGISKTMPDIR" ]; then | |
| + MAGISKBIN="$MAGISKTMPDIR" | |
| + elif [ ! -d "$MAGISKBIN" ]; then | |
| + ui_print "***********************" | |
| + ui_print " Magisk addon.d failed" | |
| + ui_print "***********************" | |
| + ui_print "! Cannot find Magisk binaries - was data wiped or not decrypted?" | |
| + ui_print "! Reflash OTA from decrypted recovery or reflash Magisk" | |
| + exit 1 | |
| + fi | |
| # Load utility functions | |
| . $MAGISKBIN/util_functions.sh | |
| @@ -94,10 +96,14 @@ main() { | |
| print_title "Magisk $PRETTY_VER addon.d" | |
| mount_partitions | |
| - check_data | |
| get_flags | |
| if $backuptool_ab; then | |
| + # Restore PREINITDEVICE from previous A-only partition | |
| + if [ -f config.orig ]; then | |
| + PREINITDEVICE=$(grep_prop PREINITDEVICE config.orig) | |
| + rm config.orig | |
| + fi | |
| # Swap the slot for addon.d-v2 | |
| if [ ! -z $SLOT ]; then | |
| case $SLOT in | |
| @@ -115,7 +121,21 @@ main() { | |
| ui_print "- Device platform: $ABI" | |
| remove_system_su | |
| - install_magisk | |
| + chmod -R 755 $MAGISKBIN | |
| + if [ "$SYSTEMINSTALL" == "true" ];then | |
| + unzip -oj "$ADDOND/magisk/magisk.apk" "res/raw/manager.sh" | |
| + BOOTMODE_OLD="$BOOTMODE" | |
| + . ./manager.sh | |
| + BOOTMODE="$BOOTMODE_OLD" | |
| + . $MAGISKBIN/util_functions.sh | |
| + if $BOOTMODE; then | |
| + direct_install_system "$MAGISKBINTMP" || { cleanup_system_installation; unmount_system_mirrors; abort "! Installation failed"; } | |
| + else | |
| + direct_install_system "$MAGISKBINTMP" || { cleanup_system_installation; abort "! Installation failed"; } | |
| + fi | |
| + else | |
| + install_magisk | |
| + fi | |
| # Cleanups | |
| cd / | |
| @@ -128,7 +148,13 @@ main() { | |
| case "$1" in | |
| backup) | |
| - # Stub | |
| + rm -rf "$MAGISKTMPDIR" | |
| + if [ -d "$ADDOND/magisk" ] || [ -d "$S/etc/init/magisk" ]; then | |
| + mkdir -p "$MAGISKTMPDIR" | |
| + cp -af "$ADDOND/magisk/"* "$MAGISKTMPDIR" | |
| + cp -af "$S/etc/init/magisk/"* "$MAGISKTMPDIR" | |
| + mv "$MAGISKTMPDIR/boot_patch.sh.in" "$MAGISKTMPDIR/boot_patch.sh" | |
| + fi | |
| ;; | |
| restore) | |
| # Stub | |
| @@ -165,4 +191,4 @@ case "$1" in | |
| initialize | |
| main | |
| ;; | |
| -esac | |
| +esac | |
| \ No newline at end of file | |
| diff --git a/scripts/app_functions.sh b/scripts/app_functions.sh | |
| index b2e242e8f..e7791812c 100644 | |
| --- a/scripts/app_functions.sh | |
| +++ b/scripts/app_functions.sh | |
| @@ -17,7 +17,7 @@ env_check() { | |
| if [ "$2" -ge 25000 ]; then | |
| [ -f "$MAGISKBIN/magiskpolicy" ] || return 1 | |
| fi | |
| - if [ "$2" -ge 25210 ]; then | |
| + if [ "$2" -ge 25210 ] && [ -f "$MAGISKTMP/.magisk/config" ]; then | |
| [ -b "$MAGISKTMP/.magisk/device/preinit" ] || [ -b "$MAGISKTMP/.magisk/block/preinit" ] || return 2 | |
| fi | |
| grep -xqF "MAGISK_VER='$1'" "$MAGISKBIN/util_functions.sh" || return 3 | |
| @@ -58,6 +58,44 @@ fix_env() { | |
| # $1 = install dir | |
| # $2 = boot partition | |
| +install_addond(){ | |
| + local installDir="$MAGISKBIN" | |
| + local AppApkPath="$1" | |
| + local SYSTEM_INSTALL="$2" | |
| + [ -z "$SYSTEM_INSTALL" ] && SYSTEM_INSTALL=false | |
| + addond=/system/addon.d | |
| + test ! -d $addond && return | |
| + ui_print "- Adding addon.d survival script" | |
| + BLOCKNAME="/dev/block/system_block.$(random_str 5 20)" | |
| + rm -rf "$BLOCKNAME" | |
| + if is_rootfs; then | |
| + mkblknode "$BLOCKNAME" /system | |
| + else | |
| + mkblknode "$BLOCKNAME" / | |
| + fi | |
| + blockdev --setrw "$BLOCKNAME" | |
| + rm -rf "$BLOCKNAME" | |
| + mount -o rw,remount / | |
| + mount -o rw,remount /system | |
| + rm -rf $addond/99-magisk.sh 2>/dev/null | |
| + rm -rf $addond/magisk 2>/dev/null | |
| + if [ "$SYSTEM_INSTALL" == "true" ]; then | |
| + cp -prLf "$installDir"/. /system/etc/init/magisk || { ui_print "! Failed to install addon.d"; return; } | |
| + mv "$installDir/addon.d.sh" $addond/99-magisk.sh | |
| + cp "$AppApkPath" /system/etc/init/magisk/magisk.apk | |
| + chmod 755 /system/etc/init/magisk/* | |
| + sed -i "s/^SYSTEMINSTALL=.*/SYSTEMINSTALL=true/g" $addond/99-magisk.sh | |
| + else | |
| + mkdir -p $addond/magisk | |
| + cp -prLf "$installDir"/. $addond/magisk || { ui_print "! Failed to install addon.d"; return; } | |
| + mv $addond/magisk/boot_patch.sh $addond/magisk/boot_patch.sh.in | |
| + mv $addond/magisk/addon.d.sh $addond/99-magisk.sh | |
| + cp "$AppApkPath" $addond/magisk/magisk.apk | |
| + fi | |
| + mount -o ro,remount / | |
| + mount -o ro,remount /system | |
| +} | |
| + | |
| direct_install() { | |
| echo "- Flashing new boot image" | |
| flash_image $1/new-boot.img $2 | |
| @@ -75,7 +113,7 @@ direct_install() { | |
| rm -f $1/new-boot.img | |
| fix_env $1 | |
| run_migrations | |
| - | |
| + install_addond "$3" | |
| return 0 | |
| } | |
| @@ -221,6 +259,283 @@ run_migrations() { return; } | |
| grep_prop() { return; } | |
| +############################## | |
| +# Magisk Delta Custom install script | |
| +############################## | |
| + | |
| +# define | |
| +MAGISKSYSTEMDIR="/system/etc/init/magisk" | |
| + | |
| +random_str(){ | |
| +local FROM | |
| +local TO | |
| +FROM="$1"; TO="$2" | |
| +tr -dc A-Za-z0-9 </dev/urandom | head -c $(($FROM+$(($RANDOM%$(($TO-$FROM+1)))))) | |
| +} | |
| + | |
| +magiskrc(){ | |
| +local MAGISKTMP="$1" | |
| + | |
| +# use "magisk --auto-selinux" to automatically switching selinux state | |
| + | |
| +cat <<EOF | |
| +on post-fs-data | |
| + start logd | |
| + exec u:r:su:s0 root root -- $MAGISKSYSTEMDIR/magiskpolicy --live --magisk | |
| + exec u:r:magisk:s0 root root -- $MAGISKSYSTEMDIR/magiskpolicy --live --magisk | |
| + exec u:r:update_engine:s0 root root -- $MAGISKSYSTEMDIR/magiskpolicy --live --magisk | |
| + exec u:r:su:s0 root root -- $MAGISKSYSTEMDIR/$magisk_name --auto-selinux --setup-sbin $MAGISKSYSTEMDIR $MAGISKTMP | |
| + exec u:r:su:s0 root root -- $MAGISKTMP/magisk --auto-selinux --post-fs-data | |
| +on nonencrypted | |
| + exec u:r:su:s0 root root -- $MAGISKTMP/magisk --auto-selinux --service | |
| +on property:vold.decrypt=trigger_restart_framework | |
| + exec u:r:su:s0 root root -- $MAGISKTMP/magisk --auto-selinux --service | |
| +on property:sys.boot_completed=1 | |
| + mkdir /data/adb/magisk 755 | |
| + exec u:r:su:s0 root root -- $MAGISKTMP/magisk --auto-selinux --boot-complete | |
| + | |
| +on property:init.svc.zygote=restarting | |
| + exec u:r:su:s0 root root -- $MAGISKTMP/magisk --auto-selinux --zygote-restart | |
| + | |
| +on property:init.svc.zygote=stopped | |
| + exec u:r:su:s0 root root -- $MAGISKTMP/magisk --auto-selinux --zygote-restart | |
| +EOF | |
| +} | |
| + | |
| +remount_check(){ | |
| + local mode="$1" | |
| + local part="$(realpath "$2")" | |
| + local ignore_not_exist="$3" | |
| + local i | |
| + if ! grep -q " $part " /proc/mounts && [ ! -z "$ignore_not_exist" ]; then | |
| + return "$ignore_not_exist" | |
| + fi | |
| + mount -o "$mode,remount" "$part" | |
| + local IFS=$'\t\n ,' | |
| + for i in $(cat /proc/mounts | grep " $part " | awk '{ print $4 }'); do | |
| + test "$i" == "$mode" && return 0 | |
| + done | |
| + return 1 | |
| +} | |
| + | |
| +backup_restore(){ | |
| + # if gz is not found and orig file is found, backup to gz | |
| + if [ ! -f "${1}.gz" ] && [ -f "$1" ]; then | |
| + gzip -k "$1" && return 0 | |
| + elif [ -f "${1}.gz" ]; then | |
| + # if gz found, restore from gz | |
| + rm -rf "$1" && gzip -kdf "${1}.gz" && return 0 | |
| + fi | |
| + return 1 | |
| +} | |
| + | |
| +restore_from_bak(){ | |
| + backup_restore "$1" && rm -rf "${1}.gz" | |
| +} | |
| + | |
| +cleanup_system_installation(){ | |
| + rm -rf "$MIRRORDIR${MAGISKSYSTEMDIR}" | |
| + rm -rf "$MIRRORDIR${MAGISKSYSTEMDIR}.rc" | |
| + backup_restore "$MIRRORDIR/system/etc/init/bootanim.rc" \ | |
| + && rm -rf "$MIRRORDIR/system/etc/init/bootanim.rc.gz" | |
| + if [ -e "$MIRRORDIR${MAGISKSYSTEMDIR}" ] || [ -e "$MIRRORDIR${MAGISKSYSTEMDIR}.rc" ]; then | |
| + return 1 | |
| + fi | |
| +} | |
| + | |
| +installer_cleanup(){ | |
| + if $BOOTMODE; then | |
| + umount -l "/proc/$$/attr" | |
| + else | |
| + recovery_cleanup | |
| + fi | |
| + mount -o ro,remount / | |
| +} | |
| + | |
| +direct_install_system(){ | |
| + print_title "Magisk Delta (System Mode)" "by HuskyDG" | |
| + print_title "Powered by Magisk" | |
| + api_level_arch_detect | |
| + local INSTALLDIR="$1" | |
| + | |
| + ui_print "- Remount system partition as read-write" | |
| + # Use kernel trick to clean up mirrors automatically when installer completed | |
| + local MIRRORDIR="/proc/$$/attr" ROOTDIR SYSTEMDIR VENDORDIR | |
| + | |
| + ROOTDIR="$MIRRORDIR/system_root" | |
| + SYSTEMDIR="$MIRRORDIR/system" | |
| + VENDORDIR="$MIRRORDIR/vendor" | |
| + ODM_DIR="$MIRRORDIR/odm" | |
| + | |
| + local MAGISKTMP_TO_INSTALL=/sbin | |
| + | |
| + if $BOOTMODE; then | |
| + umount -l "/proc/$$/attr" | |
| + # setup mirrors to get the original content | |
| + mount -t tmpfs -o 'mode=0755' tmpfs "$MIRRORDIR" || return 1 | |
| + if is_rootfs; then | |
| + ROOTDIR=/ | |
| + mkdir "$SYSTEMDIR" | |
| + force_bind_mount "/system" "$SYSTEMDIR" || return 1 | |
| + else | |
| + mkdir "$ROOTDIR" | |
| + force_bind_mount "/" "$ROOTDIR" || return 1 | |
| + if mountpoint -q /system; then | |
| + mkdir "$SYSTEMDIR" | |
| + force_bind_mount "/system" "$SYSTEMDIR" || return 1 | |
| + else | |
| + ln -fs ./system_root/system "$SYSTEMDIR" | |
| + fi | |
| + | |
| + # we are modifying system directly so we need to create /sbin if it does not exist | |
| + if [ ! -d "$ROOTDIR"/sbin ]; then | |
| + rm -rf "$ROOTDIR"/sbin | |
| + mkdir "$ROOTDIR"/sbin | |
| + if [ ! -d "$ROOTDIR"/sbin ]; then | |
| + ui_print "! Can't create tmpfs path /sbin" | |
| + return 1; | |
| + fi | |
| + fi | |
| + | |
| + fi | |
| + | |
| + # check if /vendor is seperated fs | |
| + if mountpoint -q /vendor; then | |
| + mkdir "$VENDORDIR" | |
| + force_bind_mount "/vendor" "$VENDORDIR" || return 1 | |
| + else | |
| + ln -fs ./system/vendor "$VENDORDIR" | |
| + fi | |
| + | |
| + # check if /odm is seperated fs | |
| + if mountpoint -q /odm; then | |
| + mkdir "$ODM_DIR" | |
| + force_bind_mount "/odm" "$ODM_DIR" || return 1 | |
| + else | |
| + ln -fs ./system_root/odm "$ODM_DIR" | |
| + fi | |
| + else | |
| + local MIRRORDIR="/" ROOTDIR SYSTEMDIR VENDORDIR | |
| + ROOTDIR="$MIRRORDIR/system_root" | |
| + SYSTEMDIR="$MIRRORDIR/system" | |
| + VENDORDIR="$MIRRORDIR/vendor" | |
| + ODM_DIR="$MIRRORDIR/odm" | |
| + ui_print "- Mount system partitions as read-write..." | |
| + remount_check rw "$ROOTDIR" 0 || { warn_system_ro; return 1; } | |
| + remount_check rw "$SYSTEMDIR" 0 || { warn_system_ro; return 1; } | |
| + remount_check rw "$VENDORDIR" 0 || { warn_system_ro; return 1; } | |
| + remount_check rw "$ODM_DIR" 0 || { warn_system_ro; return 1; } | |
| + | |
| + # we are modifying system directly so we need to create /sbin if it does not exist | |
| + if [ -d "$ROOTDIR" ] && [ ! -d "$ROOTDIR"/sbin ]; then | |
| + rm -rf "$ROOTDIR"/sbin | |
| + mkdir "$ROOTDIR"/sbin | |
| + if [ ! -d "$ROOTDIR"/sbin ]; then | |
| + ui_print "! Can't create tmpfs path /sbin" | |
| + return 1; | |
| + fi | |
| + fi | |
| + | |
| + fi | |
| + | |
| + | |
| + ui_print "- Cleaning up enviroment..." | |
| + { | |
| + local checkfile="$MIRRORDIR/system/.check_$(random_str 10 20)" | |
| + # test write, need atleast 20mb | |
| + dd if=/dev/zero of="$checkfile" bs=1024 count=20000 || \ | |
| + { rm -rf "$checkfile"; ui_print "! Insufficient free space or system write protection"; return 1; } | |
| + rm -rf "$checkfile" | |
| + } | |
| + cleanup_system_installation || return 1 | |
| + | |
| + local magisk_applet=magisk32 magisk_name=magisk32 | |
| + if [ "$IS64BIT" == true ]; then | |
| + magisk_name=magisk64 | |
| + magisk_applet="magisk32 magisk64" | |
| + fi | |
| + | |
| + ui_print "- Copy files to system partition" | |
| + mkdir -p "$MIRRORDIR$MAGISKSYSTEMDIR" || return 1 | |
| + for magisk in $magisk_applet magiskpolicy magiskinit stub.apk; do | |
| + cat "$INSTALLDIR/$magisk" >"$MIRRORDIR$MAGISKSYSTEMDIR/$magisk" || { ui_print "! Unable to write Magisk binaries to system"; return 1; } | |
| + done | |
| + echo -e "SYSTEMMODE=true\nRECOVERYMODE=false" >"$MIRRORDIR$MAGISKSYSTEMDIR/config" | |
| + chcon -R u:object_r:system_file:s0 "$MIRRORDIR$MAGISKSYSTEMDIR" | |
| + chmod -R 700 "$MIRRORDIR$MAGISKSYSTEMDIR" | |
| + | |
| + if [ "$API" -gt 24 ]; then | |
| + | |
| + # test live patch | |
| + { | |
| + if $BOOTMODE; then | |
| + ui_print "- Check if kernel supports dynamic SELinux Policy patch" | |
| + if [ -d /sys/fs/selinux ] && ! "$INSTALLDIR/magiskpolicy" --live "permissive su" &>/dev/null; then | |
| + ui_print "! Kernel does not support dynamic SELinux Policy patch" | |
| + return 1 | |
| + fi | |
| + else | |
| + ui_print "W: It's impossible to check kernel compatible in recovery mode" | |
| + ui_print "W: Please make sure your kernel can dynamic patch SELinux Policy" | |
| + fi | |
| + if ! is_rootfs; then | |
| + { | |
| + ui_print "- Patch sepolicy file" | |
| + local sepol file | |
| + for file in /vendor/etc/selinux/precompiled_sepolicy /odm/etc/selinux/precompiled_sepolicy /system/etc/selinux/precompiled_sepolicy /system_root/sepolicy /system_root/sepolicy_debug /system_root/sepolicy.unlocked; do | |
| + if [ -f "$MIRRORDIR$file" ]; then | |
| + sepol="$file" | |
| + break | |
| + fi | |
| + done | |
| + if [ -z "$sepol" ]; then | |
| + ui_print "! Cannot find sepolicy file" | |
| + return 1 | |
| + else | |
| + ui_print "- Target sepolicy is $sepol" | |
| + backup_restore "$MIRRORDIR$sepol" || { ui_print "! Backup failed"; return 1; } | |
| + # copy file to cache | |
| + cp -af "$MIRRORDIR$sepol" "$INSTALLDIR/sepol.in" | |
| + if ! "$INSTALLDIR/magiskinit" --patch-sepol "$INSTALLDIR/sepol.in" "$INSTALLDIR/sepol.out" || ! cp -af "$INSTALLDIR/sepol.out" "$MIRRORDIR$sepol"; then | |
| + ui_print "! Unable to patch sepolicy file" | |
| + restore_from_bak "$MIRRORDIR$sepol" | |
| + return 1 | |
| + fi | |
| + ui_print "- Patching sepolicy file success!" | |
| + fi | |
| + } | |
| + fi | |
| + } | |
| + ui_print "- Add init boot script" | |
| + { | |
| + hijackrc="$MIRRORDIR/system/etc/init/magisk.rc" | |
| + if [ -f "$MIRRORDIR/system/etc/init/bootanim.rc" ]; then | |
| + backup_restore "$MIRRORDIR/system/etc/init/bootanim.rc" && hijackrc="$MIRRORDIR/system/etc/init/bootanim.rc" | |
| + fi | |
| + } | |
| + echo "$(magiskrc "$MAGISKTMP_TO_INSTALL")" >>"$hijackrc" || return 1 | |
| + fi | |
| + | |
| + ui_print "[*] Reflash your ROM if your ROM is unable to start" | |
| + ui_print " and do not use this method to install Magisk" | |
| + | |
| + $BOOTMODE && installer_cleanup | |
| + true | |
| + return 0 | |
| +} | |
| + | |
| + | |
| + | |
| +xdirect_install_system() { | |
| + direct_install_system "$@" || { cleanup_system_installation; installer_cleanup; return 1; } | |
| + fix_env "$1" | |
| + install_addond "$3" "true" | |
| + run_migrations | |
| + return 0 | |
| +} | |
| + | |
| + | |
| + | |
| ############# | |
| # Initialize | |
| ############# | |
| @@ -232,6 +547,8 @@ app_init() { | |
| get_flags >/dev/null | |
| run_migrations >/dev/null | |
| check_encryption | |
| + BOOTIMAGE_PATCHED=false | |
| + [ ! -z "$SHA1" ] && BOOTIMAGE_PATCHED=true | |
| # Dump variables | |
| printvar SLOT | |
| diff --git a/scripts/flash_script.sh b/scripts/flash_script.sh | |
| index d5b29fd54..bf854584c 100644 | |
| --- a/scripts/flash_script.sh | |
| +++ b/scripts/flash_script.sh | |
| @@ -14,6 +14,9 @@ OUTFD=$2 | |
| COMMONDIR=$INSTALLER/assets | |
| CHROMEDIR=$INSTALLER/assets/chromeos | |
| +APK="$3" | |
| +MAGISKBINTMP=$INSTALLER/bin | |
| + | |
| if [ ! -f $COMMONDIR/util_functions.sh ]; then | |
| echo "! Unable to extract zip file!" | |
| exit 1 | |
| @@ -21,6 +24,15 @@ fi | |
| # Load utility functions | |
| . $COMMONDIR/util_functions.sh | |
| +mkdir $MAGISKBINTMP | |
| + | |
| +getvar SYSTEMMODE | |
| +SYSTEMINSTALL="$SYSTEMMODE" | |
| +[ -z "$SYSTEMINSTALL" ] && SYSTEMINSTALL=false | |
| + | |
| +if echo "$3" | grep -q "systemmagisk"; then | |
| + SYSTEMINSTALL=true | |
| +fi | |
| setup_flashable | |
| @@ -75,24 +87,54 @@ cp -af $BINDIR/. $COMMONDIR/. $BBBIN $MAGISKBIN | |
| rm -f $MAGISKBIN/bootctl $MAGISKBIN/main.jar \ | |
| $MAGISKBIN/module_installer.sh $MAGISKBIN/uninstaller.sh | |
| +cat "$APK" >"$MAGISKBIN/magisk.apk" | |
| +cp -af $MAGISKBIN/* $MAGISKBINTMP | |
| + | |
| chmod -R 755 $MAGISKBIN | |
| +chmod -R 755 $MAGISKBINTMP | |
| + | |
| + | |
| +################## | |
| +# Image Patching | |
| +################## | |
| + | |
| +ADDOND=/system/addon.d | |
| +ADDOND_MAGISK=$ADDOND/magisk | |
| + | |
| +if [ "$SYSTEMINSTALL" == "true" ]; then | |
| + unzip -oj "$APK" "res/raw/manager.sh" | |
| + BOOTMODE_OLD="$BOOTMODE" | |
| + . ./manager.sh | |
| + BOOTMODE="$BOOTMODE_OLD" | |
| + . $COMMONDIR/util_functions.sh | |
| + ADDOND_MAGISK=/system/etc/init/magisk | |
| + [ -f "$ADDOND/99-magisk.sh" ] && sed -i "s/^SYSTEMINSTALL=.*/SYSTEMINSTALL=true/g" $ADDOND/99-magisk.sh | |
| + if $BOOTMODE; then | |
| + direct_install_system "$MAGISKBINTMP" || { cleanup_system_installation; unmount_system_mirrors; abort "! Installation failed"; } | |
| + else | |
| + direct_install_system "$MAGISKBINTMP" || { cleanup_system_installation; abort "! Installation failed"; } | |
| + fi | |
| +else | |
| + install_magisk | |
| +fi | |
| # addon.d | |
| if [ -d /system/addon.d ]; then | |
| ui_print "- Adding addon.d survival script" | |
| blockdev --setrw /dev/block/mapper/system$SLOT 2>/dev/null | |
| mount -o rw,remount /system || mount -o rw,remount / | |
| - ADDOND=/system/addon.d/99-magisk.sh | |
| - cp -af $COMMONDIR/addon.d.sh $ADDOND | |
| - chmod 755 $ADDOND | |
| + rm -rf $ADDOND/99-magisk.sh 2>/dev/null | |
| + rm -rf $ADDOND/magisk 2>/dev/null | |
| + if [ $ADDOND_MAGISK == $ADDOND/magisk ]; then | |
| + mkdir -p $ADDOND/magisk | |
| + fi | |
| + cp -af $MAGISKBINTMP/* $ADDOND_MAGISK | |
| + if [ $ADDOND_MAGISK == $ADDOND/magisk ]; then | |
| + mv $ADDOND/magisk/boot_patch.sh $ADDOND/magisk/boot_patch.sh.in | |
| + fi | |
| + mv $ADDOND_MAGISK/addon.d.sh $ADDOND/99-magisk.sh | |
| fi | |
| -################## | |
| -# Image Patching | |
| -################## | |
| - | |
| -install_magisk | |
| - | |
| # Cleanups | |
| $BOOTMODE || recovery_cleanup | |
| rm -rf $TMPDIR | |
| diff --git a/scripts/uninstaller.sh b/scripts/uninstaller.sh | |
| index 5142ae4a7..37090a027 100644 | |
| --- a/scripts/uninstaller.sh | |
| +++ b/scripts/uninstaller.sh | |
| @@ -42,14 +42,113 @@ $DATA_DE || abort "! Cannot access /data, please uninstall with the Magisk app" | |
| get_flags | |
| find_boot_image | |
| -[ -z $BOOTIMAGE ] && abort "! Unable to detect target image" | |
| -ui_print "- Target image: $BOOTIMAGE" | |
| +backup_restore(){ | |
| +test -f "${1}.gz" || { test -f "$1" && gzip -k "$1"; } | |
| +test -f "${1}.gz" && { rm -rf "$1" && gzip -kdf "${1}.gz"; } || return 1 | |
| +} | |
| + | |
| +if ! $BOOTMODE; then | |
| + ui_print "********************************************" | |
| + ui_print " Due to the complex of recovery environment" | |
| + ui_print " Uninstall Magisk in Recovery is not guaranteed" | |
| + ui_print "********************************************" | |
| +fi | |
| # Detect version and architecture | |
| api_level_arch_detect | |
| ui_print "- Device platform: $ABI" | |
| +if ( [ -z "$(grep_prop SHA1 "$MAGISKTMP/.magisk/config")" ] && $BOOTMODE ) || [ "$(grep_prop SYSTEMMODE /system/etc/init/magisk/config)" == "true" ]; then | |
| + | |
| +# Use kernel trick to clean up mirrors automatically when installer completed | |
| +MIRRORDIR="/proc/$$/attr" | |
| +ROOTDIR="$MIRRORDIR/system_root" | |
| +SYSTEMDIR="$MIRRORDIR/system" | |
| +VENDORDIR="$MIRRORDIR/vendor" | |
| +ODM_DIR="$MIRRORDIR/odm" | |
| + | |
| +abort_install(){ | |
| + umount -l "$MIRRORDIR" | |
| + rm -rf "$MIRRORDIR" | |
| + abort "! Installaion faled" | |
| +} | |
| + | |
| +if $BOOTMODE; then | |
| + # setup mirrors to get the original content | |
| + mount -t tmpfs -o 'mode=0755' tmpfs "$MIRRORDIR" || return 1 | |
| + if is_rootfs; then | |
| + ROOTDIR=/ | |
| + mkdir "$SYSTEMDIR" | |
| + force_bind_mount "/system" "$SYSTEMDIR" || return 1 | |
| + else | |
| + mkdir "$ROOTDIR" | |
| + force_bind_mount "/" "$ROOTDIR" || return 1 | |
| + if mountpoint -q /system; then | |
| + mkdir "$SYSTEMDIR" | |
| + force_bind_mount "/system" "$SYSTEMDIR" || return 1 | |
| + else | |
| + ln -fs ./system_root/system "$SYSTEMDIR" | |
| + fi | |
| + fi | |
| + | |
| + # check if /vendor is seperated fs | |
| + if mountpoint -q /vendor; then | |
| + mkdir "$VENDORDIR" | |
| + force_bind_mount "/vendor" "$VENDORDIR" || return 1 | |
| + else | |
| + ln -fs ./system/vendor "$VENDORDIR" | |
| + fi | |
| + | |
| + # check if /odm is seperated fs | |
| + if mountpoint -q /odm; then | |
| + mkdir "$ODM_DIR" | |
| + force_bind_mount "/odm" "$ODM_DIR" || return 1 | |
| + else | |
| + ln -fs ./system_root/odm "$ODM_DIR" | |
| + fi | |
| +else | |
| + local MIRRORDIR="/" ROOTDIR SYSTEMDIR VENDORDIR | |
| + ROOTDIR="$MIRRORDIR/system_root" | |
| + SYSTEMDIR="$MIRRORDIR/system" | |
| + VENDORDIR="$MIRRORDIR/vendor" | |
| + ODM_DIR="$MIRRORDIR/odm" | |
| +fi | |
| + | |
| +ui_print "--- Uninstall Magisk in system partition" | |
| + | |
| +blockdev --setrw /dev/block/mapper/system$SLOT 2>/dev/null | |
| +mount -o rw,remount /system || mount -o rw,remount / | |
| +mount -o rw,remount /system_root | |
| +mount -o rw,remount /vendor | |
| +mount -o rw,remount /odm | |
| + | |
| +for file in /vendor/etc/selinux/precompiled_sepolicy /odm/etc/selinux/precompiled_sepolicy /system/etc/selinux/precompiled_sepolicy /system_root/sepolicy /system_root/sepolicy_debug /system_root/sepolicy.unlocked; do | |
| + if [ -f "$MIRRORDIR$file" ]; then | |
| + sepol="$file" | |
| + break | |
| + fi | |
| +done | |
| + | |
| +if [ ! -z "$sepol" ]; then | |
| + ui_print "- Restore sepolicy patch" | |
| + backup_restore "$MIRRORDIR$sepol" && rm -rf "$MIRRORDIR$sepol".gz | |
| +fi | |
| + | |
| + | |
| +ui_print "- Removing Magisk binaries" | |
| +rm -rf $MIRRORDIR/system/etc/init/*magisk* $MIRRORDIR/system/system/etc/init/*magisk* $MIRRORDIR/system_root/system/etc/init/*magisk* \ | |
| +$MIRRORDIR/system/xbin/magisk $MIRRORDIR/system/xbin/.magisk || abort "! Cannot uninstall" | |
| + | |
| +backup_restore "$MIRRORDIR/system/etc/init/bootanim.rc" && rm -rf "$MIRRORDIR/system/etc/init/bootanim.rc.gz" | |
| + | |
| +else | |
| + | |
| +ui_print "--- Uninstall Magisk in boot image" | |
| + | |
| +[ -z $BOOTIMAGE ] && abort "! Unable to detect target image" | |
| +ui_print "- Target image: $BOOTIMAGE" | |
| + | |
| BINDIR=$INSTALLER/lib/$ABI | |
| cd $BINDIR | |
| for file in lib*.so; do mv "$file" "${file:3:${#file}-6}"; done | |
| @@ -141,6 +240,8 @@ case $((STATUS & 3)) in | |
| ;; | |
| esac | |
| +fi | |
| + | |
| if $BOOTMODE; then | |
| ui_print "- Removing modules" | |
| magisk --remove-modules -n | |
| diff --git a/scripts/util_functions.sh b/scripts/util_functions.sh | |
| index dd91cd177..691df9824 100644 | |
| --- a/scripts/util_functions.sh | |
| +++ b/scripts/util_functions.sh | |
| @@ -750,6 +750,52 @@ install_module() { | |
| ui_print "- Done" | |
| } | |
| +# Magisk Delta | |
| + | |
| +is_rootfs(){ | |
| + local root_blkid="$(mountpoint -d /)" | |
| + if ! $BOOTMODE && [ -d /system_root ] && mountpoint /system_root; then | |
| + return 1 | |
| + fi | |
| + mnt_type="$(head -1 /proc/self/mountinfo | awk '{ printf $9 }')" | |
| + if $BOOTMODE && [ "$mnt_type" == "rootfs" -o "$mnt_type" == "tmpfs" ]; then | |
| + return 0 | |
| + fi | |
| + return 1 | |
| +} | |
| + | |
| +mkblknode(){ | |
| + local blk_mm="$(mountpoint -d "$2" | sed "s/:/ /g")" | |
| + mknod "$1" -m 666 b $blk_mm | |
| +} | |
| + | |
| +warn_system_ro(){ | |
| + ui_print "! System partition is read-only" | |
| + return 1 | |
| +} | |
| + | |
| +remount_check(){ | |
| + local mode="$1" | |
| + local part="$(realpath "$2")" | |
| + local ignore_not_exist="$3" | |
| + local i | |
| + if ! grep -q " $part " /proc/mounts && [ ! -z "$ignore_not_exist" ]; then | |
| + return "$ignore_not_exist" | |
| + fi | |
| + mount -o "$mode,remount" "$part" | |
| + local IFS=$'\t\n ,' | |
| + for i in $(cat /proc/mounts | grep " $part " | awk '{ print $4 }'); do | |
| + test "$i" == "$mode" && return 0 | |
| + done | |
| + return 1 | |
| +} | |
| + | |
| +force_bind_mount(){ | |
| + mount -o bind,private "$1" "$2" | |
| + mount -o rw,remount "$2" | |
| + remount_check rw "$2" || warn_system_ro | |
| +} | |
| + | |
| ########## | |
| # Presets | |
| ########## | |
| -- | |
| 2.51.2 | |
| From 81df92880aad6c56218d388587e2d9c67e4ebc67 Mon Sep 17 00:00:00 2001 | |
| From: mistrmochov <[email protected]> | |
| Date: Wed, 11 Jun 2025 03:53:15 +0200 | |
| Subject: [PATCH 02/16] waydroid ultimate patch | |
| --- | |
| native/src/base/files.rs | 12 ++++++------ | |
| 1 file changed, 6 insertions(+), 6 deletions(-) | |
| diff --git a/native/src/base/files.rs b/native/src/base/files.rs | |
| index ca944f682..cae5a08d8 100644 | |
| --- a/native/src/base/files.rs | |
| +++ b/native/src/base/files.rs | |
| @@ -296,8 +296,8 @@ impl Utf8CStr { | |
| #[cfg(feature = "selinux")] | |
| con: cstr::buf::new(), | |
| }; | |
| - #[cfg(feature = "selinux")] | |
| - self.get_secontext(&mut attr.con)?; | |
| + // #[cfg(feature = "selinux")]: | |
| + // self.get_secontext(&mut attr.con)?; | |
| Ok(attr) | |
| } | |
| @@ -320,10 +320,10 @@ impl Utf8CStr { | |
| )?; | |
| } | |
| - #[cfg(feature = "selinux")] | |
| - if !attr.con.is_empty() { | |
| - self.set_secontext(&attr.con)?; | |
| - } | |
| + // #[cfg(feature = "selinux")] | |
| + // if !attr.con.is_empty() { | |
| + // self.set_secontext(&attr.con)?; | |
| + // } | |
| Ok(()) | |
| } | |
| -- | |
| 2.51.2 | |
| From 45235d5d75b18e606ef23084d0aa8f2631eae393 Mon Sep 17 00:00:00 2001 | |
| From: =?UTF-8?q?=E9=86=89=E6=9C=88?= <[email protected]> | |
| Date: Wed, 29 Jan 2025 11:55:07 +0800 | |
| Subject: [PATCH 03/16] Fix /sbin create | |
| Fix the issue of NoxPlayer Android 12 being unable to create /sbin. | |
| --- | |
| scripts/app_functions.sh | 17 +++++++++-------- | |
| 1 file changed, 9 insertions(+), 8 deletions(-) | |
| diff --git a/scripts/app_functions.sh b/scripts/app_functions.sh | |
| index e7791812c..2ff2b8392 100644 | |
| --- a/scripts/app_functions.sh | |
| +++ b/scripts/app_functions.sh | |
| @@ -375,6 +375,7 @@ direct_install_system(){ | |
| mount -t tmpfs -o 'mode=0755' tmpfs "$MIRRORDIR" || return 1 | |
| if is_rootfs; then | |
| ROOTDIR=/ | |
| + force_bind_mount "/" "$ROOTDIR" || return 1 | |
| mkdir "$SYSTEMDIR" | |
| force_bind_mount "/system" "$SYSTEMDIR" || return 1 | |
| else | |
| @@ -386,19 +387,19 @@ direct_install_system(){ | |
| else | |
| ln -fs ./system_root/system "$SYSTEMDIR" | |
| fi | |
| + fi | |
| - # we are modifying system directly so we need to create /sbin if it does not exist | |
| + # we are modifying system directly so we need to create /sbin if it does not exist | |
| + if [ ! -d "$ROOTDIR"/sbin ]; then | |
| + rm -rf "$ROOTDIR"/sbin | |
| + mkdir "$ROOTDIR"/sbin | |
| if [ ! -d "$ROOTDIR"/sbin ]; then | |
| - rm -rf "$ROOTDIR"/sbin | |
| - mkdir "$ROOTDIR"/sbin | |
| - if [ ! -d "$ROOTDIR"/sbin ]; then | |
| - ui_print "! Can't create tmpfs path /sbin" | |
| - return 1; | |
| - fi | |
| + ui_print "! Can't create tmpfs path /sbin" | |
| + return 1; | |
| fi | |
| - | |
| fi | |
| + | |
| # check if /vendor is seperated fs | |
| if mountpoint -q /vendor; then | |
| mkdir "$VENDORDIR" | |
| -- | |
| 2.51.2 | |
| From 89046b0ff80b7f948ece6b88e191c1836521d8b3 Mon Sep 17 00:00:00 2001 | |
| From: Takeda-senpai <[email protected]> | |
| Date: Thu, 7 Dec 2023 12:53:25 +0700 | |
| Subject: [PATCH 04/16] Ignore selinux stuff when selinux not enforced | |
| --- | |
| native/src/base/cus.cpp | 7 ++++++- | |
| native/src/base/cus.hpp | 3 ++- | |
| native/src/core/daemon.rs | 14 ++++++++++++-- | |
| native/src/core/selinux.rs | 13 +++++++++++++ | |
| native/src/core/su/su.cpp | 2 +- | |
| 5 files changed, 34 insertions(+), 5 deletions(-) | |
| diff --git a/native/src/base/cus.cpp b/native/src/base/cus.cpp | |
| index 2b4602759..a83e6b1f9 100644 | |
| --- a/native/src/base/cus.cpp | |
| +++ b/native/src/base/cus.cpp | |
| @@ -54,4 +54,9 @@ int tmpfs_mount(Utf8CStr from, Utf8CStr to){ | |
| if (ret == 0) | |
| VLOGDG("mnt_tmp", "tmpfs", to.c_str()); | |
| return ret; | |
| -} | |
| \ No newline at end of file | |
| +} | |
| + | |
| +bool selinux_enabled() { | |
| + return access("/sys/fs/selinux/enforce", F_OK) == 0; | |
| +} | |
| + | |
| diff --git a/native/src/base/cus.hpp b/native/src/base/cus.hpp | |
| index 18f617371..0a8fb0111 100644 | |
| --- a/native/src/base/cus.hpp | |
| +++ b/native/src/base/cus.hpp | |
| @@ -6,4 +6,5 @@ bool is_dir_exist(const char *s); | |
| int bind_mount_(const char *from, const char *to); | |
| int tmpfs_mount(Utf8CStr from, Utf8CStr to); | |
| int setcurrent(const char *con); | |
| -std::string getcurrent(); | |
| \ No newline at end of file | |
| +std::string getcurrent(); | |
| +bool selinux_enabled(); | |
| diff --git a/native/src/core/daemon.rs b/native/src/core/daemon.rs | |
| index 1ad3b5bba..b2cdb6fb7 100644 | |
| --- a/native/src/core/daemon.rs | |
| +++ b/native/src/core/daemon.rs | |
| @@ -27,7 +27,7 @@ use nix::sys::signal::SigSet; | |
| use nix::unistd::{dup2_stderr, dup2_stdin, dup2_stdout, getpid, getuid, setsid}; | |
| use num_traits::AsPrimitive; | |
| use std::fmt::Write as _; | |
| -use std::io::{BufReader, Write}; | |
| +use std::io::{BufReader, Read, Write}; | |
| use std::os::fd::{AsFd, AsRawFd, IntoRawFd, RawFd}; | |
| use std::os::unix::net::{UCred, UnixListener, UnixStream}; | |
| use std::process::{Command, exit}; | |
| @@ -175,6 +175,16 @@ impl MagiskD { | |
| true | |
| } | |
| + fn is_selinux_enforced(&self) -> bool { | |
| + if let Ok(mut file) = cstr!("/sys/fs/selinux/enforce").open(OFlag::O_RDONLY) { | |
| + let mut buf = [0u8; 1]; | |
| + if file.read_exact(&mut buf).is_ok() { | |
| + return buf[0] != b'0'; | |
| + } | |
| + } | |
| + false | |
| + } | |
| + | |
| fn handle_requests(&'static self, mut client: UnixStream) { | |
| let Ok(cred) = client.peer_cred() else { | |
| // Client died | |
| @@ -197,7 +207,7 @@ impl MagiskD { | |
| let is_root = cred.uid == 0; | |
| let is_shell = cred.uid == 2000; | |
| - let is_zygote = &context == "u:r:zygote:s0"; | |
| + let is_zygote = &context == "u:r:zygote:s0" || !self.is_selinux_enforced(); | |
| if !is_root && !is_zygote && !self.is_client(cred.pid.unwrap_or(-1)) { | |
| // Unsupported client state | |
| diff --git a/native/src/core/selinux.rs b/native/src/core/selinux.rs | |
| index de0c5ec54..cefc56491 100644 | |
| --- a/native/src/core/selinux.rs | |
| +++ b/native/src/core/selinux.rs | |
| @@ -1,5 +1,6 @@ | |
| use crate::consts::{DATABIN, LOG_PIPE, MAGISK_LOG_CON, MAGISKDB, MODULEROOT, SECURE_DIR}; | |
| use crate::ffi::get_magisk_tmp; | |
| +use base::libc::{F_OK, O_CLOEXEC, O_WRONLY}; | |
| use base::{Directory, FsPathBuilder, LoggedResult, ResultExt, Utf8CStr, Utf8CStrBuf, cstr, libc}; | |
| use nix::fcntl::OFlag; | |
| use std::io::Write; | |
| @@ -9,6 +10,10 @@ const SYSTEM_CON: &Utf8CStr = cstr!("u:object_r:system_file:s0"); | |
| const ADB_CON: &Utf8CStr = cstr!("u:object_r:adb_data_file:s0"); | |
| const ROOT_CON: &Utf8CStr = cstr!("u:object_r:rootfs:s0"); | |
| +fn selinux_enabled() -> bool { | |
| + unsafe { libc::access(cstr!("/sys/fs/selinux/enforce").as_ptr(), F_OK) == 0 } | |
| +} | |
| + | |
| fn restore_syscon_from_unlabeled( | |
| path: &mut dyn Utf8CStrBuf, | |
| con: &mut dyn Utf8CStrBuf, | |
| @@ -52,6 +57,10 @@ fn restore_syscon(path: &mut dyn Utf8CStrBuf) -> LoggedResult<()> { | |
| } | |
| pub(crate) fn restorecon() { | |
| + if !selinux_enabled() { | |
| + return; | |
| + } | |
| + | |
| if let Ok(mut file) = cstr!("/sys/fs/selinux/context") | |
| .open(OFlag::O_WRONLY | OFlag::O_CLOEXEC) | |
| .log() | |
| @@ -73,6 +82,10 @@ pub(crate) fn restorecon() { | |
| } | |
| pub(crate) fn restore_tmpcon() -> LoggedResult<()> { | |
| + if !selinux_enabled() { | |
| + return Ok(()); | |
| + } | |
| + | |
| let tmp = get_magisk_tmp(); | |
| if tmp == "/sbin" { | |
| tmp.set_secontext(ROOT_CON)?; | |
| diff --git a/native/src/core/su/su.cpp b/native/src/core/su/su.cpp | |
| index 4a3532968..5a4bfe468 100644 | |
| --- a/native/src/core/su/su.cpp | |
| +++ b/native/src/core/su/su.cpp | |
| @@ -443,7 +443,7 @@ void exec_root_shell(int client, int pid, SuRequest &req, MntNsMode mode) { | |
| } | |
| // Config privileges | |
| - if (!req.context.empty()) { | |
| + if (!req.context.empty() && selinux_enabled()) { | |
| auto f = xopen_file("/proc/self/attr/exec", "we"); | |
| if (f) fprintf(f.get(), "%s", req.context.c_str()); | |
| } | |
| -- | |
| 2.51.2 | |
| From fe98f2a6dd26222031e7bf15aa24432e024db13d Mon Sep 17 00:00:00 2001 | |
| From: Takeda-senpai <[email protected]> | |
| Date: Thu, 16 Nov 2023 19:35:20 +0700 | |
| Subject: [PATCH 05/16] Change socket path to /dev | |
| --- | |
| native/src/base/base.cpp | 34 ++++++++++++++++++++++++++++++++++ | |
| native/src/base/misc.hpp | 4 +++- | |
| native/src/core/daemon.rs | 13 ++++++------- | |
| native/src/core/su/connect.rs | 9 ++++----- | |
| native/src/include/consts.hpp | 1 + | |
| native/src/include/consts.rs | 2 +- | |
| native/src/init/rootdir.cpp | 9 +++++++++ | |
| 7 files changed, 58 insertions(+), 14 deletions(-) | |
| diff --git a/native/src/base/base.cpp b/native/src/base/base.cpp | |
| index 9a280718d..71c0c35a5 100644 | |
| --- a/native/src/base/base.cpp | |
| +++ b/native/src/base/base.cpp | |
| @@ -431,3 +431,37 @@ const char *Utf8CStr::data() const { | |
| size_t Utf8CStr::length() const { | |
| return cxx$utf8str$len(this); | |
| } | |
| + | |
| +mt19937_64 &get_rand(const void *seed_buf) { | |
| + static mt19937_64 *gen = nullptr; | |
| + if (gen == nullptr) { | |
| + gen = new mt19937_64(); | |
| + mt19937_64::result_type seed; | |
| + if (seed_buf == nullptr) { | |
| + int fd = xopen("/dev/urandom", O_RDONLY | O_CLOEXEC); | |
| + xxread(fd, &seed, sizeof(seed)); | |
| + close(fd); | |
| + } else { | |
| + memcpy(&seed, seed_buf, sizeof(seed)); | |
| + } | |
| + gen->seed(seed); | |
| + } | |
| + return *gen; | |
| +} | |
| + | |
| +int gen_rand_str(char *buf, int len, bool varlen) { | |
| + auto gen = get_rand(); | |
| + | |
| + if (len == 0) | |
| + return 0; | |
| + if (varlen) { | |
| + std::uniform_int_distribution<int> len_dist(len / 2, len); | |
| + len = len_dist(gen); | |
| + } | |
| + std::uniform_int_distribution<int> alphabet('a', 'z'); | |
| + for (int i = 0; i < len - 1; ++i) { | |
| + buf[i] = static_cast<char>(alphabet(gen)); | |
| + } | |
| + buf[len - 1] = '\0'; | |
| + return len - 1; | |
| +} | |
| diff --git a/native/src/base/misc.hpp b/native/src/base/misc.hpp | |
| index 1e11d5da0..a1c892fba 100644 | |
| --- a/native/src/base/misc.hpp | |
| +++ b/native/src/base/misc.hpp | |
| @@ -6,7 +6,7 @@ | |
| #include <string_view> | |
| #include <bitset> | |
| #include <rust/cxx.h> | |
| - | |
| +#include <random> | |
| #include "xwrap.hpp" | |
| #define DISALLOW_COPY_AND_MOVE(clazz) \ | |
| @@ -209,6 +209,8 @@ constexpr auto operator+(T e) noexcept -> | |
| return static_cast<std::underlying_type_t<T>>(e); | |
| } | |
| +std::mt19937_64 &get_rand(const void *seed_buf = nullptr); | |
| +int gen_rand_str(char *buf, int len, bool varlen = true); | |
| struct Utf8CStr { | |
| const char *data() const; | |
| size_t length() const; | |
| diff --git a/native/src/core/daemon.rs b/native/src/core/daemon.rs | |
| index b2cdb6fb7..8016298ce 100644 | |
| --- a/native/src/core/daemon.rs | |
| +++ b/native/src/core/daemon.rs | |
| @@ -1,7 +1,7 @@ | |
| use crate::bootstages::BootState; | |
| use crate::consts::{ | |
| MAGISK_FILE_CON, MAGISK_FULL_VER, MAGISK_PROC_CON, MAGISK_VER_CODE, MAGISK_VERSION, | |
| - MAIN_CONFIG, MAIN_SOCKET, ROOTMNT, ROOTOVL, | |
| + MAIN_CONFIG, RANDOM_SOCKET_NAME, ROOTMNT, ROOTOVL, | |
| }; | |
| use crate::db::Sqlite3; | |
| use crate::ffi::{ | |
| @@ -413,9 +413,9 @@ fn daemon_entry() { | |
| }; | |
| MAGISKD.set(daemon).ok(); | |
| - let sock_path = cstr::buf::new::<64>() | |
| - .join_path(get_magisk_tmp()) | |
| - .join_path(MAIN_SOCKET); | |
| + let mut sock_path = cstr::buf::new::<64>(); | |
| + write!(sock_path, "/dev/magisk:socket:{}", RANDOM_SOCKET_NAME.trim_end_matches('\0')).ok(); | |
| + | |
| sock_path.remove().ok(); | |
| let Ok(sock) = UnixListener::bind(&sock_path).log() else { | |
| @@ -437,9 +437,8 @@ fn daemon_entry() { | |
| } | |
| pub fn connect_daemon(code: RequestCode, create: bool) -> LoggedResult<UnixStream> { | |
| - let sock_path = cstr::buf::new::<64>() | |
| - .join_path(get_magisk_tmp()) | |
| - .join_path(MAIN_SOCKET); | |
| + let mut sock_path = cstr::buf::new::<64>(); | |
| + write!(sock_path, "/dev/magisk:socket:{}", RANDOM_SOCKET_NAME.trim_end_matches('\0')).ok(); | |
| fn send_request(code: RequestCode, mut socket: UnixStream) -> LoggedResult<UnixStream> { | |
| socket.write_pod(&code.repr).log_ok(); | |
| diff --git a/native/src/core/su/connect.rs b/native/src/core/su/connect.rs | |
| index 855a1a8dc..5cc15db42 100644 | |
| --- a/native/src/core/su/connect.rs | |
| +++ b/native/src/core/su/connect.rs | |
| @@ -1,8 +1,8 @@ | |
| use super::SuInfo; | |
| use super::db::RootSettings; | |
| -use crate::consts::{INTERNAL_DIR, MAGISK_FILE_CON}; | |
| +use crate::consts::{RANDOM_SOCKET_NAME, MAGISK_FILE_CON}; | |
| use crate::daemon::to_user_id; | |
| -use crate::ffi::{SuPolicy, SuRequest, get_magisk_tmp}; | |
| +use crate::ffi::{SuPolicy, SuRequest}; | |
| use crate::socket::IpcRead; | |
| use ExtraVal::{Bool, Int, IntList, Str}; | |
| use base::{ | |
| @@ -164,9 +164,8 @@ impl SuAppContext<'_> { | |
| fn app_request(&mut self) { | |
| let mut fifo = cstr::buf::new::<64>(); | |
| fifo.write_fmt(format_args!( | |
| - "{}/{}/su_request_{}", | |
| - get_magisk_tmp(), | |
| - INTERNAL_DIR, | |
| + "/dev/magisk:su_request:{}:{}", | |
| + RANDOM_SOCKET_NAME.trim_end_matches('\0'), | |
| self.cred.pid.unwrap_or(-1) | |
| )) | |
| .ok(); | |
| diff --git a/native/src/include/consts.hpp b/native/src/include/consts.hpp | |
| index ce5e3c76b..078dd02c0 100644 | |
| --- a/native/src/include/consts.hpp | |
| +++ b/native/src/include/consts.hpp | |
| @@ -1,6 +1,7 @@ | |
| #pragma once | |
| #define JAVA_PACKAGE_NAME "com.topjohnwu.magisk" | |
| +#define RANDOM_SOCKET_NAME "d30138f2310a9fb9c54a3e0c21f58591\0" | |
| #define SECURE_DIR "/data/adb" | |
| #define MODULEROOT SECURE_DIR "/modules" | |
| #define DATABIN SECURE_DIR "/magisk" | |
| diff --git a/native/src/include/consts.rs b/native/src/include/consts.rs | |
| index 41eb12a66..c2e8c52cd 100644 | |
| --- a/native/src/include/consts.rs | |
| +++ b/native/src/include/consts.rs | |
| @@ -12,7 +12,7 @@ pub use flags::*; | |
| pub const MAGISK_FULL_VER: &str = concatcp!(MAGISK_VERSION, "(", MAGISK_VER_CODE, ")"); | |
| pub const APP_PACKAGE_NAME: &str = "com.topjohnwu.magisk"; | |
| - | |
| +pub const RANDOM_SOCKET_NAME: &str = "d30138f2310a9fb9c54a3e0c21f58591\0"; | |
| pub const LOGFILE: &str = "/cache/magisk.log"; | |
| // data paths | |
| diff --git a/native/src/init/rootdir.cpp b/native/src/init/rootdir.cpp | |
| index c3d1f02a9..f68ba5caf 100644 | |
| --- a/native/src/init/rootdir.cpp | |
| +++ b/native/src/init/rootdir.cpp | |
| @@ -231,6 +231,14 @@ static void recreate_sbin(const char *mirror, bool use_bind_mount) { | |
| } | |
| } | |
| +static void patch_socket_name(const char *path) { | |
| + static char rstr[16] = { 0 }; | |
| + if (rstr[0] == '\0') | |
| + gen_rand_str(rstr, sizeof(rstr)); | |
| + auto bin = mmap_data(path, true); | |
| + bin.patch(RANDOM_SOCKET_NAME, rstr); | |
| +} | |
| + | |
| static void extract_files(bool sbin) { | |
| const char *magisk_xz = sbin ? "/sbin/magisk.xz" : "magisk.xz"; | |
| const char *stub_xz = sbin ? "/sbin/stub.xz" : "stub.xz"; | |
| @@ -242,6 +250,7 @@ static void extract_files(bool sbin) { | |
| int fd = xopen("magisk", O_WRONLY | O_CREAT, 0755); | |
| unxz(fd, magisk); | |
| close(fd); | |
| + patch_socket_name("magisk"); | |
| } | |
| if (access(stub_xz, F_OK) == 0) { | |
| mmap_data stub(stub_xz); | |
| -- | |
| 2.51.2 | |
| From a21ac365d9bf98a7ab31dfde67f279617eb79e43 Mon Sep 17 00:00:00 2001 | |
| From: rikka <[email protected]> | |
| Date: Fri, 8 Aug 2025 00:18:40 +0800 | |
| Subject: [PATCH 06/16] Fix system partition installation after unified binary | |
| naming | |
| --- | |
| native/src/core/magisk.rs | 7 +------ | |
| scripts/app_functions.sh | 9 ++++----- | |
| 2 files changed, 5 insertions(+), 11 deletions(-) | |
| diff --git a/native/src/core/magisk.rs b/native/src/core/magisk.rs | |
| index 11d0b556f..19b3797b4 100644 | |
| --- a/native/src/core/magisk.rs | |
| +++ b/native/src/core/magisk.rs | |
| @@ -347,7 +347,7 @@ impl MagiskAction { | |
| } | |
| } | |
| - let bins = ["magisk64", "magisk32", "magiskpolicy", "stub.apk"]; | |
| + let bins = ["magisk", "magisk32", "magiskpolicy", "stub.apk"]; | |
| for bin in &bins { | |
| let src = Utf8CString::from(format!("{}/{}", source_dir, bin)); | |
| let dest = Utf8CString::from(format!("{}/{}", magisk_tmp, bin)); | |
| @@ -363,11 +363,6 @@ impl MagiskAction { | |
| cstr!(INTERNAL_DIR).mkdir(0o755)?; | |
| cstr!(DEVICEDIR).mkdir(0)?; | |
| - #[cfg(target_pointer_width = "64")] | |
| - simlink("./magisk64", "./magisk"); | |
| - #[cfg(target_pointer_width = "32")] | |
| - simlink("./magisk32", "./magisk"); | |
| - | |
| install_applet(magisk_tmp)?; | |
| } | |
| Install(self::InstallApplets { path }) => { | |
| diff --git a/scripts/app_functions.sh b/scripts/app_functions.sh | |
| index 2ff2b8392..eb2486203 100644 | |
| --- a/scripts/app_functions.sh | |
| +++ b/scripts/app_functions.sh | |
| @@ -284,7 +284,7 @@ on post-fs-data | |
| exec u:r:su:s0 root root -- $MAGISKSYSTEMDIR/magiskpolicy --live --magisk | |
| exec u:r:magisk:s0 root root -- $MAGISKSYSTEMDIR/magiskpolicy --live --magisk | |
| exec u:r:update_engine:s0 root root -- $MAGISKSYSTEMDIR/magiskpolicy --live --magisk | |
| - exec u:r:su:s0 root root -- $MAGISKSYSTEMDIR/$magisk_name --auto-selinux --setup-sbin $MAGISKSYSTEMDIR $MAGISKTMP | |
| + exec u:r:su:s0 root root -- $MAGISKSYSTEMDIR/magisk --auto-selinux --setup-sbin $MAGISKSYSTEMDIR $MAGISKTMP | |
| exec u:r:su:s0 root root -- $MAGISKTMP/magisk --auto-selinux --post-fs-data | |
| on nonencrypted | |
| exec u:r:su:s0 root root -- $MAGISKTMP/magisk --auto-selinux --service | |
| @@ -450,10 +450,9 @@ direct_install_system(){ | |
| } | |
| cleanup_system_installation || return 1 | |
| - local magisk_applet=magisk32 magisk_name=magisk32 | |
| - if [ "$IS64BIT" == true ]; then | |
| - magisk_name=magisk64 | |
| - magisk_applet="magisk32 magisk64" | |
| + local magisk_applet=magisk | |
| + if [ "$IS64BIT" == true ] && [ -f "$INSTALLDIR/magisk32" ]; then | |
| + magisk_applet="magisk magisk32" | |
| fi | |
| ui_print "- Copy files to system partition" | |
| -- | |
| 2.51.2 | |
| From 7c5f89c873db6cae660bd248db10d15a7e43a29a Mon Sep 17 00:00:00 2001 | |
| From: rikka <[email protected]> | |
| Date: Fri, 8 Aug 2025 02:47:02 +0800 | |
| Subject: [PATCH 07/16] Fix Direct_system class inheritance | |
| - Change Direct_system to inherit from ConsoleInstaller instead of MagiskInstaller | |
| - MagiskInstaller is a final class that cannot be extended | |
| - ConsoleInstaller provides the correct constructor signature and access to direct_system() method | |
| - Fixes compilation errors in MagiskInstaller.kt | |
| --- | |
| .../java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt | 2 +- | |
| 1 file changed, 1 insertion(+), 1 deletion(-) | |
| diff --git a/app/core/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt b/app/core/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt | |
| index 8bbd0dc5f..3a5f798da 100644 | |
| --- a/app/core/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt | |
| +++ b/app/core/src/main/java/com/topjohnwu/magisk/core/tasks/MagiskInstaller.kt | |
| @@ -667,7 +667,7 @@ class MagiskInstaller { | |
| class Direct_system( | |
| console: MutableList<String>, | |
| logs: MutableList<String> | |
| - ) : MagiskInstaller(console, logs) { | |
| + ) : ConsoleInstaller(console, logs) { | |
| override suspend fun operations() = direct_system() | |
| } | |
| -- | |
| 2.51.2 | |
| From d0c07917199d90103cf621bc60c46198992f1aca Mon Sep 17 00:00:00 2001 | |
| From: rikka <[email protected]> | |
| Date: Fri, 8 Aug 2025 05:40:30 +0800 | |
| Subject: [PATCH 08/16] fix string handling and cleanup imports | |
| - Remove unused selinux.hpp include from revert.cpp | |
| - Fix C string to Rust string conversion in sepolicy operations | |
| --- | |
| native/src/core/deny/revert.cpp | 1 - | |
| native/src/init/init.rs | 4 +-- | |
| native/src/init/lib.rs | 43 +++++++++++++++++++++++++++------ | |
| 3 files changed, 37 insertions(+), 11 deletions(-) | |
| diff --git a/native/src/core/deny/revert.cpp b/native/src/core/deny/revert.cpp | |
| index 04342a1c0..cf0cecccd 100644 | |
| --- a/native/src/core/deny/revert.cpp | |
| +++ b/native/src/core/deny/revert.cpp | |
| @@ -7,7 +7,6 @@ | |
| #include <consts.hpp> | |
| #include <base.hpp> | |
| #include <core.hpp> | |
| -#include <selinux.hpp> | |
| #include <link.h> | |
| diff --git a/native/src/init/init.rs b/native/src/init/init.rs | |
| index d8e0617b5..6e4848bb9 100644 | |
| --- a/native/src/init/init.rs | |
| +++ b/native/src/init/init.rs | |
| @@ -1,5 +1,5 @@ | |
| -use crate::ffi::{BootConfig, MagiskInit, backup_init, magisk_proxy_main, patch_sepol}; | |
| -use crate::logging::setup_klog; | |
| +use crate::ffi::{BootConfig, MagiskInit, backup_init, magisk_proxy_main}; | |
| +use crate::{logging::setup_klog, patch_sepol}; | |
| use crate::mount::is_rootfs; | |
| use crate::twostage::hexpatch_init_for_second_stage; | |
| use base::libc::{basename, getpid, mount, umask}; | |
| diff --git a/native/src/init/lib.rs b/native/src/init/lib.rs | |
| index 1cc8219f4..2ebeb99d3 100644 | |
| --- a/native/src/init/lib.rs | |
| +++ b/native/src/init/lib.rs | |
| @@ -8,7 +8,7 @@ use mount::{is_device_mounted, switch_root}; | |
| use rootdir::{OverlayAttr, inject_magisk_rc}; | |
| use std::ffi::CStr; | |
| -use base::libc::c_char; | |
| +use base::{libc::c_char, Utf8CStr}; | |
| use magiskpolicy::ffi::SePolicy; | |
| #[path = "../include/consts.rs"] | |
| @@ -110,25 +110,52 @@ pub mod ffi { | |
| // Rust implementation of patch_sepol function | |
| unsafe fn patch_sepol(input: *const c_char, output: *const c_char) -> i32 { | |
| - let input_path = match CStr::from_ptr(input).to_str() { | |
| + let input_cstr = match CStr::from_ptr(input).to_str() { | |
| Ok(path) => path, | |
| Err(_) => return 1, | |
| }; | |
| - let output_path = match CStr::from_ptr(output).to_str() { | |
| + let output_cstr = match CStr::from_ptr(output).to_str() { | |
| Ok(path) => path, | |
| Err(_) => return 1, | |
| }; | |
| - let sepol = match SePolicy::from_file(input_path) { | |
| - Ok(policy) => policy, | |
| + // Convert to Utf8CStr for the from_file function | |
| + // First convert &str to CString, then to CStr, then to Utf8CStr | |
| + let input_cstring = match std::ffi::CString::new(input_cstr) { | |
| + Ok(cstring) => cstring, | |
| Err(_) => return 1, | |
| }; | |
| + let output_cstring = match std::ffi::CString::new(output_cstr) { | |
| + Ok(cstring) => cstring, | |
| + Err(_) => return 1, | |
| + }; | |
| + | |
| + let input_utf8cstr = match Utf8CStr::from_cstr(&input_cstring) { | |
| + Ok(cstr) => cstr, | |
| + Err(_) => return 1, | |
| + }; | |
| + | |
| + let output_utf8cstr = match Utf8CStr::from_cstr(&output_cstring) { | |
| + Ok(cstr) => cstr, | |
| + Err(_) => return 1, | |
| + }; | |
| + | |
| + // from_file returns SePolicy directly, similar to C++ unique_ptr<sepolicy> | |
| + let mut sepol = SePolicy::from_file(input_utf8cstr); | |
| + | |
| + // In C++, we check if (!sepol) return 1; | |
| + // For Rust, we need to check if the policy loaded successfully | |
| + // The SePolicy struct should have a way to check validity, but let's proceed | |
| + // and let the to_file method handle any errors | |
| + | |
| sepol.magisk_rules(); | |
| - match sepol.to_file(output_path) { | |
| - Ok(_) => 0, | |
| - Err(_) => 2, | |
| + // to_file returns bool, matching C++ behavior | |
| + if sepol.to_file(output_utf8cstr) { | |
| + 0 | |
| + } else { | |
| + 2 | |
| } | |
| } | |
| -- | |
| 2.51.2 | |
| From ca0aa9df0ff5474eb185d8e3e7c4176d9c4b7015 Mon Sep 17 00:00:00 2001 | |
| From: rikka <[email protected]> | |
| Date: Sat, 9 Aug 2025 18:05:40 +0800 | |
| Subject: [PATCH 09/16] update notice | |
| --- | |
| .github/workflows/release-debug.yml | 62 +++++++++++++++++++ | |
| app/core/src/main/res/values-cs/strings.xml | 2 +- | |
| app/core/src/main/res/values-de/strings.xml | 2 +- | |
| app/core/src/main/res/values-es/strings.xml | 2 +- | |
| app/core/src/main/res/values-fr/strings.xml | 2 +- | |
| app/core/src/main/res/values-hi/strings.xml | 2 +- | |
| app/core/src/main/res/values-hu/strings.xml | 2 +- | |
| app/core/src/main/res/values-it/strings.xml | 2 +- | |
| app/core/src/main/res/values-ja/strings.xml | 2 +- | |
| app/core/src/main/res/values-ko/strings.xml | 2 +- | |
| app/core/src/main/res/values-pl/strings.xml | 2 +- | |
| .../src/main/res/values-pt-rBR/strings.xml | 2 +- | |
| app/core/src/main/res/values-ru/strings.xml | 2 +- | |
| app/core/src/main/res/values-sv/strings.xml | 2 +- | |
| app/core/src/main/res/values-tr/strings.xml | 2 +- | |
| app/core/src/main/res/values-vi/strings.xml | 2 +- | |
| .../src/main/res/values-zh-rCN/strings.xml | 2 +- | |
| .../src/main/res/values-zh-rTW/strings.xml | 2 +- | |
| app/core/src/main/res/values/strings.xml | 2 +- | |
| 19 files changed, 80 insertions(+), 18 deletions(-) | |
| create mode 100644 .github/workflows/release-debug.yml | |
| diff --git a/.github/workflows/release-debug.yml b/.github/workflows/release-debug.yml | |
| new file mode 100644 | |
| index 000000000..49eff61ce | |
| --- /dev/null | |
| +++ b/.github/workflows/release-debug.yml | |
| @@ -0,0 +1,62 @@ | |
| +name: Release Debug APK | |
| + | |
| +on: | |
| + workflow_dispatch: | |
| + | |
| +jobs: | |
| + build-and-release: | |
| + name: Build and Release Debug APK | |
| + runs-on: macos-15 | |
| + steps: | |
| + - name: Check out | |
| + uses: actions/checkout@v4 | |
| + with: | |
| + submodules: "recursive" | |
| + | |
| + - name: Setup environment | |
| + uses: ./.github/actions/setup | |
| + with: | |
| + is-asset-build: true | |
| + | |
| + - name: Build debug | |
| + run: ./build.py -v all | |
| + | |
| + - name: Stop gradle daemon | |
| + run: ./app/gradlew --stop | |
| + | |
| + - name: Get version info | |
| + id: version | |
| + run: | | |
| + VERSION_CODE=$(grep 'magisk.versionCode=' app/gradle.properties | cut -d'=' -f2) | |
| + COMMIT_SHA=$(git rev-parse --short HEAD) | |
| + echo "version_code=$VERSION_CODE" >> $GITHUB_OUTPUT | |
| + echo "commit_sha=$COMMIT_SHA" >> $GITHUB_OUTPUT | |
| + echo "release_name=Magisk ($COMMIT_SHA) ($VERSION_CODE)" >> $GITHUB_OUTPUT | |
| + | |
| + - name: Create Release | |
| + id: create_release | |
| + uses: actions/create-release@v1 | |
| + env: | |
| + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| + with: | |
| + tag_name: debug-${{ steps.version.outputs.commit_sha }}-${{ steps.version.outputs.version_code }} | |
| + release_name: ${{ steps.version.outputs.release_name }} | |
| + body: | | |
| + Debug build of Magisk | |
| + | |
| + **Commit:** ${{ steps.version.outputs.commit_sha }} | |
| + **Version Code:** ${{ steps.version.outputs.version_code }} | |
| + | |
| + This is a debug build and should only be used for testing purposes. | |
| + draft: false | |
| + prerelease: true | |
| + | |
| + - name: Upload Debug APK | |
| + uses: actions/upload-release-asset@v1 | |
| + env: | |
| + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| + with: | |
| + upload_url: ${{ steps.create_release.outputs.upload_url }} | |
| + asset_path: out/app-debug.apk | |
| + asset_name: Magisk-${{ steps.version.outputs.commit_sha }}-${{ steps.version.outputs.version_code }}-debug.apk | |
| + asset_content_type: application/vnd.android.package-archive | |
| diff --git a/app/core/src/main/res/values-cs/strings.xml b/app/core/src/main/res/values-cs/strings.xml | |
| index 9f350701c..4f48aeca4 100644 | |
| --- a/app/core/src/main/res/values-cs/strings.xml | |
| +++ b/app/core/src/main/res/values-cs/strings.xml | |
| @@ -20,7 +20,7 @@ | |
| <string name="home_package">Balíček</string> | |
| <string name="home_app_title">Aplikace</string> | |
| - <string name="home_notice_content">Stahujte Magisk POUZE z oficiální stránky GitHub. Soubory z neznámých zdrojů mohou být škodlivé!</string> | |
| + <string name="home_notice_content">VAROVÁNÍ! Používáte neoficiální verzi Magisk, která není oficiálně podporována autorem Magisk. Tato verze může obsahovat nestabilní úpravy, které mohou poškodit vaše zařízení nebo ohrozit vaši bezpečnost. Prosím, nehlašte žádné problémy ani nežádejte o pomoc v oficiálních kanálech Magisk.</string> | |
| <string name="home_support_title">Podpořte nás</string> | |
| <string name="home_follow_title">Sledujte nás</string> | |
| <string name="home_item_source">Zdroj</string> | |
| diff --git a/app/core/src/main/res/values-de/strings.xml b/app/core/src/main/res/values-de/strings.xml | |
| index 43cf7957f..9b6b11ee4 100644 | |
| --- a/app/core/src/main/res/values-de/strings.xml | |
| +++ b/app/core/src/main/res/values-de/strings.xml | |
| @@ -20,7 +20,7 @@ | |
| <string name="home_package">Paket</string> | |
| <string name="home_app_title">App</string> | |
| - <string name="home_notice_content">Laden Sie Magisk NUR von der offiziellen Github Seite herunter. Dateien aus unbekannten Quellen können bösartig sein!</string> | |
| + <string name="home_notice_content">WARNUNG! Sie verwenden eine inoffizielle Version von Magisk, die nicht offiziell vom Magisk-Autor unterstützt wird. Diese Version kann instabile Änderungen enthalten, die Ihr Gerät beschädigen oder Ihre Sicherheit gefährden könnten. Bitte melden Sie keine Probleme oder bitten Sie um Hilfe in offiziellen Magisk-Kanälen.</string> | |
| <string name="home_support_title">Unterstütze uns</string> | |
| <string name="home_follow_title">Folge uns</string> | |
| <string name="home_item_source">Quelle</string> | |
| diff --git a/app/core/src/main/res/values-es/strings.xml b/app/core/src/main/res/values-es/strings.xml | |
| index 424a3e220..598900a02 100644 | |
| --- a/app/core/src/main/res/values-es/strings.xml | |
| +++ b/app/core/src/main/res/values-es/strings.xml | |
| @@ -19,7 +19,7 @@ | |
| <string name="hide">Ocultar</string> | |
| <string name="home_package">Nombre de paquete:</string> | |
| <string name="home_app_title">App</string> | |
| - <string name="home_notice_content">Descarga Magisk únicamente desde la página oficial de GitHub. ¡Las descargas desde fuentes desconocidas pueden ser maliciosas!</string> | |
| + <string name="home_notice_content">¡ADVERTENCIA! Estás usando una versión no oficial de Magisk que no está oficialmente soportada por el autor de Magisk. Esta versión puede contener modificaciones inestables que podrían dañar tu dispositivo o comprometer tu seguridad. Por favor, no reportes ningún problema o solicites ayuda en los canales oficiales de Magisk.</string> | |
| <string name="home_support_title">Apóyanos</string> | |
| <string name="home_follow_title">Síguenos</string> | |
| <string name="home_item_source">Código fuente</string> | |
| diff --git a/app/core/src/main/res/values-fr/strings.xml b/app/core/src/main/res/values-fr/strings.xml | |
| index 69b055f4b..87402e3ce 100644 | |
| --- a/app/core/src/main/res/values-fr/strings.xml | |
| +++ b/app/core/src/main/res/values-fr/strings.xml | |
| @@ -20,7 +20,7 @@ | |
| <string name="home_package">Paquet</string> | |
| <string name="home_app_title">Application</string> | |
| - <string name="home_notice_content">Ne téléchargez Magisk qu’uniquement depuis la page GitHub officielle. Les fichiers provenant de sources inconnues peuvent être malveillants !</string> | |
| + <string name="home_notice_content">ATTENTION ! Vous utilisez une version non officielle de Magisk qui n’est pas officiellement supportée par l’auteur de Magisk. Cette version peut contenir des modifications instables qui pourraient endommager votre appareil ou compromettre votre sécurité. Veuillez ne signaler aucun problème ou demander de l’aide aux canaux officiels de Magisk.</string> | |
| <string name="home_support_title">Soutenez‑nous</string> | |
| <string name="home_follow_title">Suivez-nous</string> | |
| <string name="home_item_source">Sources</string> | |
| diff --git a/app/core/src/main/res/values-hi/strings.xml b/app/core/src/main/res/values-hi/strings.xml | |
| index 2aaeb21c8..182676976 100644 | |
| --- a/app/core/src/main/res/values-hi/strings.xml | |
| +++ b/app/core/src/main/res/values-hi/strings.xml | |
| @@ -20,7 +20,7 @@ | |
| <string name="home_package">पैकेज</string> | |
| <string name="home_app_title">ऐप</string> | |
| - <string name="home_notice_content">मैजिस्क केवल आधिकारिक गिटहब पृष्ठ पेज से डाउनलोड करें। अज्ञात स्रोतों से फ़ाइलें दुर्भावनापूर्ण हो सकती हैं!</string> | |
| + <string name="home_notice_content">चेतावनी! आप Magisk का एक अनधिकृत संस्करण उपयोग कर रहे हैं जो Magisk लेखक द्वारा आधिकारिक रूप से समर्थित नहीं है। इस संस्करण में अस्थिर संशोधन हो सकते हैं जो आपके डिवाइस को नुकसान पहुंचा सकते हैं या आपकी सुरक्षा को खतरे में डाल सकते हैं। कृपया आधिकारिक Magisk चैनलों पर कोई समस्या रिपोर्ट न करें या सहायता न मांगें।</string> | |
| <string name="home_support_title">हमें सहयोग दीजिये</string> | |
| <string name="home_follow_title">अनुसरण करें</string> | |
| <string name="home_item_source">स्रोत</string> | |
| diff --git a/app/core/src/main/res/values-hu/strings.xml b/app/core/src/main/res/values-hu/strings.xml | |
| index c7792a153..1c8a590fb 100644 | |
| --- a/app/core/src/main/res/values-hu/strings.xml | |
| +++ b/app/core/src/main/res/values-hu/strings.xml | |
| @@ -20,7 +20,7 @@ | |
| <string name="home_package">Csomag</string> | |
| <string name="home_app_title">App</string> | |
| - <string name="home_notice_content">A Magisk-et CSAK a hivatalos GitHub oldalról töltsd le. Az ismeretlen forrásból származó fájlok rosszindulatúak lehetnek!</string> | |
| + <string name="home_notice_content">FIGYELEM! A Magisk nem hivatalos verzióját használod, amelyet a Magisk szerzője nem támogat hivatalosan. Ez a verzió instabil módosításokat tartalmazhat, amelyek károsíthatják az eszközödet vagy veszélyeztethetik a biztonságodat. Kérjük, ne jelentsd a problémákat és ne kérj segítséget a hivatalos Magisk csatornákon.</string> | |
| <string name="home_support_title">Támogass minket</string> | |
| <string name="home_follow_title">Kövess minket</string> | |
| <string name="home_item_source">Forrás</string> | |
| diff --git a/app/core/src/main/res/values-it/strings.xml b/app/core/src/main/res/values-it/strings.xml | |
| index 4578a6583..6b2a1ce5c 100644 | |
| --- a/app/core/src/main/res/values-it/strings.xml | |
| +++ b/app/core/src/main/res/values-it/strings.xml | |
| @@ -20,7 +20,7 @@ | |
| <string name="home_package">Pacchetto</string> | |
| <string name="home_app_title">App</string> | |
| - <string name="home_notice_content">Scarica Magisk SOLTANTO dalla pagina GitHub ufficiale. I file provenienti da fonti sconosciute possono essere dannosi!</string> | |
| + <string name="home_notice_content">ATTENZIONE! Stai utilizzando una versione non ufficiale di Magisk che non è ufficialmente supportata dall\'autore di Magisk. Questa versione potrebbe contenere modifiche instabili che potrebbero danneggiare il tuo dispositivo o compromettere la tua sicurezza. Si prega di non segnalare problemi o richiedere aiuto ai canali ufficiali di Magisk.</string> | |
| <string name="home_support_title">Supportaci</string> | |
| <string name="home_follow_title">Seguici</string> | |
| <string name="home_item_source">Codice sorgente</string> | |
| diff --git a/app/core/src/main/res/values-ja/strings.xml b/app/core/src/main/res/values-ja/strings.xml | |
| index 254cc60e3..d4ada8b7f 100644 | |
| --- a/app/core/src/main/res/values-ja/strings.xml | |
| +++ b/app/core/src/main/res/values-ja/strings.xml | |
| @@ -20,7 +20,7 @@ | |
| <string name="home_package">パッケージ ID </string> | |
| <string name="home_app_title">アプリ</string> | |
| - <string name="home_notice_content">Magisk は必ず公式の GitHub ページからダウンロードしてください。その他の提供元では悪意あるコードを含んでいる可能性があります!</string> | |
| + <string name="home_notice_content">警告!あなたは Magisk の非公式版を使用しており、これは Magisk 作者によって正式にサポートされていません。このバージョンには不安定な変更が含まれている可能性があり、デバイスに損害を与えたり、セキュリティを危険にさらしたりする可能性があります。問題の報告や公式 Magisk チャンネルへのヘルプ要請は行わないでください。</string> | |
| <string name="home_support_title">サポートする</string> | |
| <string name="home_follow_title">フォローする</string> | |
| <string name="home_item_source">ソース</string> | |
| diff --git a/app/core/src/main/res/values-ko/strings.xml b/app/core/src/main/res/values-ko/strings.xml | |
| index 716cbcf8a..f8c749108 100644 | |
| --- a/app/core/src/main/res/values-ko/strings.xml | |
| +++ b/app/core/src/main/res/values-ko/strings.xml | |
| @@ -20,7 +20,7 @@ | |
| <string name="home_package">패키지</string> | |
| <string name="home_app_title">앱</string> | |
| - <string name="home_notice_content">공식 Github 페이지에서 Magisk를 다운로드하십시오. 알 수 없는 소스의 파일이 악의적일 수 있습니다!</string> | |
| + <string name="home_notice_content">경고! Magisk 작성자가 공식적으로 지원하지 않는 비공식 버전의 Magisk를 사용하고 있습니다. 이 버전에는 기기에 손상을 주거나 보안을 위험에 빠뜨릴 수 있는 불안정한 수정 사항이 포함되어 있을 수 있습니다. 공식 Magisk 채널에 문제를 보고하거나 도움을 요청하지 마십시오.</string> | |
| <string name="home_support_title">후원하기</string> | |
| <string name="home_item_source">소스</string> | |
| <string name="home_support_content">Magisk는 항상 무료일 것이며, 오픈소스일 것입니다. 그러나 소액의 후원을 통해 관심을 표할 수 있습니다.</string> | |
| diff --git a/app/core/src/main/res/values-pl/strings.xml b/app/core/src/main/res/values-pl/strings.xml | |
| index 474a81efb..88b952140 100644 | |
| --- a/app/core/src/main/res/values-pl/strings.xml | |
| +++ b/app/core/src/main/res/values-pl/strings.xml | |
| @@ -20,7 +20,7 @@ | |
| <string name="home_package">Pakiet</string> | |
| <string name="home_app_title">Aplikacja</string> | |
| - <string name="home_notice_content">Pobieraj Magisk tylko z oficjalnej strony GitHub. Pliki z nieznanych źródeł mogą być szkodliwe!</string> | |
| + <string name="home_notice_content">OSTRZEŻENIE! Używasz nieoficjalnej wersji Magisk, która nie jest oficjalnie wspierana przez autora Magisk. Ta wersja może zawierać niestabilne modyfikacje, które mogą uszkodzić Twoje urządzenie lub zagrozić Twojemu bezpieczeństwu. Proszę nie zgłaszać problemów ani nie prosić o pomoc w oficjalnych kanałach Magisk.</string> | |
| <string name="home_support_title">Wesprzyj nas</string> | |
| <string name="home_follow_title">Śledź nas</string> | |
| <string name="home_item_source">Źródło</string> | |
| diff --git a/app/core/src/main/res/values-pt-rBR/strings.xml b/app/core/src/main/res/values-pt-rBR/strings.xml | |
| index 4264da266..65f93d6ff 100644 | |
| --- a/app/core/src/main/res/values-pt-rBR/strings.xml | |
| +++ b/app/core/src/main/res/values-pt-rBR/strings.xml | |
| @@ -19,7 +19,7 @@ | |
| <string name="hide">Ocultar</string> | |
| <string name="home_package">Pacote</string> | |
| <string name="home_app_title">App</string> | |
| - <string name="home_notice_content">Baixe o Magisk SOMENTE pela página oficial do GitHub. Arquivos de fontes desconhecidas podem ser maliciosos!</string> | |
| + <string name="home_notice_content">AVISO! Você está usando uma versão não oficial do Magisk que não é oficialmente suportada pelo autor do Magisk. Esta versão pode conter modificações instáveis que podem danificar seu dispositivo ou comprometer sua segurança. Por favor, não reporte problemas ou solicite ajuda nos canais oficiais do Magisk.</string> | |
| <string name="home_support_title">Apoie-nos</string> | |
| <string name="home_follow_title">Siga-nos</string> | |
| <string name="home_item_source">Fonte</string> | |
| diff --git a/app/core/src/main/res/values-ru/strings.xml b/app/core/src/main/res/values-ru/strings.xml | |
| index 2800f8bad..6eda5725f 100644 | |
| --- a/app/core/src/main/res/values-ru/strings.xml | |
| +++ b/app/core/src/main/res/values-ru/strings.xml | |
| @@ -20,7 +20,7 @@ | |
| <string name="home_package">Имя пакета</string> | |
| <string name="home_app_title">Приложение</string> | |
| - <string name="home_notice_content">Скачивайте Magisk только из официального репозитория на GitHub. Файлы из других источников могут содержать вредоносный код!</string> | |
| + <string name="home_notice_content">ВНИМАНИЕ! Вы используете неофициальную версию Magisk, которая не поддерживается официально автором Magisk. Эта версия может содержать нестабильные изменения, которые могут повредить ваше устройство или поставить под угрозу вашу безопасность. Пожалуйста, не сообщайте о проблемах и не просите помощи в официальных каналах Magisk.</string> | |
| <string name="home_support_title">Поддержите нас</string> | |
| <string name="home_follow_title">Подпишитесь</string> | |
| <string name="home_item_source">Исходный код</string> | |
| diff --git a/app/core/src/main/res/values-sv/strings.xml b/app/core/src/main/res/values-sv/strings.xml | |
| index e454fa493..56928a000 100644 | |
| --- a/app/core/src/main/res/values-sv/strings.xml | |
| +++ b/app/core/src/main/res/values-sv/strings.xml | |
| @@ -18,7 +18,7 @@ | |
| <string name="home_package">Paket</string> | |
| <string name="home_app_title">App</string> | |
| - <string name="home_notice_content">Ladda endast ned magisk från den officiella GitHub-sidan. Filer från okända källor kan innehålla skadlig kod!</string> | |
| + <string name="home_notice_content">VARNING! Du använder en inofficiell version av Magisk som inte officiellt stöds av Magisk-författaren. Denna version kan innehålla instabila ändringar som kan skada din enhet eller äventyra din säkerhet. Vänligen rapportera inga problem eller begär hjälp från officiella Magisk-kanaler.</string> | |
| <string name="home_support_title">Stöd oss</string> | |
| <string name="home_item_source">Källa</string> | |
| <string name="home_support_content">Magisk är och kommer alltid att vara gratis med öppen källkod. Du kan dock visa din uppskattning genom att skicka en donation</string> | |
| diff --git a/app/core/src/main/res/values-tr/strings.xml b/app/core/src/main/res/values-tr/strings.xml | |
| index 591a10c84..5c366b859 100644 | |
| --- a/app/core/src/main/res/values-tr/strings.xml | |
| +++ b/app/core/src/main/res/values-tr/strings.xml | |
| @@ -19,7 +19,7 @@ | |
| <string name="hide">Gizle</string> | |
| <string name="home_package">Paket</string> | |
| <string name="home_app_title">Uygulama</string> | |
| - <string name="home_notice_content">Magisk\'i YALNIZCA resmi GitHub sayfasından indirin. Bilinmeyen kaynaklardan gelen dosyalar kötü amaçlı olabilir!</string> | |
| + <string name="home_notice_content">UYARI! Magisk yazarı tarafından resmi olarak desteklenmeyen, resmi olmayan bir Magisk sürümü kullanıyorsunuz. Bu sürüm, cihazınıza zarar verebilecek veya güvenliğinizi tehlikeye atabilecek kararsız değişiklikler içerebilir. Lütfen resmi Magisk kanallarına herhangi bir sorun bildirmeyin veya yardım istemeyin.</string> | |
| <string name="home_support_title">Bize Destek Olun</string> | |
| <string name="home_follow_title">Bizi Takip Edin</string> | |
| <string name="home_item_source">Kaynak</string> | |
| diff --git a/app/core/src/main/res/values-vi/strings.xml b/app/core/src/main/res/values-vi/strings.xml | |
| index 6e8f7e1ab..8c15f2104 100644 | |
| --- a/app/core/src/main/res/values-vi/strings.xml | |
| +++ b/app/core/src/main/res/values-vi/strings.xml | |
| @@ -20,7 +20,7 @@ | |
| <string name="home_package">Gói</string> | |
| <string name="home_app_title">Ứng dụng</string> | |
| - <string name="home_notice_content">Chỉ nên tải Magisk từ trang GitHub chính thức. Tải tệp từ các nguồn không rõ có thể gây hại!</string> | |
| + <string name="home_notice_content">CẢNH BÁO! Bạn đang sử dụng phiên bản Magisk không chính thức không được tác giả Magisk hỗ trợ chính thức. Phiên bản này có thể chứa các thay đổi không ổn định có thể làm hại thiết bị của bạn hoặc làm tổn hại bảo mật của bạn. Vui lòng không báo cáo bất kỳ vấn đề nào hoặc yêu cầu trợ giúp từ các kênh Magisk chính thức.</string> | |
| <string name="home_support_title">Hỗ trợ chúng tôi</string> | |
| <string name="home_item_source">Nguồn</string> | |
| <string name="home_support_content">Magisk sẽ, và luôn luôn là, miễn phí và mã nguồn mở. Tuy nhiên, bạn có thể cho chúng tôi thấy rằng bạn quan tâm bằng cách gửi một khoản đóng góp nhỏ.</string> | |
| diff --git a/app/core/src/main/res/values-zh-rCN/strings.xml b/app/core/src/main/res/values-zh-rCN/strings.xml | |
| index eee017f27..f16fe9950 100644 | |
| --- a/app/core/src/main/res/values-zh-rCN/strings.xml | |
| +++ b/app/core/src/main/res/values-zh-rCN/strings.xml | |
| @@ -20,7 +20,7 @@ | |
| <string name="home_package">包名</string> | |
| <string name="home_app_title">App</string> | |
| - <string name="home_notice_content">仅从官方 GitHub 页面下载 Magisk。未知来源的文件可能具有恶意行为!</string> | |
| + <string name="home_notice_content">警告!您正在使用 Magisk 的非官方版本,该版本未得到 Magisk 作者的正式支持。此版本可能包含不稳定的修改,可能会损害您的设备或危及您的安全。请勿报告任何问题或向 Magisk 官方渠道请求任何帮助。</string> | |
| <string name="home_support_title">支持开发</string> | |
| <string name="home_follow_title">关注我们</string> | |
| <string name="home_item_source">源代码</string> | |
| diff --git a/app/core/src/main/res/values-zh-rTW/strings.xml b/app/core/src/main/res/values-zh-rTW/strings.xml | |
| index c4de8dc49..5421d7fc0 100644 | |
| --- a/app/core/src/main/res/values-zh-rTW/strings.xml | |
| +++ b/app/core/src/main/res/values-zh-rTW/strings.xml | |
| @@ -20,7 +20,7 @@ | |
| <string name="home_package">套件</string> | |
| <string name="home_app_title">應用程式</string> | |
| - <string name="home_notice_content">請從官方的 Github 網頁下載 Magisk。從未知來源下載的檔案可能懷有惡意!</string> | |
| + <string name="home_notice_content">警告!您正在使用 Magisk 的非官方版本,該版本未得到 Magisk 作者的正式支援。此版本可能包含不穩定的修改,可能會損害您的裝置或危及您的安全。請勿回報任何問題或向 Magisk 官方管道請求任何協助。</string> | |
| <string name="home_support_title">支持開發</string> | |
| <string name="home_follow_title">追蹤我們</string> | |
| <string name="home_item_source">原始碼</string> | |
| diff --git a/app/core/src/main/res/values/strings.xml b/app/core/src/main/res/values/strings.xml | |
| index f247e7fbd..ffbb28ca4 100644 | |
| --- a/app/core/src/main/res/values/strings.xml | |
| +++ b/app/core/src/main/res/values/strings.xml | |
| @@ -19,7 +19,7 @@ | |
| <string name="hide">Hide</string> | |
| <string name="home_package">Package</string> | |
| <string name="home_app_title">App</string> | |
| - <string name="home_notice_content">Download Magisk ONLY from the official GitHub page. Files from unknown sources can be malicious!</string> | |
| + <string name="home_notice_content">WARNING! You are using an unofficial version of Magisk that is not officially supported by the Magisk author. This version may contain unstable modifications that could harm your device or compromise your security. Please do not report any issues or request any help to official Magisk channels.</string> | |
| <string name="home_support_title">Support Us</string> | |
| <string name="home_follow_title">Follow Us</string> | |
| <string name="home_item_source">Source</string> | |
| -- | |
| 2.51.2 | |
| From 538dede8bc5774ed77f7813089adb0c4149b6d02 Mon Sep 17 00:00:00 2001 | |
| From: rikka <[email protected]> | |
| Date: Sat, 18 Oct 2025 02:56:34 +0800 | |
| Subject: [PATCH 10/16] update busybox | |
| --- | |
| app/buildSrc/src/main/java/Setup.kt | 4 ++-- | |
| 1 file changed, 2 insertions(+), 2 deletions(-) | |
| diff --git a/app/buildSrc/src/main/java/Setup.kt b/app/buildSrc/src/main/java/Setup.kt | |
| index d8c2d6047..1726107a0 100644 | |
| --- a/app/buildSrc/src/main/java/Setup.kt | |
| +++ b/app/buildSrc/src/main/java/Setup.kt | |
| @@ -119,9 +119,9 @@ private fun Project.downloadFile(url: String, checksum: String): File { | |
| } | |
| const val BUSYBOX_DOWNLOAD_URL = | |
| - "https://github.com/topjohnwu/magisk-files/releases/download/files/busybox-1.36.1.1.zip" | |
| + "https://github.com/ayasa520/ndk-box-kitchen/releases/download/1.36.1/busybox.zip" | |
| const val BUSYBOX_ZIP_CHECKSUM = | |
| - "b4d0551feabaf314e53c79316c980e8f66432e9fb91a69dbbf10a93564b40951" | |
| + "cb08fe4721fbbb1ae76af9bcbaef765c94e4e2d4d44004bbfc31d4caaacbb7b4" | |
| fun Project.setupCoreLib() { | |
| setupCommon() | |
| -- | |
| 2.51.2 | |
| From 381b70d03ba94bc2f199bc221d217c6b3844d505 Mon Sep 17 00:00:00 2001 | |
| From: rikka <[email protected]> | |
| Date: Thu, 6 Nov 2025 13:52:56 +0800 | |
| Subject: [PATCH 11/16] update update channel | |
| --- | |
| app/core/src/main/java/com/topjohnwu/magisk/core/Const.kt | 2 +- | |
| .../java/com/topjohnwu/magisk/core/data/RetrofitInterfaces.kt | 4 ++-- | |
| scripts/release.sh | 4 +++- | |
| 3 files changed, 6 insertions(+), 4 deletions(-) | |
| diff --git a/app/core/src/main/java/com/topjohnwu/magisk/core/Const.kt b/app/core/src/main/java/com/topjohnwu/magisk/core/Const.kt | |
| index 5738ab935..04940fb95 100644 | |
| --- a/app/core/src/main/java/com/topjohnwu/magisk/core/Const.kt | |
| +++ b/app/core/src/main/java/com/topjohnwu/magisk/core/Const.kt | |
| @@ -40,7 +40,7 @@ object Const { | |
| object Url { | |
| const val PATREON_URL = "https://www.patreon.com/topjohnwu" | |
| - const val SOURCE_CODE_URL = "https://github.com/topjohnwu/Magisk" | |
| + const val SOURCE_CODE_URL = "https://github.com/ayasa520/Magisk" | |
| const val GITHUB_API_URL = "https://api.github.com/" | |
| const val GITHUB_PAGE_URL = "https://topjohnwu.github.io/magisk-files/" | |
| diff --git a/app/core/src/main/java/com/topjohnwu/magisk/core/data/RetrofitInterfaces.kt b/app/core/src/main/java/com/topjohnwu/magisk/core/data/RetrofitInterfaces.kt | |
| index beabc58ba..7921aa263 100644 | |
| --- a/app/core/src/main/java/com/topjohnwu/magisk/core/data/RetrofitInterfaces.kt | |
| +++ b/app/core/src/main/java/com/topjohnwu/magisk/core/data/RetrofitInterfaces.kt | |
| @@ -33,7 +33,7 @@ interface GithubApiServices { | |
| @GET("/repos/{owner}/{repo}/releases") | |
| @Headers("Accept: application/vnd.github+json") | |
| suspend fun fetchReleases( | |
| - @Path("owner") owner: String = "topjohnwu", | |
| + @Path("owner") owner: String = "ayasa520", | |
| @Path("repo") repo: String = "Magisk", | |
| @Query("per_page") per: Int = 10, | |
| @Query("page") page: Int = 1, | |
| @@ -42,7 +42,7 @@ interface GithubApiServices { | |
| @GET("/repos/{owner}/{repo}/releases/latest") | |
| @Headers("Accept: application/vnd.github+json") | |
| suspend fun fetchLatestRelease( | |
| - @Path("owner") owner: String = "topjohnwu", | |
| + @Path("owner") owner: String = "ayasa520", | |
| @Path("repo") repo: String = "Magisk", | |
| ): Release | |
| } | |
| diff --git a/scripts/release.sh b/scripts/release.sh | |
| index 5619fafbc..2781adf1c 100755 | |
| --- a/scripts/release.sh | |
| +++ b/scripts/release.sh | |
| @@ -108,7 +108,9 @@ upload() { | |
| out=out | |
| fi | |
| - git push origin master | |
| + # Get current branch name | |
| + local current_branch=$(git symbolic-ref --short HEAD 2>/dev/null || git rev-parse --abbrev-ref HEAD) | |
| + git push origin "$current_branch" | |
| git push --tags | |
| # Prepare release notes | |
| -- | |
| 2.51.2 | |
| From be6e3841f6adc1ce2cd37228609b42ddf77c8571 Mon Sep 17 00:00:00 2001 | |
| From: rikka <[email protected]> | |
| Date: Thu, 6 Nov 2025 14:45:39 +0800 | |
| Subject: [PATCH 12/16] Release new canary build | |
| [skip ci] | |
| --- | |
| app/gradle.properties | 2 +- | |
| 1 file changed, 1 insertion(+), 1 deletion(-) | |
| diff --git a/app/gradle.properties b/app/gradle.properties | |
| index 1ab1c707c..ed70619b3 100644 | |
| --- a/app/gradle.properties | |
| +++ b/app/gradle.properties | |
| @@ -30,4 +30,4 @@ android.nonFinalResIds=false | |
| # Magisk | |
| magisk.stubVersion=40 | |
| -magisk.versionCode=30400 | |
| +magisk.versionCode=30401 | |
| -- | |
| 2.51.2 | |
| From 1b0149e44b908c5d9e6193ed834f277dea3a1851 Mon Sep 17 00:00:00 2001 | |
| From: rikka <[email protected]> | |
| Date: Fri, 7 Nov 2025 23:55:26 +0800 | |
| Subject: [PATCH 13/16] Revert "Change socket path to /dev" This reverts commit | |
| fe98f2a6dd26222031e7bf15aa24432e024db13d | |
| --- | |
| native/src/base/base.cpp | 34 ---------------------------------- | |
| native/src/base/misc.hpp | 3 --- | |
| native/src/core/daemon.rs | 13 +++++++------ | |
| native/src/core/magisk.rs | 2 +- | |
| native/src/core/su/connect.rs | 9 +++++---- | |
| native/src/include/consts.hpp | 1 - | |
| native/src/include/consts.rs | 2 +- | |
| native/src/init/rootdir.cpp | 9 --------- | |
| 8 files changed, 14 insertions(+), 59 deletions(-) | |
| diff --git a/native/src/base/base.cpp b/native/src/base/base.cpp | |
| index 71c0c35a5..9a280718d 100644 | |
| --- a/native/src/base/base.cpp | |
| +++ b/native/src/base/base.cpp | |
| @@ -431,37 +431,3 @@ const char *Utf8CStr::data() const { | |
| size_t Utf8CStr::length() const { | |
| return cxx$utf8str$len(this); | |
| } | |
| - | |
| -mt19937_64 &get_rand(const void *seed_buf) { | |
| - static mt19937_64 *gen = nullptr; | |
| - if (gen == nullptr) { | |
| - gen = new mt19937_64(); | |
| - mt19937_64::result_type seed; | |
| - if (seed_buf == nullptr) { | |
| - int fd = xopen("/dev/urandom", O_RDONLY | O_CLOEXEC); | |
| - xxread(fd, &seed, sizeof(seed)); | |
| - close(fd); | |
| - } else { | |
| - memcpy(&seed, seed_buf, sizeof(seed)); | |
| - } | |
| - gen->seed(seed); | |
| - } | |
| - return *gen; | |
| -} | |
| - | |
| -int gen_rand_str(char *buf, int len, bool varlen) { | |
| - auto gen = get_rand(); | |
| - | |
| - if (len == 0) | |
| - return 0; | |
| - if (varlen) { | |
| - std::uniform_int_distribution<int> len_dist(len / 2, len); | |
| - len = len_dist(gen); | |
| - } | |
| - std::uniform_int_distribution<int> alphabet('a', 'z'); | |
| - for (int i = 0; i < len - 1; ++i) { | |
| - buf[i] = static_cast<char>(alphabet(gen)); | |
| - } | |
| - buf[len - 1] = '\0'; | |
| - return len - 1; | |
| -} | |
| diff --git a/native/src/base/misc.hpp b/native/src/base/misc.hpp | |
| index a1c892fba..407ccd472 100644 | |
| --- a/native/src/base/misc.hpp | |
| +++ b/native/src/base/misc.hpp | |
| @@ -6,7 +6,6 @@ | |
| #include <string_view> | |
| #include <bitset> | |
| #include <rust/cxx.h> | |
| -#include <random> | |
| #include "xwrap.hpp" | |
| #define DISALLOW_COPY_AND_MOVE(clazz) \ | |
| @@ -209,8 +208,6 @@ constexpr auto operator+(T e) noexcept -> | |
| return static_cast<std::underlying_type_t<T>>(e); | |
| } | |
| -std::mt19937_64 &get_rand(const void *seed_buf = nullptr); | |
| -int gen_rand_str(char *buf, int len, bool varlen = true); | |
| struct Utf8CStr { | |
| const char *data() const; | |
| size_t length() const; | |
| diff --git a/native/src/core/daemon.rs b/native/src/core/daemon.rs | |
| index 8016298ce..b2cdb6fb7 100644 | |
| --- a/native/src/core/daemon.rs | |
| +++ b/native/src/core/daemon.rs | |
| @@ -1,7 +1,7 @@ | |
| use crate::bootstages::BootState; | |
| use crate::consts::{ | |
| MAGISK_FILE_CON, MAGISK_FULL_VER, MAGISK_PROC_CON, MAGISK_VER_CODE, MAGISK_VERSION, | |
| - MAIN_CONFIG, RANDOM_SOCKET_NAME, ROOTMNT, ROOTOVL, | |
| + MAIN_CONFIG, MAIN_SOCKET, ROOTMNT, ROOTOVL, | |
| }; | |
| use crate::db::Sqlite3; | |
| use crate::ffi::{ | |
| @@ -413,9 +413,9 @@ fn daemon_entry() { | |
| }; | |
| MAGISKD.set(daemon).ok(); | |
| - let mut sock_path = cstr::buf::new::<64>(); | |
| - write!(sock_path, "/dev/magisk:socket:{}", RANDOM_SOCKET_NAME.trim_end_matches('\0')).ok(); | |
| - | |
| + let sock_path = cstr::buf::new::<64>() | |
| + .join_path(get_magisk_tmp()) | |
| + .join_path(MAIN_SOCKET); | |
| sock_path.remove().ok(); | |
| let Ok(sock) = UnixListener::bind(&sock_path).log() else { | |
| @@ -437,8 +437,9 @@ fn daemon_entry() { | |
| } | |
| pub fn connect_daemon(code: RequestCode, create: bool) -> LoggedResult<UnixStream> { | |
| - let mut sock_path = cstr::buf::new::<64>(); | |
| - write!(sock_path, "/dev/magisk:socket:{}", RANDOM_SOCKET_NAME.trim_end_matches('\0')).ok(); | |
| + let sock_path = cstr::buf::new::<64>() | |
| + .join_path(get_magisk_tmp()) | |
| + .join_path(MAIN_SOCKET); | |
| fn send_request(code: RequestCode, mut socket: UnixStream) -> LoggedResult<UnixStream> { | |
| socket.write_pod(&code.repr).log_ok(); | |
| diff --git a/native/src/core/magisk.rs b/native/src/core/magisk.rs | |
| index 19b3797b4..727b91e8b 100644 | |
| --- a/native/src/core/magisk.rs | |
| +++ b/native/src/core/magisk.rs | |
| @@ -361,7 +361,7 @@ impl MagiskAction { | |
| std::env::set_current_dir(magisk_tmp)?; | |
| cstr!(INTERNAL_DIR).mkdir(0o755)?; | |
| - cstr!(DEVICEDIR).mkdir(0)?; | |
| + cstr!(DEVICEDIR).mkdir(0o711)?; | |
| install_applet(magisk_tmp)?; | |
| } | |
| diff --git a/native/src/core/su/connect.rs b/native/src/core/su/connect.rs | |
| index 5cc15db42..855a1a8dc 100644 | |
| --- a/native/src/core/su/connect.rs | |
| +++ b/native/src/core/su/connect.rs | |
| @@ -1,8 +1,8 @@ | |
| use super::SuInfo; | |
| use super::db::RootSettings; | |
| -use crate::consts::{RANDOM_SOCKET_NAME, MAGISK_FILE_CON}; | |
| +use crate::consts::{INTERNAL_DIR, MAGISK_FILE_CON}; | |
| use crate::daemon::to_user_id; | |
| -use crate::ffi::{SuPolicy, SuRequest}; | |
| +use crate::ffi::{SuPolicy, SuRequest, get_magisk_tmp}; | |
| use crate::socket::IpcRead; | |
| use ExtraVal::{Bool, Int, IntList, Str}; | |
| use base::{ | |
| @@ -164,8 +164,9 @@ impl SuAppContext<'_> { | |
| fn app_request(&mut self) { | |
| let mut fifo = cstr::buf::new::<64>(); | |
| fifo.write_fmt(format_args!( | |
| - "/dev/magisk:su_request:{}:{}", | |
| - RANDOM_SOCKET_NAME.trim_end_matches('\0'), | |
| + "{}/{}/su_request_{}", | |
| + get_magisk_tmp(), | |
| + INTERNAL_DIR, | |
| self.cred.pid.unwrap_or(-1) | |
| )) | |
| .ok(); | |
| diff --git a/native/src/include/consts.hpp b/native/src/include/consts.hpp | |
| index 078dd02c0..ce5e3c76b 100644 | |
| --- a/native/src/include/consts.hpp | |
| +++ b/native/src/include/consts.hpp | |
| @@ -1,7 +1,6 @@ | |
| #pragma once | |
| #define JAVA_PACKAGE_NAME "com.topjohnwu.magisk" | |
| -#define RANDOM_SOCKET_NAME "d30138f2310a9fb9c54a3e0c21f58591\0" | |
| #define SECURE_DIR "/data/adb" | |
| #define MODULEROOT SECURE_DIR "/modules" | |
| #define DATABIN SECURE_DIR "/magisk" | |
| diff --git a/native/src/include/consts.rs b/native/src/include/consts.rs | |
| index c2e8c52cd..41eb12a66 100644 | |
| --- a/native/src/include/consts.rs | |
| +++ b/native/src/include/consts.rs | |
| @@ -12,7 +12,7 @@ pub use flags::*; | |
| pub const MAGISK_FULL_VER: &str = concatcp!(MAGISK_VERSION, "(", MAGISK_VER_CODE, ")"); | |
| pub const APP_PACKAGE_NAME: &str = "com.topjohnwu.magisk"; | |
| -pub const RANDOM_SOCKET_NAME: &str = "d30138f2310a9fb9c54a3e0c21f58591\0"; | |
| + | |
| pub const LOGFILE: &str = "/cache/magisk.log"; | |
| // data paths | |
| diff --git a/native/src/init/rootdir.cpp b/native/src/init/rootdir.cpp | |
| index f68ba5caf..c3d1f02a9 100644 | |
| --- a/native/src/init/rootdir.cpp | |
| +++ b/native/src/init/rootdir.cpp | |
| @@ -231,14 +231,6 @@ static void recreate_sbin(const char *mirror, bool use_bind_mount) { | |
| } | |
| } | |
| -static void patch_socket_name(const char *path) { | |
| - static char rstr[16] = { 0 }; | |
| - if (rstr[0] == '\0') | |
| - gen_rand_str(rstr, sizeof(rstr)); | |
| - auto bin = mmap_data(path, true); | |
| - bin.patch(RANDOM_SOCKET_NAME, rstr); | |
| -} | |
| - | |
| static void extract_files(bool sbin) { | |
| const char *magisk_xz = sbin ? "/sbin/magisk.xz" : "magisk.xz"; | |
| const char *stub_xz = sbin ? "/sbin/stub.xz" : "stub.xz"; | |
| @@ -250,7 +242,6 @@ static void extract_files(bool sbin) { | |
| int fd = xopen("magisk", O_WRONLY | O_CREAT, 0755); | |
| unxz(fd, magisk); | |
| close(fd); | |
| - patch_socket_name("magisk"); | |
| } | |
| if (access(stub_xz, F_OK) == 0) { | |
| mmap_data stub(stub_xz); | |
| -- | |
| 2.51.2 | |
| From 9020fdf39bb641b4b22216b935053995bf5ae64f Mon Sep 17 00:00:00 2001 | |
| From: rikka <[email protected]> | |
| Date: Fri, 7 Nov 2025 23:57:14 +0800 | |
| Subject: [PATCH 14/16] Release new canary build | |
| [skip ci] | |
| --- | |
| app/gradle.properties | 2 +- | |
| 1 file changed, 1 insertion(+), 1 deletion(-) | |
| diff --git a/app/gradle.properties b/app/gradle.properties | |
| index ed70619b3..e708ae8dc 100644 | |
| --- a/app/gradle.properties | |
| +++ b/app/gradle.properties | |
| @@ -30,4 +30,4 @@ android.nonFinalResIds=false | |
| # Magisk | |
| magisk.stubVersion=40 | |
| -magisk.versionCode=30401 | |
| +magisk.versionCode=30402 | |
| -- | |
| 2.51.2 | |
| From 70ef4e523afcf6d4f0831a22d9596b644a0f4573 Mon Sep 17 00:00:00 2001 | |
| From: rikka <[email protected]> | |
| Date: Sun, 9 Nov 2025 13:38:51 +0800 | |
| Subject: [PATCH 15/16] Workaround: Always call companion_handler even if | |
| fd_get_attr fails This fixes boot failures with LSPosed | |
| after merging upstream commit 8b49eda. | |
| --- | |
| native/src/core/zygisk/mod.rs | 7 +++---- | |
| 1 file changed, 3 insertions(+), 4 deletions(-) | |
| diff --git a/native/src/core/zygisk/mod.rs b/native/src/core/zygisk/mod.rs | |
| index bb4e02a99..ab11662b1 100644 | |
| --- a/native/src/core/zygisk/mod.rs | |
| +++ b/native/src/core/zygisk/mod.rs | |
| @@ -8,9 +8,7 @@ use std::os::fd::RawFd; | |
| #[unsafe(no_mangle)] | |
| extern "C" fn exec_companion_entry(client: RawFd, companion_handler: extern "C" fn(RawFd)) { | |
| ThreadPool::exec_task(move || { | |
| - let Ok(s1) = fd_get_attr(client) else { | |
| - return; | |
| - }; | |
| + let s1 = fd_get_attr(client).ok(); | |
| companion_handler(client); | |
| @@ -18,7 +16,8 @@ extern "C" fn exec_companion_entry(client: RawFd, companion_handler: extern "C" | |
| // accidentally close a re-used file descriptor. | |
| // This check is required because the module companion | |
| // handler could've closed the file descriptor already. | |
| - if let Ok(s2) = fd_get_attr(client) | |
| + if let Some(s1) = s1 | |
| + && let Ok(s2) = fd_get_attr(client) | |
| && s1.st.st_dev == s2.st.st_dev | |
| && s1.st.st_ino == s2.st.st_ino | |
| { | |
| -- | |
| 2.51.2 | |
| From f9f02c65722a83926c3570437b68ff7cbd7dfe6c Mon Sep 17 00:00:00 2001 | |
| From: rikka <[email protected]> | |
| Date: Sun, 9 Nov 2025 13:55:01 +0800 | |
| Subject: [PATCH 16/16] Release new canary build | |
| [skip ci] | |
| --- | |
| app/gradle.properties | 2 +- | |
| 1 file changed, 1 insertion(+), 1 deletion(-) | |
| diff --git a/app/gradle.properties b/app/gradle.properties | |
| index e708ae8dc..fcfa4c2b2 100644 | |
| --- a/app/gradle.properties | |
| +++ b/app/gradle.properties | |
| @@ -30,4 +30,4 @@ android.nonFinalResIds=false | |
| # Magisk | |
| magisk.stubVersion=40 | |
| -magisk.versionCode=30402 | |
| +magisk.versionCode=30403 | |
| -- | |
| 2.51.2 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment