Untitled diff

Created Diff never expires
29 removals
Lines
Total
Removed
Words
Total
Removed
To continue using this feature, upgrade to
Diffchecker logo
Diffchecker Pro
259 lines
11 additions
Lines
Total
Added
Words
Total
Added
To continue using this feature, upgrade to
Diffchecker logo
Diffchecker Pro
237 lines
#!/system/bin/sh
#!/system/bin/sh
#######################################################################################
#######################################################################################
# Magisk Boot Image Patcher
# Magisk Boot Image Patcher
#######################################################################################
#######################################################################################
#
#
# Usage: boot_patch.sh <bootimage>
# Usage: boot_patch.sh <bootimage>
#
#
# The following environment variables can configure the installation:
# The following environment variables can configure the installation:
# KEEPVERITY, KEEPFORCEENCRYPT, PATCHVBMETAFLAG, RECOVERYMODE, LEGACYSAR
# KEEPVERITY, KEEPFORCEENCRYPT, PATCHVBMETAFLAG, RECOVERYMODE, LEGACYSAR
#
#
# This script should be placed in a directory with the following files:
# This script should be placed in a directory with the following files:
#
#
# File name Type Description
# File name Type Description
#
#
# boot_patch.sh script A script to patch boot image for Magisk.
# boot_patch.sh script A script to patch boot image for Magisk.
# (this file) The script will use files in its same
# (this file) The script will use files in its same
# directory to complete the patching process.
# directory to complete the patching process.
# util_functions.sh script A script which hosts all functions required
# util_functions.sh script A script which hosts all functions required
# for this script to work properly.
# for this script to work properly.
# magiskinit binary The binary to replace /init.
# magisk(32/64) binary The magisk binaries.
# magiskboot binary A tool to manipulate boot images.
# magiskboot binary A tool to manipulate boot images.
# stub.apk binary The stub Magisk app to embed into ramdisk.
# chromeos folder This folder includes the utility and keys to sign
# chromeos folder This folder includes the utility and keys to sign
# (optional) chromeos boot images. Only used for Pixel C.
# (optional) chromeos boot images. Only used for Pixel C.
#
#
#######################################################################################
#######################################################################################


############
############
# Functions
# Functions
############
############


