From a06ef6fe2512f851b923eb0b035eb5462c1e8725 Mon Sep 17 00:00:00 2001 From: topjohnwu Date: Wed, 19 Oct 2016 06:22:00 +0800 Subject: [PATCH] Magisk v8 --- jni/magiskhide.c | 4 +- .../META-INF/com/google/android/update-binary | 155 ++++++++---------- zip_static/arm/magiskhide | Bin 153312 -> 153312 bytes zip_static/common/custom_ramdisk_patch.sh | 53 ++++++ zip_static/common/init.magisk.rc | 3 - zip_static/common/magic_mask.sh | 12 +- zip_static/common/roothelper/phh.prop | 9 - zip_static/common/roothelper/phh.sh | 40 ----- zip_static/common/roothelper/post-fs-data.sh | 29 ---- zip_static/common/roothelper/supersu.prop | 7 - zip_static/common/roothelper/supersu.sh | 11 -- zip_static/x86/magiskhide | Bin 325156 -> 325156 bytes 12 files changed, 127 insertions(+), 196 deletions(-) create mode 100644 zip_static/common/custom_ramdisk_patch.sh delete mode 100644 zip_static/common/roothelper/phh.prop delete mode 100644 zip_static/common/roothelper/phh.sh delete mode 100644 zip_static/common/roothelper/post-fs-data.sh delete mode 100644 zip_static/common/roothelper/supersu.prop delete mode 100644 zip_static/common/roothelper/supersu.sh diff --git a/jni/magiskhide.c b/jni/magiskhide.c index 3b2da2b10823c..13db9191f4cf9 100644 --- a/jni/magiskhide.c +++ b/jni/magiskhide.c @@ -56,6 +56,7 @@ int hideMagisk(int pid) { int res = syscall(SYS_setns, fd, 0); if(res == -1) return 3; + free(path); path = NULL; asprintf(&path, "/proc/%d/mounts", pid); FILE *mount_fp = fopen(path, "r"); @@ -63,6 +64,7 @@ int hideMagisk(int pid) { fprintf(stderr, "Error opening mount list!\n"); return 1; } + free(path); int mount_size; char **mount_list = file_to_str_arr(mount_fp, &mount_size), mountpoint[256], *sbstr; @@ -88,9 +90,9 @@ int hideMagisk(int pid) { } free(mount_list[i]); } - // Free memory free(mount_list); + return 0; } diff --git a/zip_static/META-INF/com/google/android/update-binary b/zip_static/META-INF/com/google/android/update-binary index 30434ba0ce1c0..ace5e44bddc3a 100644 --- a/zip_static/META-INF/com/google/android/update-binary +++ b/zip_static/META-INF/com/google/android/update-binary @@ -185,7 +185,7 @@ repack_boot() { ########################################################################################## ui_print "****************************" -ui_print "Magisk v7 Boot Image Patcher" +ui_print "Magisk v8 Boot Image Patcher" ui_print "****************************" if [ ! -d "$INSTALLER/common" ]; then @@ -270,6 +270,7 @@ if (is_mounted /data); then rm -rf /data/busybox /data/magisk 2>/dev/null mkdir -p /data/busybox cp -af $BINDIR /data/magisk + cp -af $INSTALLER/common/init.magisk.rc $INSTALLER/common/magic_mask.sh /data/magisk chmod 755 /data/busybox /data/magisk /data/magisk/* chcon 'u:object_r:system_file:s0' /data/busybox /data/magisk /data/magisk/* /data/magisk/busybox --install -s /data/busybox @@ -279,6 +280,7 @@ else rm -rf /cache/data_bin 2>/dev/null mkdir -p /cache/data_bin cp -af $BINDIR /cache/data_bin + cp -af $INSTALLER/common/init.magisk.rc $INSTALLER/common/magic_mask.sh /cache/data_bin fi ########################################################################################## @@ -311,7 +313,10 @@ MAGISKLOOP=$LOOPDEVICE mkdir -p /magisk/.core/magiskhide 2>/dev/null cp -af $INSTALLER/common/magiskhide/. /magisk/.core/magiskhide -chmod 755 /magisk/.core/magiskhide /magisk/.core/magiskhide/* + +# Remove legacy SuperSU module +mkdir -p /magisk/zzsupersu +touch /magisk/zzsupersu/remove ########################################################################################## # Boot image patch @@ -336,92 +341,45 @@ dd if=$BOOTIMAGE of=$ORIGBOOT ui_print "- Unpacking boot image" unpack_boot $ORIGBOOT +# Restore ramdisk SUPERSU=false - if (! $NORESTORE); then - # Backups if [ -d ".backup" ]; then - ui_print "- Restoring ramdisk with backup" - cp -af .backup/* . + ui_print "- Restoring ramdisk with ramdisk backup" + cp -af .backup/. . rm -rf magisk init.magisk.rc sbin/magic_mask.sh 2>/dev/null else - if [ -f "sbin/launch_daemonsu.sh" ]; then - SUPERSU=true - # Save it for helper module - mkdir -p /magisk/zzsupersu - touch /magisk/zzsupersu/stub - cp -af sbin/launch_daemonsu.sh $INSTALLER/common/roothelper/launch_daemonsu.sh - fi - # Non-standard boot image restores + [ -f "sbin/launch_daemonsu.sh" ] && SUPERSU=true if ($SUPERSU); then - ui_print "- SuperSU patched boot detected" - # Restore with SuperSU's backup - MOUNTSU=false - (! is_mounted /su) && (is_mounted /data) && mount_image /data/su.img /su && MOUNTSU=true - if (is_mounted /su); then - # Use sukernel's built-in functions - ui_print "- Using sukernel to restore boot image" - cd $UNPACKDIR - gunzip -c < $UNPACKDIR/ramdisk.gz > suramdisk - /su/bin/sukernel --restore suramdisk /data/stock_boot.img - if [ "$?" -ne "0" ]; then - # No boot backup found, use ramdisk backup - ui_print "- Restoring ramdisk with backup" - /su/bin/sukernel --cpio-restore suramdisk suramdisk - rm -rf $RAMDISK - mkdir -p $RAMDISK - cd $RAMDISK - cpio -i < $UNPACKDIR/suramdisk - rm -f $UNPACKDIR/suramdisk - else - ui_print "- Restoring boot image with backup" - cp -af /data/stock_boot.img $ORIGBOOT - unpack_boot $ORIGBOOT - fi - if ($MOUNTSU); then - ui_print "- Unmounting su.img" - umount /su - losetup -d $LOOPDEVICE - fi - else - # Find the boot backup ourselves - ui_print "! su.img mount failed... find the backup ourselves" - cp -af /data/stock_boot_*.gz /data/stock_boot.img.gz 2>/dev/null - gzip -d /data/stock_boot.img.gz 2>/dev/null - rm -rf /data/stock_boot.img.gz 2>/dev/null - if [ -f "/data/stock_boot.img" ]; then - ui_print "- Restoring boot image with backup" - cp -af /data/stock_boot.img $ORIGBOOT - unpack_boot $ORIGBOOT - else - ui_print "! No backups found" - ui_print "! Installer will still proceed, but might cause issues" - ui_print "! If possible, please restore to stock boot then flash Magisk again" - # Force removing SuperSU parts - rm -rf su init.supersu.rc sbin/launch_daemonsu.sh 2>/dev/null - fi - fi - else - # Magisk's own situation - if [ -d "magisk" ]; then + ui_print "- SuperSU patched boot detected!" + ui_print "- Adding auto patch script for SuperSU" + cp -af $INSTALLER/common/custom_ramdisk_patch.sh /data/custom_ramdisk_patch.sh + fi + if [ -d "magisk" ]; then + # If Magisk is installed and no SuperSU and no ramdisk backups + # Restore previous stock boot image + if (! $SUPERSU); then cp -af /data/stock_boot_*.gz /data/stock_boot.img.gz 2>/dev/null gzip -d /data/stock_boot.img.gz 2>/dev/null if [ -f "/data/stock_boot.img" ]; then ui_print "- Restoring boot image with backup" cp -af /data/stock_boot.img $ORIGBOOT unpack_boot $ORIGBOOT - else - ui_print "! No backups found" - ui_print "! Installer will still proceed, but might cause issues" - ui_print "! If possible, please restore to stock boot then flash Magisk again" - # Removing other boot image modifications - rm -rf sbin/su init.xposed.rc sbin/mount_xposed.sh 2>/dev/null fi fi + # Removing possible modifications + rm -rf magisk init.magisk.rc sbin/magic_mask.sh 2>/dev/null + rm -rf init.xposed.rc sbin/mount_xposed.sh 2>/dev/null fi - ui_print "- Creating backups" - mkdir .backup - cp -af init.rc *fstab* verity_key sepolicy .backup 2>/dev/null + fi +fi + +if (! $SUPERSU); then + ui_print "- Creating backups" + mkdir .backup 2>/dev/null + cp -af init.environ.rc *fstab* verity_key sepolicy .backup 2>/dev/null + if (! $SUPERSU); then + # SuperSU already backup stock boot, no need to do again if (is_mounted /data); then cp -af $ORIGBOOT /data/stock_boot.img else @@ -430,30 +388,45 @@ if (! $NORESTORE); then fi fi -ui_print "- Installing root helper module" -cp -af $INSTALLER/common/roothelper /magisk/00roothelper -chmod 755 /magisk/00roothelper /magisk/00roothelper/* - # Patch ramdisk ui_print "- Patching ramdisk" -if [ $(grep -c "import /init.magisk.rc" init.rc) -eq "0" ]; then - sed -i "/import \/init\.environ\.rc/iimport /init.magisk.rc" init.rc +# Add magisk entrypoint +for INIT in init*.rc; do + if [ $(grep -c "import /init.environ.rc" $INIT) -ne "0" ] && [ $(grep -c "import /init.magisk.rc" $INIT) -eq "0" ]; then + cp $INIT .backup + sed -i "/import \/init\.environ\.rc/iimport /init.magisk.rc" $INIT + break + fi +done + +# Add magisk PATH +if [ $(grep -c "export PATH" init.environ.rc) -eq "0" ]; then + sed -i "/on init/a\ \ \ \ export PATH /magisk/.core/bin:/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin:/magisk/.core/busybox" init.environ.rc +else + if [ $(grep -c "/magisk/.core/busybox" init.environ.rc) -eq "0" ]; then + sed -i "/export PATH/ s/\/system\/xbin/\/system\/xbin:\/magisk\/.core\/busybox/g" init.environ.rc + fi + if [ $(grep -c "/magisk/.core/bin" init.environ.rc) -eq "0" ] && (! $SUPERSU); then + sed -i "/export PATH/ s/\/sbin/\/magisk\/.core\/bin:\/sbin/g" init.environ.rc + fi fi -sed -i "/selinux.reload_policy/d" init.rc -find . -type f -name "*fstab*" 2>/dev/null | while read FSTAB ; do +if (! $SUPERSU); then + sed -i "/selinux.reload_policy/d" init.rc + find . -type f -name "*fstab*" 2>/dev/null | while read FSTAB ; do + if (! $KEEPVERITY); then + sed -i "s/,support_scfs//g" $FSTAB + sed -i 's;,\{0,1\}verify\(=[^,]*\)\{0,1\};;g' $FSTAB + fi + if (! $KEEPFORCEENCRYPT); then + sed -i "s/forceencrypt/encryptable/g" $FSTAB + sed -i "s/forcefdeorfbe/encryptable/g" $FSTAB + fi + done if (! $KEEPVERITY); then - sed -i "s/,support_scfs//g" $FSTAB - sed -i 's;,\{0,1\}verify\(=[^,]*\)\{0,1\};;g' $FSTAB + rm verity_key 2>/dev/null fi - if (! $KEEPFORCEENCRYPT); then - sed -i "s/forceencrypt/encryptable/g" $FSTAB - sed -i "s/forcefdeorfbe/encryptable/g" $FSTAB - fi -done -if (! $KEEPVERITY); then - rm verity_key 2>/dev/null fi # sepolicy patches @@ -464,7 +437,7 @@ mkdir -p magisk 2>/dev/null cp -af $INSTALLER/common/init.magisk.rc init.magisk.rc cp -af $INSTALLER/common/magic_mask.sh sbin/magic_mask.sh -# chmod 0755 magisk +chmod 0755 magisk chmod 0750 init.magisk.rc sbin/magic_mask.sh ui_print "- Repacking boot image" diff --git a/zip_static/arm/magiskhide b/zip_static/arm/magiskhide index 887ba5627c9eee1004d7d1e169d1baf1791b3fca..2b99f7098baf54c7569f4cc87d2139fa3d84081e 100644 GIT binary patch delta 198 zcmaE`mh-_{&J8S#B2#9~JeehQOlA2dhbMEcp4V!W3Dnsv!8n1lo@Ed7q)?9v7lsUm z47Ujks;pC4R|I)hx-fr;`o%g!VGGk9rVp;a8G-a0XC}3UP7D`Y9(a2wY+>2M_(A3k zv)TfunhUHm*gow01JdaR(m9LygAGux3)qzKAB>8X!U$wvab{9m=)`cb@qw2I%NB<{ zj2|T4H~__&)fPCFUtpccIFWUQ3)}h`Ii}EmT7v*6(?F9g&rb(3m diff --git a/zip_static/common/custom_ramdisk_patch.sh b/zip_static/common/custom_ramdisk_patch.sh new file mode 100644 index 0000000000000..a1eeeeb0b3dcb --- /dev/null +++ b/zip_static/common/custom_ramdisk_patch.sh @@ -0,0 +1,53 @@ +#!/system/bin/sh + +RAMDISK=$1 +BINDIR=/data/magisk + +cpio_add() { + /su/bin/sukernel --cpio-add $RAMDISK $RAMDISK $2 $1 $1 +} + +cpio_extract() { + /su/bin/sukernel --cpio-extract $RAMDISK $1 $1 +} + +cpio_mkdir() { + /su/bin/sukernel --cpio-mkdir $RAMDISK $RAMDISK $2 $1 +} + +rm -rf /tmp/magisk/ramdisk 2>/dev/null +mkdir -p /tmp/magisk/ramdisk +cd /tmp/magisk/ramdisk + +cat $RAMDISK | cpio -i + +# Patch ramdisk +echo "- Patching ramdisk" + +# Add magisk entrypoint +for INIT in init*.rc; do + if [ $(grep -c "import /init.environ.rc" $INIT) -ne "0" ] && [ $(grep -c "import /init.magisk.rc" $INIT) -eq "0" ]; then + sed -i "/import \/init\.environ\.rc/iimport /init.magisk.rc" $INIT + cpio_add $INIT 750 + break + fi +done + +# Add magisk PATH +if [ $(grep -c "/magisk/.core/busybox" init.environ.rc) -eq "0" ]; then + sed -i "/export PATH/ s/\/system\/xbin/\/system\/xbin:\/magisk\/.core\/busybox/g" init.environ.rc + cpio_add init.environ.rc 750 +fi + +# sepolicy patches +$BINDIR/sepolicy-inject --magisk -P sepolicy +cpio_add sepolicy 644 + +# Add new items +mkdir -p magisk 2>/dev/null +cp -af $BINDIR/init.magisk.rc init.magisk.rc +cp -af $BINDIR/magic_mask.sh sbin/magic_mask.sh + +cpio_mkdir magisk 755 +cpio_add init.magisk.rc 750 +cpio_add sbin/magic_mask.sh 750 diff --git a/zip_static/common/init.magisk.rc b/zip_static/common/init.magisk.rc index f04ab6133ebf2..bc0b4e1013072 100644 --- a/zip_static/common/init.magisk.rc +++ b/zip_static/common/init.magisk.rc @@ -1,9 +1,6 @@ # Triggers on post-fs - # Paths - export PATH /magisk/.core/bin:/sbin:/vendor/bin:/system/sbin:/system/bin:/magisk/.core/busybox:/system/xbin - start magisk_pfs wait /dev/.magisk.unblock 20 rm /dev/.magisk.unblock diff --git a/zip_static/common/magic_mask.sh b/zip_static/common/magic_mask.sh index 36a75383aa42c..0d8a904f52df3 100644 --- a/zip_static/common/magic_mask.sh +++ b/zip_static/common/magic_mask.sh @@ -1,6 +1,7 @@ #!/system/bin/sh LOGFILE=/cache/magisk.log +HIDELOG=/cache/magiskhide.log IMG=/data/magisk.img export MOUNTPOINT=/magisk @@ -193,6 +194,7 @@ merge_image() { # Merge (will reserve selinux contexts) cd /cache/merge_img for MOD in *; do + log_print "Merging: $MOD" rm -rf /cache/data_img/$MOD cp -afc $MOD /cache/data_img/ done @@ -227,8 +229,9 @@ case $1 in if [ -d "/cache/magisk_merge" ]; then cd /cache/magisk_merge for MOD in *; do + log_print "Merging: $MOD" rm -rf /cache/magisk/$MOD - cp -afc $MOD /cache/magisk/ + mv $MOD /cache/magisk/$MOD done rm -rf /cache/magisk_merge fi @@ -299,8 +302,6 @@ case $1 in unblock fi - echo $MOUNTPOINT >> $MOUNTLIST - log_print "Preparing modules" # First do cleanups rm -rf $DUMMDIR @@ -404,7 +405,7 @@ case $1 in service ) # Version info - setprop magisk.version 7 + setprop magisk.version 8 log_print "Magisk late_start service mode running..." run_scripts service [ -f "$COREDIR/magiskhide/enable" ] && setprop magisk.hide 1 @@ -420,8 +421,9 @@ case $1 in cat $COREDIR/magiskhide/hidelist.tmp >> $COREDIR/magiskhide/hidelist rm -f $COREDIR/magiskhide/hidelist.tmp fi + chmod 755 $COREDIR/magiskhide $COREDIR/magiskhide/* log_print "Starting Magisk Hide" - exec /data/magisk/magiskhide $COREDIR/magiskhide/hidelist + exec /data/magisk/magiskhide $COREDIR/magiskhide/hidelist > $HIDELOG ;; esac diff --git a/zip_static/common/roothelper/phh.prop b/zip_static/common/roothelper/phh.prop deleted file mode 100644 index 41af7f87e842e..0000000000000 --- a/zip_static/common/roothelper/phh.prop +++ /dev/null @@ -1,9 +0,0 @@ -id=phh -name=phh's SuperUser -version=Root Helper -versionCode=1 -author=phhusson, topjohnwu -description=This is a helper, please upgrade from downloads section :) -support=http://forum.xda-developers.com/showthread.php?t=3216394 -donate=http://forum.xda-developers.com/donatetome.php?u=1915408 -cacheModule=false diff --git a/zip_static/common/roothelper/phh.sh b/zip_static/common/roothelper/phh.sh deleted file mode 100644 index 3a0a86a029958..0000000000000 --- a/zip_static/common/roothelper/phh.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/system/bin/sh - -LOGFILE=/cache/magisk.log - -log_print() { - echo $1 - echo "phh: $1" >> $LOGFILE - log -p i -t phh "$1" -} - -launch_daemonsu() { - export PATH=$OLDPATH - # Switch contexts - echo "u:r:su_daemon:s0" > /proc/self/attr/current - # Start daemon - exec /magisk/phh/bin/su --daemon -} - -# Disable the other root -[ -d "/magisk/zzsupersu" ] && touch /magisk/zzsupersu/disable - -log_print "Live patching sepolicy" -/magisk/phh/bin/sepolicy-inject --live - -# Expose the root path -log_print "Linking supath" -rm -rf /magisk/.core/bin -ln -s /magisk/phh/bin /magisk/.core/bin - -# Run su.d -for script in /magisk/phh/su.d/* ; do - if [ -f "$script" ]; then - chmod 755 $script - log_print "su.d: $script" - $script - fi -done - -log_print "Starting su daemon" -(launch_daemonsu &) diff --git a/zip_static/common/roothelper/post-fs-data.sh b/zip_static/common/roothelper/post-fs-data.sh deleted file mode 100644 index 1b6fc1f29a089..0000000000000 --- a/zip_static/common/roothelper/post-fs-data.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/system/bin/sh - -cd /magisk/00roothelper - -if [ -f "launch_daemonsu.sh" ]; then - # SuperSU mode - rm -rf /magisk/supersu /magisk/zzsupersu - mkdir -p /magisk/zzsupersu - cp supersu.sh /magisk/zzsupersu/post-fs-data.sh - cp supersu.prop /magisk/zzsupersu/module.prop - cp launch_daemonsu.sh /magisk/zzsupersu/launch_daemonsu.sh - chmod 755 /magisk/zzsupersu /magisk/zzsupersu/* -else - # phh mode - if [ -f "/magisk/phh/su" ]; then - # Old version detected - cp /magisk/phh/su su - rm -rf /magisk/phh - mkdir -p /magisk/phh/bin - mkdir -p /magisk/phh/su.d - cp su /magisk/phh/bin/su - cp /data/magisk/sepolicy-inject /magisk/phh/bin/sepolicy-inject - cp phh.sh /magisk/phh/post-fs-data.sh - cp phh.prop /magisk/phh/module.prop - chmod 755 /magisk/phh /magisk/phh/* /magisk/phh/bin/* - fi -fi - -rm -rf /magisk/00roothelper diff --git a/zip_static/common/roothelper/supersu.prop b/zip_static/common/roothelper/supersu.prop deleted file mode 100644 index 5d407e4d1f120..0000000000000 --- a/zip_static/common/roothelper/supersu.prop +++ /dev/null @@ -1,7 +0,0 @@ -id=supersu -name=SuperSU Helper -version=v1 -versionCode=1 -author=topjohnwu -description=This is a helper module for Chainfire's SuperSU to work with Magisk -cacheModule=false diff --git a/zip_static/common/roothelper/supersu.sh b/zip_static/common/roothelper/supersu.sh deleted file mode 100644 index c64fa07480374..0000000000000 --- a/zip_static/common/roothelper/supersu.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/system/bin/sh - -mount -o rw,remount rootfs / -mkdir /su 2>/dev/null -mount -o ro,remount rootfs / - -chmod 755 /magisk/zzsupersu/launch_daemonsu.sh -/magisk/zzsupersu/launch_daemonsu.sh post-fs-data - -rm -rf /magisk/.core/bin -ln -s /su/bin /magisk/.core/bin diff --git a/zip_static/x86/magiskhide b/zip_static/x86/magiskhide index e72fa89079490c93d8d6a19f1c2f918e7294c221..dc817bd581fdff607c7fbcedfe5092373150b90d 100644 GIT binary patch delta 19499 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