From 664215b7d5d96d63dc09afa2c7c0bd3fcf0990a0 Mon Sep 17 00:00:00 2001 From: tytydraco <tylernij@gmail.com> Date: Fri, 18 Dec 2020 11:09:54 +0000 Subject: [PATCH 1/9] all: patching for anndroid Signed-off-by: alanndz <alanmahmud0@gmail.com> --- bin/charch | 5 +++-- bin/cparch | 5 +++-- bin/lsarch | 5 +++-- bin/mkarch | 5 +++-- bin/rmarch | 5 +++-- bin/unarch | 5 +++-- 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/bin/charch b/bin/charch index 9a62f5b..45605a0 100755 --- a/bin/charch +++ b/bin/charch @@ -1,5 +1,6 @@ -#!/usr/bin/env bash +#!/system/bin/sh # Written by Draco (tytydraco) @ GitHub +export PATH="/sbin/.magisk/busybox:$PATH" # Log in red and exit err() { @@ -17,7 +18,7 @@ done [[ "$(id -u)" -ne 0 ]] && err "No root permissions. Exiting." # Path containing rootfs tarball and all rootfs instances -CHROOT_DIR="$HOME/charch" +CHROOT_DIR="/data/unencrypted/charch" # The name of the current rootfs instance ROOTFS="rootfs" diff --git a/bin/cparch b/bin/cparch index 6eecb8c..2d6d634 100755 --- a/bin/cparch +++ b/bin/cparch @@ -1,5 +1,6 @@ -#!/usr/bin/env bash +#!/system/bin/sh # Written by Draco (tytydraco) @ GitHub +export PATH="/sbin/.magisk/busybox:$PATH" # Log in red and exit err() { @@ -17,7 +18,7 @@ done [[ "$(id -u)" -ne 0 ]] && err "No root permissions. Exiting." # Path containing rootfs tarball and all rootfs instances -CHROOT_DIR="$HOME/charch" +CHROOT_DIR="/data/unencrypted/charch" usage() { echo -n "Usage: $(basename "$0") [OPTIONS] <OLD NAME> <NEW NAME> diff --git a/bin/lsarch b/bin/lsarch index 48e1626..139d27e 100755 --- a/bin/lsarch +++ b/bin/lsarch @@ -1,5 +1,6 @@ -#!/usr/bin/env bash +#!/system/bin/sh # Written by Draco (tytydraco) @ GitHub +export PATH="/sbin/.magisk/busybox:$PATH" # Log in red and exit err() { @@ -17,7 +18,7 @@ done [[ "$(id -u)" -ne 0 ]] && err "No root permissions. Exiting." # Path containing rootfs tarball and all rootfs instances -CHROOT_DIR="$HOME/charch" +CHROOT_DIR="/data/unencrypted/charch" usage() { echo -n "Usage: $(basename "$0") [OPTIONS] diff --git a/bin/mkarch b/bin/mkarch index ad84796..7f55f3b 100755 --- a/bin/mkarch +++ b/bin/mkarch @@ -1,5 +1,6 @@ -#!/usr/bin/env bash +#!/system/bin/sh # Written by Draco (tytydraco) @ GitHub +export PATH="/sbin/.magisk/busybox:$PATH" # Log in red and exit err() { @@ -17,7 +18,7 @@ done [[ "$(id -u)" -ne 0 ]] && err "No root permissions. Exiting." # Path containing rootfs tarball and all rootfs instances -CHROOT_DIR="$HOME/charch" +CHROOT_DIR="/data/unencrypted/charch" # The name of the current rootfs instance ROOTFS="rootfs" diff --git a/bin/rmarch b/bin/rmarch index 8d110fb..25c2744 100755 --- a/bin/rmarch +++ b/bin/rmarch @@ -1,5 +1,6 @@ -#!/usr/bin/env bash +#!/system/bin/sh # Written by Draco (tytydraco) @ GitHub +export PATH="/sbin/.magisk/busybox:$PATH" # Log in red and exit err() { @@ -17,7 +18,7 @@ done [[ "$(id -u)" -ne 0 ]] && err "No root permissions. Exiting." # Path containing rootfs tarball and all rootfs instances -CHROOT_DIR="$HOME/charch" +CHROOT_DIR="/data/unencrypted/charch" # The name of the current rootfs instance ROOTFS="rootfs" diff --git a/bin/unarch b/bin/unarch index 0f3eeea..0825c8a 100755 --- a/bin/unarch +++ b/bin/unarch @@ -1,5 +1,6 @@ -#!/usr/bin/env bash +#!/system/bin/sh # Written by Draco (tytydraco) @ GitHub +export PATH="/sbin/.magisk/busybox:$PATH" # Log in red and exit err() { @@ -17,7 +18,7 @@ done [[ "$(id -u)" -ne 0 ]] && err "No root permissions. Exiting." # Path containing rootfs tarball and rootfs instances -CHROOT_DIR="$HOME/charch" +CHROOT_DIR="/data/unencrypted/charch" # The name of the current rootfs instance ROOTFS="rootfs" From 9cd213a9ea5389f37c9bc0ecc393035b6554572a Mon Sep 17 00:00:00 2001 From: tytydraco <tylernij@gmail.com> Date: Fri, 18 Dec 2020 11:13:45 +0000 Subject: [PATCH 2/9] charch: patching for android Signed-off-by: alanndz <alanmahmud0@gmail.com> --- bin/charch | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/bin/charch b/bin/charch index 45605a0..eca1a35 100755 --- a/bin/charch +++ b/bin/charch @@ -107,12 +107,31 @@ safe_mount_file() { fi } +# Find the outermost mountpoint that charch is currently executing from +find_mountpoint() { + local path=`readlink -f "$1"` + until mountpoint -q "$path" &>/dev/null + do + path=${path%/*} + path=${path:-/} + + # Break if we reach the end of the filesystem + [[ "$path" == "/" ]] && ! mountpoint -q "/" &> /dev/null && break + done + echo "$path" +} + # Mount essentials and remound current mount as suid,exec setup_mounts() { safe_mount_dir /dev tmpfs safe_mount_dir /sys sysfs safe_mount_dir /proc proc safe_mount_file /etc/resolv.conf + + # Remount data partition with suid to allow sudo to function + local root_mount=`find_mountpoint "$CHROOT_DIR"` + mount | awk '{print $3}' | grep -q "^$root_mount\$" && + mount -o remount,suid,exec "$root_mount" &> /dev/null } # Enter the chroot with the provided command From 6680058619e0e05d424c4e168f640dd1d46ac143 Mon Sep 17 00:00:00 2001 From: alanndz <alanmahmud0@gmail.com> Date: Mon, 30 Nov 2020 01:53:16 +0000 Subject: [PATCH 3/9] charch: remove mount --make-slave * In Android 11, mount havent --make-slave * They will error with: mount: bad /etc/fstab: No such file or directory Signed-off-by: alanndz <alanmahmud0@gmail.com> --- bin/charch | 2 -- 1 file changed, 2 deletions(-) diff --git a/bin/charch b/bin/charch index eca1a35..9fd4757 100755 --- a/bin/charch +++ b/bin/charch @@ -82,7 +82,6 @@ safe_mount_dir() { then mkdir -p "$guest_mount" mount --rbind "$1" "$guest_mount" - mount --make-rslave "$guest_mount" elif [[ -n "$2" ]] then mkdir -p "$guest_mount" @@ -103,7 +102,6 @@ safe_mount_file() { mkdir -p "${guest_mount%/*}" [[ ! -f "$guest_mount" ]] && touch "$guest_mount" mount --bind "$1" "$guest_mount" - mount --make-slave "$guest_mount" fi } From e1cd21d3af306bb3ba5a13ec5465462e9ebf0bfa Mon Sep 17 00:00:00 2001 From: alanndz <alanmahmud0@gmail.com> Date: Mon, 30 Nov 2020 01:56:07 +0000 Subject: [PATCH 4/9] charch: mount /dev/pts * Its will fixed packages screen, tmux or other cant run Signed-off-by: alanndz <alanmahmud0@gmail.com> --- bin/charch | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/charch b/bin/charch index 9fd4757..91b2ae7 100755 --- a/bin/charch +++ b/bin/charch @@ -122,6 +122,7 @@ find_mountpoint() { # Mount essentials and remound current mount as suid,exec setup_mounts() { safe_mount_dir /dev tmpfs + safe_mount_dir /dev/pts devpts safe_mount_dir /sys sysfs safe_mount_dir /proc proc safe_mount_file /etc/resolv.conf From 4d2e203b2ca0fd115c80771b5bf092ddc0249923 Mon Sep 17 00:00:00 2001 From: alanndz <alanmahmud0@gmail.com> Date: Fri, 18 Dec 2020 11:16:50 +0000 Subject: [PATCH 5/9] move bin into system/ Signed-off-by: alanndz <alanmahmud0@gmail.com> --- {bin => system/bin}/charch | 0 {bin => system/bin}/cparch | 0 {bin => system/bin}/lsarch | 0 {bin => system/bin}/mkarch | 0 {bin => system/bin}/rmarch | 0 {bin => system/bin}/unarch | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename {bin => system/bin}/charch (100%) rename {bin => system/bin}/cparch (100%) rename {bin => system/bin}/lsarch (100%) rename {bin => system/bin}/mkarch (100%) rename {bin => system/bin}/rmarch (100%) rename {bin => system/bin}/unarch (100%) diff --git a/bin/charch b/system/bin/charch similarity index 100% rename from bin/charch rename to system/bin/charch diff --git a/bin/cparch b/system/bin/cparch similarity index 100% rename from bin/cparch rename to system/bin/cparch diff --git a/bin/lsarch b/system/bin/lsarch similarity index 100% rename from bin/lsarch rename to system/bin/lsarch diff --git a/bin/mkarch b/system/bin/mkarch similarity index 100% rename from bin/mkarch rename to system/bin/mkarch diff --git a/bin/rmarch b/system/bin/rmarch similarity index 100% rename from bin/rmarch rename to system/bin/rmarch diff --git a/bin/unarch b/system/bin/unarch similarity index 100% rename from bin/unarch rename to system/bin/unarch From afb1aaee09eff9561adc3324d016021a49784210 Mon Sep 17 00:00:00 2001 From: alanndz <alanmahmud0@gmail.com> Date: Fri, 18 Dec 2020 11:20:40 +0000 Subject: [PATCH 6/9] Add magisk module Signed-off-by: alanndz <alanmahmud0@gmail.com> --- META-INF/com/google/android/update-binary | 173 +++++++++++++++++++++ META-INF/com/google/android/updater-script | 1 + Makefile | 12 ++ customize.sh | 5 + module.prop | 6 + 5 files changed, 197 insertions(+) create mode 100644 META-INF/com/google/android/update-binary create mode 100644 META-INF/com/google/android/updater-script create mode 100644 Makefile create mode 100644 customize.sh create mode 100644 module.prop diff --git a/META-INF/com/google/android/update-binary b/META-INF/com/google/android/update-binary new file mode 100644 index 0000000..d19eeb5 --- /dev/null +++ b/META-INF/com/google/android/update-binary @@ -0,0 +1,173 @@ +#!/sbin/sh + +################# +# Initialization +################# + +umask 022 + +# Global vars +TMPDIR=/dev/tmp +PERSISTDIR=/sbin/.magisk/mirror/persist + +rm -rf $TMPDIR 2>/dev/null +mkdir -p $TMPDIR + +# echo before loading util_functions +ui_print() { echo "$1"; } + +require_new_magisk() { + ui_print "*******************************" + ui_print " Please install Magisk v19.0+! " + ui_print "*******************************" + exit 1 +} + +is_legacy_script() { + unzip -l "$ZIPFILE" install.sh | grep -q install.sh + return $? +} + +print_modname() { + local len + len=`echo -n $MODNAME | wc -c` + len=$((len + 2)) + local pounds=`printf "%${len}s" | tr ' ' '*'` + ui_print "$pounds" + ui_print " $MODNAME " + ui_print "$pounds" + ui_print "*******************" + ui_print " Powered by Magisk " + ui_print "*******************" +} + +############## +# Environment +############## + +OUTFD=$2 +ZIPFILE=$3 + +mount /data 2>/dev/null + +# Load utility functions +[ -f /data/adb/magisk/util_functions.sh ] || require_new_magisk +. /data/adb/magisk/util_functions.sh +[ $MAGISK_VER_CODE -gt 18100 ] || require_new_magisk + +# Preperation for flashable zips +setup_flashable + +# Mount partitions +mount_partitions + +# Detect version and architecture +api_level_arch_detect + +# Setup busybox and binaries +$BOOTMODE && boot_actions || recovery_actions + +############## +# Preparation +############## + +# Extract prop file +unzip -o "$ZIPFILE" module.prop -d $TMPDIR >&2 +[ ! -f $TMPDIR/module.prop ] && abort "! Unable to extract zip file!" + +$BOOTMODE && MODDIRNAME=modules_update || MODDIRNAME=modules +MODULEROOT=$NVBASE/$MODDIRNAME +MODID=`grep_prop id $TMPDIR/module.prop` +MODPATH=$MODULEROOT/$MODID +MODNAME=`grep_prop name $TMPDIR/module.prop` + +# Create mod paths +rm -rf $MODPATH 2>/dev/null +mkdir -p $MODPATH + +########## +# Install +########## + +if is_legacy_script; then + unzip -oj "$ZIPFILE" module.prop install.sh uninstall.sh 'common/*' -d $TMPDIR >&2 + + # Load install script + . $TMPDIR/install.sh + + # Callbacks + print_modname + on_install + + # Custom uninstaller + [ -f $TMPDIR/uninstall.sh ] && cp -af $TMPDIR/uninstall.sh $MODPATH/uninstall.sh + + # Skip mount + $SKIPMOUNT && touch $MODPATH/skip_mount + + # prop file + $PROPFILE && cp -af $TMPDIR/system.prop $MODPATH/system.prop + + # Module info + cp -af $TMPDIR/module.prop $MODPATH/module.prop + + # post-fs-data scripts + $POSTFSDATA && cp -af $TMPDIR/post-fs-data.sh $MODPATH/post-fs-data.sh + + # service scripts + $LATESTARTSERVICE && cp -af $TMPDIR/service.sh $MODPATH/service.sh + + ui_print "- Setting permissions" + set_permissions +else + print_modname + + unzip -o "$ZIPFILE" customize.sh -d $MODPATH >&2 + + if ! grep -q '^SKIPUNZIP=1$' $MODPATH/customize.sh 2>/dev/null; then + ui_print "- Extracting module files" + unzip -o "$ZIPFILE" -x 'META-INF/*' -d $MODPATH >&2 + + # Default permissions + set_perm_recursive $MODPATH 0 0 0755 0644 + fi + + # Load customization script + [ -f $MODPATH/customize.sh ] && . $MODPATH/customize.sh +fi + +# Handle replace folders +for TARGET in $REPLACE; do + ui_print "- Replace target: $TARGET" + mktouch $MODPATH$TARGET/.replace +done + +if $BOOTMODE; then + # Update info for Magisk Manager + mktouch $NVBASE/modules/$MODID/update + cp -af $MODPATH/module.prop $NVBASE/modules/$MODID/module.prop +fi + +# Copy over custom sepolicy rules +if [ -f $MODPATH/sepolicy.rule -a -e $PERSISTDIR ]; then + ui_print "- Installing custom sepolicy patch" + PERSISTMOD=$PERSISTDIR/magisk/$MODID + mkdir -p $PERSISTMOD + cp -af $MODPATH/sepolicy.rule $PERSISTMOD/sepolicy.rule +fi + +# Remove stuffs that don't belong to modules +rm -rf \ +$MODPATH/system/placeholder $MODPATH/customize.sh \ +$MODPATH/README.md $MODPATH/.git* 2>/dev/null + +############## +# Finalizing +############## + +cd / +$BOOTMODE || recovery_cleanup +rm -rf $TMPDIR + +ui_print "- Done" +exit 0 \ No newline at end of file diff --git a/META-INF/com/google/android/updater-script b/META-INF/com/google/android/updater-script new file mode 100644 index 0000000..492be83 --- /dev/null +++ b/META-INF/com/google/android/updater-script @@ -0,0 +1 @@ +#MAGISK \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..59a744c --- /dev/null +++ b/Makefile @@ -0,0 +1,12 @@ +# Written by Draco (tytydraco @ GitHub) +# Modified by alanndz + +HASH := $(shell git rev-parse --short HEAD) +VERSION := $(shell cat module.prop | grep version= | sed "s/version=//") + +zip: + make clean || true + zip -x .git\* Makefile bin .gitignore *patch README* -r9 ChArch-Mod-$(VERSION)_$(HASH).zip . + +clean: + rm *.zip || true diff --git a/customize.sh b/customize.sh new file mode 100644 index 0000000..108b949 --- /dev/null +++ b/customize.sh @@ -0,0 +1,5 @@ +#!/system/bin/sh +# Written by Draco (tytydraco @ GitHub) + +ui_print "[*] Setting executable permissions..." +set_perm_recursive "$MODPATH/system/bin" root root 0777 0755 diff --git a/module.prop b/module.prop new file mode 100644 index 0000000..8a5ac94 --- /dev/null +++ b/module.prop @@ -0,0 +1,6 @@ +id=charch +name=ChArch +version=v2.0 +versionCode=2 +author=tytydraco +description=ChArch for Android. Modified by alanndz From 84b588fd048d971df94d9d2023f53011593a4ada Mon Sep 17 00:00:00 2001 From: alanndz <alanmahmud0@gmail.com> Date: Fri, 18 Dec 2020 11:29:27 +0000 Subject: [PATCH 7/9] add prebuilt fuser Signed-off-by: alanndz <alanmahmud0@gmail.com> --- system/bin/fuser | Bin 0 -> 67608 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 system/bin/fuser diff --git a/system/bin/fuser b/system/bin/fuser new file mode 100755 index 0000000000000000000000000000000000000000..4a3191c6f39e6134f65f27fa9e8d880ec7f737d4 GIT binary patch literal 67608 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 literal 0 HcmV?d00001 From 16c1fb9951562e65dcb5ff538e220d3e119380a2 Mon Sep 17 00:00:00 2001 From: alanndz <alanmahmud0@gmail.com> Date: Fri, 18 Dec 2020 11:31:23 +0000 Subject: [PATCH 8/9] cparch: fix Signed-off-by: alanndz <alanmahmud0@gmail.com> --- system/bin/cparch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/bin/cparch b/system/bin/cparch index 2d6d634..f318ed3 100755 --- a/system/bin/cparch +++ b/system/bin/cparch @@ -62,7 +62,7 @@ fi [[ -d "$CHROOT_DIR/$2" ]] && err "Rootfs instance with name $2 already exists. Exiting." # Unmount and exit on fail -! unarch -d "$CHROOT_DIR" "$1" && exit 1 +! unarch -d "$CHROOT_DIR" -n "$1" && exit 1 # Clone cp -Ra "$CHROOT_DIR/$1" "$CHROOT_DIR/$2" From 1f58e68f5b49931390d19c30bce1de6a08333dc6 Mon Sep 17 00:00:00 2001 From: alanndz <alanndz7@gmail.com> Date: Fri, 20 May 2022 20:45:13 +0800 Subject: [PATCH 9/9] mkarch: Use curl instead wget Signed-off-by: alanndz <alanndz7@gmail.com> --- system/bin/mkarch | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/bin/mkarch b/system/bin/mkarch index 7f55f3b..1c5f458 100755 --- a/system/bin/mkarch +++ b/system/bin/mkarch @@ -9,7 +9,7 @@ err() { } # Check for required dependencies -for dep in find id mkdir rm sed tar wc wget +for dep in find id mkdir rm sed tar wc curl do ! command -v "$dep" &> /dev/null && err "Unable to locate dependency $dep. Exiting." done @@ -74,7 +74,7 @@ ROOTFS_DIR="$CHROOT_DIR/$ROOTFS" fetch_rootfs() { [[ -z "$ROOTFS_URL" ]] && err "No rootfs tarball URL specified. Exiting." - ! wget -qO "$ROOTFS_TAR" "$ROOTFS_URL" && err "Failed to fetch rootfs tarball. Exiting." + ! curl -s -o "$ROOTFS_TAR" "$ROOTFS_URL" && err "Failed to fetch rootfs tarball. Exiting." } # Extract the rootfs and make it usable