# Pure bash dirname implementation
# Pure bash dirname implementation
getdir() {
getdir() {
case "$1" in
case "$1" in
*/*)
*/*)
dir=${1%/*}
dir=${1%/*}
if [ -z $dir ]; then
if [ -z $dir ]; then
echo "/"
echo "/"
else
else
echo $dir
echo $dir
fi
fi
;;
;;
*) echo "." ;;
*) echo "." ;;
esac
esac
}
}


#################
#################
# Initialization
# Initialization
#################
#################


if [ -z $SOURCEDMODE ]; then
if [ -z $SOURCEDMODE ]; then
# Switch to the location of the script file
# Switch to the location of the script file
cd "$(getdir "${BASH_SOURCE:-$0}")"
cd "$(getdir "${BASH_SOURCE:-$0}")"
# Load utility functions
# Load utility functions
. ./util_functions.sh
. ./util_functions.sh
# Check if 64-bit
# Check if 64-bit
api_level_arch_detect
api_level_arch_detect
fi
fi


BOOTIMAGE="$1"
BOOTIMAGE="$1"
[ -e "$BOOTIMAGE" ] || abort "$BOOTIMAGE does not exist!"
[ -e "$BOOTIMAGE" ] || abort "$BOOTIMAGE does not exist!"


# Dump image for MTD/NAND character device boot partitions
# Dump image for MTD/NAND character device boot partitions
if [ -c "$BOOTIMAGE" ]; then
if [ -c "$BOOTIMAGE" ]; then
nanddump -f boot.img "$BOOTIMAGE"
nanddump -f boot.img "$BOOTIMAGE"
BOOTNAND="$BOOTIMAGE"
BOOTNAND="$BOOTIMAGE"
BOOTIMAGE=boot.img
BOOTIMAGE=boot.img
fi
fi


# Flags
# Flags
[ -z $KEEPVERITY ] && KEEPVERITY=false
[ -z $KEEPVERITY ] && KEEPVERITY=false
[ -z $KEEPFORCEENCRYPT ] && KEEPFORCEENCRYPT=false
[ -z $KEEPFORCEENCRYPT ] && KEEPFORCEENCRYPT=false
[ -z $PATCHVBMETAFLAG ] && PATCHVBMETAFLAG=false
[ -z $PATCHVBMETAFLAG ] && PATCHVBMETAFLAG=false
[ -z $RECOVERYMODE ] && RECOVERYMODE=false
[ -z $RECOVERYMODE ] && RECOVERYMODE=false
[ -z $LEGACYSAR ] && LEGACYSAR=false
[ -z $LEGACYSAR ] && LEGACYSAR=false
export KEEPVERITY
export KEEPVERITY
export KEEPFORCEENCRYPT
export KEEPFORCEENCRYPT
export PATCHVBMETAFLAG
export PATCHVBMETAFLAG


chmod -R 755 .
chmod -R 755 .


#########
#########
# Unpack
# Unpack
#########
#########


CHROMEOS=false
CHROMEOS=false


ui_print "- Unpacking boot image"
ui_print "- Unpacking boot image"
./magiskboot unpack "$BOOTIMAGE"
./magiskboot unpack "$BOOTIMAGE"


case $? in
case $? in
0 ) ;;
0 ) ;;
1 )
1 )
abort "! Unsupported/Unknown image format"
abort "! Unsupported/Unknown image format"
;;
;;
2 )
2 )
ui_print "- ChromeOS boot image detected"
ui_print "- ChromeOS boot image detected"
CHROMEOS=true
CHROMEOS=true
;;
;;
* )
* )
abort "! Unable to unpack boot image"
abort "! Unable to unpack boot image"
;;
;;
esac
esac


###################
###################
# Ramdisk Restores
# Ramdisk Restores
###################
###################


# Test patch status and do restore
# Test patch status and do restore
ui_print "- Checking ramdisk status"
ui_print "- Checking ramdisk status"
if [ -e ramdisk.cpio ]; then
if [ -e ramdisk.cpio ]; then
./magiskboot cpio ramdisk.cpio test
./magiskboot cpio ramdisk.cpio test
STATUS=$?
STATUS=$?
SKIP_BACKUP=""
SKIP_BACKUP=""
else
else
# Stock A only legacy SAR, or some Android 13 GKIs
# Stock A only legacy SAR, or some Android 13 GKIs
STATUS=0
STATUS=0
SKIP_BACKUP="#"
SKIP_BACKUP="#"
fi
fi
case $((STATUS & 3)) in
case $((STATUS & 3)) in
0 ) # Stock boot
0 ) # Stock boot
ui_print "- Stock boot image detected"
ui_print "- Stock boot image detected"
SHA1=$(./magiskboot sha1 "$BOOTIMAGE" 2>/dev/null)
abort "! Please install Magisk first"
cat $BOOTIMAGE > stock_boot.img
cp -af ramdisk.cpio ramdisk.cpio.orig 2>/dev/null
;;
;;
1 ) # Magisk patched
1 ) # Magisk patched
ui_print "- Magisk patched boot image detected"
ui_print "- Magisk patched boot image detected"
./magiskboot cpio ramdisk.cpio \
# ./magiskboot cpio ramdisk.cpio \
"extract .backup/.magisk config.orig" \
# "extract .backup/.magisk config.orig" \
"restore"
# "restore"
cp -af ramdisk.cpio ramdisk.cpio.orig
# cp -af ramdisk.cpio ramdisk.cpio.orig
rm -f stock_boot.img
# rm -f stock_boot.img
;;
;;
2 ) # Unsupported
2 ) # Unsupported
ui_print "! Boot image patched by unsupported programs"
ui_print "! Boot image patched by unsupported programs"
abort "! Please restore back to stock boot image"
abort "! Please restore back to stock boot image"
;;
;;
esac
esac


# Workaround custom legacy Sony /init -> /(s)bin/init_sony : /init.real setup
# Workaround custom legacy Sony /init -> /(s)bin/init_sony : /init.real setup
INIT=init
INIT=init
if [ $((STATUS & 4)) -ne 0 ]; then
if [ $((STATUS & 4)) -ne 0 ]; then
INIT=init.real
INIT=init.real
fi
fi


if [ -f config.orig ]; then
if [ -f config.orig ]; then
# Read existing configs
# Read existing configs
chmod 0644 config.orig
chmod 0644 config.orig
SHA1=$(grep_prop SHA1 config.orig)
SHA1=$(grep_prop SHA1 config.orig)
if ! $BOOTMODE; then
if ! $BOOTMODE; then
# Do not inherit config if not in recovery
# Do not inherit config if not in recovery
PREINITDEVICE=$(grep_prop PREINITDEVICE config.orig)
PREINITDEVICE=$(grep_prop PREINITDEVICE config.orig)
fi
fi
rm config.orig
rm config.orig
fi
fi


##################
##################
# Ramdisk Patches
# Ramdisk Patches
##################
##################


ui_print "- Patching ramdisk"
ui_print "- Patching ramdisk"


# Compress to save precious ramdisk space
SKIP32="#"
SKIP64="#"
if [ -f magisk64 ]; then
$BOOTMODE && [ -z "$PREINITDEVICE" ] && PREINITDEVICE=$(./magisk64 --preinit-device)
./magiskboot compress=xz magisk64 magisk64.xz
unset SKIP64
fi
if [ -f magisk32 ]; then
$BOOTMODE && [ -z "$PREINITDEVICE" ] && PREINITDEVICE=$(./magisk32 --preinit-device)
./magiskboot compress=xz magisk32 magisk32.xz
unset SKIP32
fi
./magiskboot compress=xz stub.apk stub.xz

echo "KEEPVERITY=$KEEPVERITY" > config
echo "KEEPVERITY=$KEEPVERITY" > config
echo "KEEPFORCEENCRYPT=$KEEPFORCEENCRYPT" >> config
echo "KEEPFORCEENCRYPT=$KEEPFORCEENCRYPT" >> config
echo "RECOVERYMODE=$RECOVERYMODE" >> config
echo "RECOVERYMODE=$RECOVERYMODE" >> config
if [ -n "$PREINITDEVICE" ]; then
if [ -n "$PREINITDEVICE" ]; then
ui_print "- Pre-init storage partition: $PREINITDEVICE"
ui_print "- Pre-init storage partition: $PREINITDEVICE"
echo "PREINITDEVICE=$PREINITDEVICE" >> config
echo "PREINITDEVICE=$PREINITDEVICE" >> config
fi
fi
[ -n "$SHA1" ] && echo "SHA1=$SHA1" >> config
[ -n "$SHA1" ] && echo "SHA1=$SHA1" >> config


./magiskboot cpio ramdisk.cpio \
./magiskboot cpio ramdisk.cpio \
"add 0750 $INIT magiskinit" \
"mkdir 0750 overlay.d" \
"mkdir 0750 overlay.d" \
"mkdir 0750 overlay.d/sbin" \
"mkdir 0750 overlay.d/sbin" \
"$SKIP32 add 0644 overlay.d/sbin/magisk32.xz magisk32.xz" \
"add 0750 overlay.d/init.autoboot.rc files/init.autoboot.rc" \
"$SKIP64 add 0644 overlay.d/sbin/magisk64.xz magisk64.xz" \
"add 0750 overlay.d/sbin/autoboot.sh files/autoboot.sh" \
"add 0644 overlay.d/sbin/stub.xz stub.xz" \
"patch" \
"patch" \
"$SKIP_BACKUP backup ramdisk.cpio.orig" \
"#$SKIP_BACKUP backup ramdisk.cpio.orig" \
"mkdir 000 .backup" \
"#mkdir 000 .backup" \
"add 000 .backup/.magisk config" \
"#add 000 .backup/.magisk config" \
|| abort "! Unable to patch ramdisk"
|| abort "! Unable to patch ramdisk"


rm -f ramdisk.cpio.orig config magisk*.xz stub.xz
rm -f ramdisk.cpio.orig config magisk*.xz stub.xz


#################
#################
# Binary Patches
# Binary Patches
#################
#################


for dt in dtb kernel_dtb extra; do
for dt in dtb kernel_dtb extra; do
if [ -f $dt ]; then
if [ -f $dt ]; then
if ! ./magiskboot dtb $dt test; then
if ! ./magiskboot dtb $dt test; then
ui_print "! Boot image $dt was patched by old (unsupported) Magisk"
ui_print "! Boot image $dt was patched by old (unsupported) Magisk"
abort "! Please try again with *unpatched* boot image"
abort "! Please try again with *unpatched* boot image"
fi
fi
if ./magiskboot dtb $dt patch; then
if ./magiskboot dtb $dt patch; then
ui_print "- Patch fstab in boot image $dt"
ui_print "- Patch fstab in boot image $dt"
fi
fi
fi
fi
done
done


if [ -f kernel ]; then
if [ -f kernel ]; then
PATCHEDKERNEL=false
PATCHEDKERNEL=false
# Remove Samsung RKP
# Remove Samsung RKP
./magiskboot hexpatch kernel \
./magiskboot hexpatch kernel \
49010054011440B93FA00F71E9000054010840B93FA00F7189000054001840B91FA00F7188010054 \
49010054011440B93FA00F71E9000054010840B93FA00F7189000054001840B91FA00F7188010054 \
A1020054011440B93FA00F7140020054010840B93FA00F71E0010054001840B91FA00F7181010054 \
A1020054011440B93FA00F7140020054010840B93FA00F71E0010054001840B91FA00F7181010054 \
&& PATCHEDKERNEL=true
&& PATCHEDKERNEL=true


# Remove Samsung defex
# Remove Samsung defex
# Before: [mov w2, #-221] (-__NR_execve)
# Before: [mov w2, #-221] (-__NR_execve)
# After: [mov w2, #-32768]
# After: [mov w2, #-32768]
./magiskboot hexpatch kernel 821B8012 E2FF8F12 && PATCHEDKERNEL=true
./magiskboot hexpatch kernel 821B8012 E2FF8F12 && PATCHEDKERNEL=true


# Force kernel to load rootfs for legacy SAR devices
# Force kernel to load rootfs for legacy SAR devices
# skip_initramfs -> want_initramfs
# skip_initramfs -> want_initramfs
$LEGACYSAR && ./magiskboot hexpatch kernel \
$LEGACYSAR && ./magiskboot hexpatch kernel \
736B69705F696E697472616D667300 \
736B69705F696E697472616D667300 \
77616E745F696E697472616D667300 \
77616E745F696E697472616D667300 \
&& PATCHEDKERNEL=true
&& PATCHEDKERNEL=true


# If the kernel doesn't need to be patched at all,
# If the kernel doesn't need to be patched at all,
# keep raw kernel to avoid bootloops on some weird devices
# keep raw kernel to avoid bootloops on some weird devices
$PATCHEDKERNEL || rm -f kernel
$PATCHEDKERNEL || rm -f kernel
fi
fi


#################
#################
# Repack & Flash
# Repack & Flash
#################
#################


ui_print "- Repacking boot image"
ui_print "- Repacking boot image"
./magiskboot repack "$BOOTIMAGE" || abort "! Unable to repack boot image"
./magiskboot repack "$BOOTIMAGE" || abort "! Unable to repack boot image"


# Sign chromeos boot
# Sign chromeos boot
$CHROMEOS && sign_chromeos
$CHROMEOS && sign_chromeos


# Restore the original boot partition path
# Restore the original boot partition path
[ -e "$BOOTNAND" ] && BOOTIMAGE="$BOOTNAND"
[ -e "$BOOTNAND" ] && BOOTIMAGE="$BOOTNAND"


# Reset any error code
# Reset any error code
true
true