#!/system/bin/sh # MagiskHide Props Config # By Didgeridoohan @ XDA Developers # Variables MODVERSION=VER_PLACEHOLDER POSTFILE=$IMGPATH/.core/post-fs-data.d/propsconf_post LATEFILE=$IMGPATH/.core/service.d/propsconf_late CACHELOC=CACHE_PLACEHOLDER RUNFILE=$MODPATH/script_check LOGFILE=$CACHELOC/propsconf.log LASTLOGFILE=$CACHELOC/propsconf_last.log CONFFILE=$CACHELOC/propsconf_conf RESETFILE=$CACHELOC/reset_mhpc MAGISKLOC=/data/adb/magisk BBPATH=$MAGISKLOC/busybox PRINTSLOC=$MODPATH/prints.sh PRINTSTMP=$CACHELOC/prints.sh PRINTSWWW="https://raw.githubusercontent.com/Magisk-Modules-Repo/MagiskHide-Props-Config/master/common/prints.sh" BIN=BIN_PLACEHOLDER USNFLIST=USNF_PLACEHOLDER alias cat="$BBPATH cat" alias grep="$BBPATH grep" alias printf="$BBPATH printf" alias resetprop="$MAGISKLOC/magisk resetprop" alias sed="$BBPATH sed" alias sort="$BBPATH sort" alias tr="$BBPATH tr" alias wget="$BBPATH wget" # MagiskHide props PROPSLIST=" ro.debuggable ro.secure ro.build.type ro.build.tags ro.build.selinux " # Safe values SAFELIST=" ro.debuggable=0 ro.secure=1 ro.build.type=user ro.build.tags=release-keys ro.build.selinux=0 " # Finding file values get_file_value() { cat $1 | grep $2 | sed "s/.*${2}//" | sed 's/\"//g' } # Logs log_handler() { echo "" >> $LOGFILE echo -e "$(date +"%m-%d-%Y %H:%M:%S") - $1" >> $LOGFILE } log_print() { echo "$1" log_handler "$1" } log_script_chk() { log_handler "$1" echo -e "$(date +"%m-%d-%Y %H:%M:%S") - $1" >> $RUNFILE } #Divider DIVIDER="${Y}=====================================${N}" # Header menu_header() { if [ -z "$LOGNAME" ]; then clear fi if [ "$MODVERSION" == "VER_PLACEHOLDER" ]; then VERSIONTXT="" else VERSIONTXT=$MODVERSION fi echo "" echo "${W}MagiskHide Props Config $VERSIONTXT${N}" echo "${W}by Didgeridoohan @ XDA Developers${N}" echo "" echo $DIVIDER echo -e " $1" echo $DIVIDER } # Find prop type get_prop_type() { echo $1 | sed 's/.*\.//' } # Get left side of = get_eq_left() { echo $1 | sed 's/=.*//' } # Get right side of = get_eq_right() { echo $1 | sed 's/.*=//' } # Get first word in string get_first() { case $1 in *\ *) echo $1 | sed 's/\ .*//' ;; *=*) get_eq_left $1 ;; esac } # Replace file values replace_fn() { sed -i "s@${1}=${2}@${1}=${3}@" $4 } # Updates placeholders placeholder_update() { FILEVALUE=$(get_file_value $1 "$2=") log_handler "Checking for '$3' in '$1'. Current value is '$FILEVALUE'." case $FILEVALUE in *PLACEHOLDER*) replace_fn $2 $3 $4 $1 log_handler "Placeholder '$3' updated to '$4' in '$1'." ;; esac } orig_check() { PROPSTMPLIST=$PROPSLIST" ro.build.fingerprint " ORIGLOAD=0 for PROPTYPE in $PROPSTMPLIST; do PROP=$(get_prop_type $PROPTYPE) ORIGPROP=$(echo "FILE${PROP}" | tr '[:lower:]' '[:upper:]') ORIGVALUE=$(get_file_value $LATEFILE "${ORIGPROP}=") if [ "$ORIGVALUE" ]; then ORIGLOAD=1 fi done } script_ran_check() { POSTCHECK=0 if [ "$(cat $RUNFILE | grep "post-fs-data.sh finished")" ]; then POSTCHECK=1 fi LATECHECK=0 if [ "$(cat $RUNFILE | grep "Boot script finished")" ]; then LATECHECK=1 fi } # Currently set values curr_values() { CURRDEBUGGABLE=$(resetprop ro.debuggable) CURRSECURE=$(resetprop ro.secure) CURRTYPE=$(resetprop ro.build.type) CURRTAGS=$(resetprop ro.build.tags) CURRSELINUX=$(resetprop ro.build.selinux) CURRFINGERPRINT=$(resetprop ro.build.fingerprint) if [ -z "$CURRFINGERPRINT" ]; then CURRFINGERPRINT=$(resetprop ro.bootimage.build.fingerprint) fi } # Prop file values file_values() { FILEDEBUGGABLE=$(get_file_value /default.prop "ro.debuggable=") FILESECURE=$(get_file_value /default.prop "ro.secure=") FILETYPE=$(get_file_value /system/build.prop "ro.build.type=") FILETAGS=$(get_file_value /system/build.prop "ro.build.tags=") FILESELINUX=$(get_file_value /system/build.prop "ro.build.selinux=") FILEFINGERPRINT=$(get_file_value /system/build.prop "ro.build.fingerprint=") if [ -z "$FILEFINGERPRINT" ]; then FILEFINGERPRINT=$(get_file_value /system/build.prop "ro.bootimage.build.fingerprint=") if [ -z "$FILEFINGERPRINT" ]; then FILEFINGERPRINT=$(resetprop ro.build.fingerprint) if [ -z "$FILEFINGERPRINT" ]; then FILEFINGERPRINT=$(resetprop ro.bootimage.build.fingerprint) fi fi fi } # Latefile values latefile_values() { LATEFILEDEBUGGABLE=$(get_file_value $LATEFILE "FILEDEBUGGABLE=") LATEFILESECURE=$(get_file_value $LATEFILE "FILESECURE=") LATEFILETYPE=$(get_file_value $LATEFILE "FILETYPE=") LATEFILETAGS=$(get_file_value $LATEFILE "FILETAGS=") LATEFILESELINUX=$(get_file_value $LATEFILE "FILESELINUX=") LATEFILEFINGERPRINT=$(get_file_value $LATEFILE "FILEFINGERPRINT=") } # Module values module_values() { MODULEDEBUGGABLE=$(get_file_value $LATEFILE "MODULEDEBUGGABLE=") MODULESECURE=$(get_file_value $LATEFILE "MODULESECURE=") MODULETYPE=$(get_file_value $LATEFILE "MODULETYPE=") MODULETAGS=$(get_file_value $LATEFILE "MODULETAGS=") MODULESELINUX=$(get_file_value $LATEFILE "MODULESELINUX=") MODULEFINGERPRINT=$(get_file_value $LATEFILE "MODULEFINGERPRINT=") CUSTOMPROPS=$(get_file_value $LATEFILE "CUSTOMPROPS=") } # Run all value functions all_values() { # Currently set values curr_values # Prop file values file_values # Latefile values latefile_values # Module values module_values } after_change() { # Update the reboot variable reboot_chk # Load all values all_values # Ask to reboot reboot_fn "$1" } after_change_file() { # Update the reboot variable reboot_chk # Load all values INPUT="" all_values # Ask to reboot reboot_fn "$1" "$2" } reboot_chk() { replace_fn REBOOTCHK 0 1 $LATEFILE } reset_fn() { BUILDPROPENB=$(get_file_value $LATEFILE "BUILDPROPENB=") FINGERPRINTENB=$(get_file_value $LATEFILE "FINGERPRINTENB=") cp -af $MODPATH/propsconf_late $LATEFILE if [ "$BUILDPROPENB" ] && [ -z "$BUILDPROPENB" == 1 ]; then replace_fn BUILDPROPENB 1 $BUILDPROPENB $LATEFILE fi if [ "$FINGERPRINTENB" ] && [ -z "$FINGERPRINTENB" == 1 ]; then replace_fn FINGERPRINTENB 1 $FINGERPRINTENB $LATEFILE fi chmod 755 $LATEFILE placeholder_update $LATEFILE IMGPATH IMG_PLACEHOLDER $IMGPATH # Update the reboot variable reboot_chk # Update all prop value variables all_values } # Check if original file values are safe orig_safe() { replace_fn FILESAFE 0 1 $LATEFILE for V in $PROPSLIST; do PROP=$(get_prop_type $V) FILEPROP=$(echo "FILE${PROP}" | tr '[:lower:]' '[:upper:]') FILEVALUE=$(eval "echo \$$FILEPROP") log_handler "Checking $FILEPROP=$FILEVALUE" safe_props $V $FILEVALUE if [ "$SAFE" == 0 ]; then log_handler "Prop $V set to triggering value in prop file." replace_fn FILESAFE 1 0 $LATEFILE else log_handler "Prop $V set to \"safe\" value in prop file." fi done } # Checks for configuration file config_file() { log_handler "Checking for configuration file." if [ -f "$CONFFILE" ]; then log_handler "Configuration file detected." # Loads custom variables . $CONFFILE # Updates prop values (including fingerprint) PROPSTMPLIST=$PROPSLIST" ro.build.fingerprint " for PROPTYPE in $PROPSTMPLIST; do CONFPROP=$(echo "CONF$(get_prop_type $PROPTYPE)" | tr '[:lower:]' '[:upper:]') TMPPROP=$(eval "echo \$$CONFPROP") if [ "$TMPPROP" ]; then log_handler "Checking $PROPTYPE settings." if [ "$TMPPROP" != "preserve" ]; then if [ "$PROPTYPE" == "ro.build.fingerprint" ]; then if [ "$(get_file_value $LATEFILE "FINGERPRINTENB=")" == 1 ]; then change_print "$PROPTYPE" "$TMPPROP" "file" fi else change_prop "$PROPTYPE" "$TMPPROP" "file" fi fi else if [ "$PROPTYPE" == "ro.build.fingerprint" ]; then if [ "$(get_file_value $LATEFILE "FINGERPRINTENB=")" == 1 ]; then reset_print "$PROPTYPE" "file" fi else reset_prop "$PROPTYPE" "file" fi fi done # Updates prop file editing if [ "$(get_file_value $LATEFILE "FILESAFE=")" == 0 ]; then if [ "$CONFPROPFILES" == "true" ]; then edit_prop_files "file" "" " (configuration file)" elif [ "$CONFPROPFILES" == "false" ]; then reset_prop_files "file" "" " (configuration file)" fi fi # Updates custom props if [ "$PROPOPTION" != "preserve" ]; then if [ "$CONFPROPS" ]; then if [ "$PROPOPTION" == "add" ] || [ "$PROPOPTION" == "replace" ]; then if [ "$PROPOPTION" == "replace" ]; then reset_all_custprop "file" fi for ITEM in $CONFPROPS; do set_custprop "$(get_eq_left $ITEM)" "$(get_eq_right $ITEM)" "file" done fi else reset_all_custprop "file" fi fi # Updates options OPTCCURR=$(get_file_value $LATEFILE "OPTIONCOLOUR=") OPTWCURR=$(get_file_value $LATEFILE "OPTIONWEB=") if [ "$CONFCOLOUR" == "enabled" ]; then OPTCCHNG=1 else OPTCCHNG=0 fi replace_fn OPTIONCOLOUR $OPTCCURR $OPTCCHNG $LATEFILE log_handler "Colour $CONFCOLOUR." if [ "$CONFWEB" == "enabled" ]; then OPTWCHNG=1 else OPTWCHNG=0 fi replace_fn OPTIONWEB $OPTWCURR $OPTWCHNG $LATEFILE log_handler "Automatic fingerprints list update $CONFWEB." # Deletes the configuration file log_handler "Deleting configuration file." rm -f $CONFFILE else log_handler "No configuration file." fi } # ======================== Fingerprint functions ======================== # Checks and updates the prints list download_prints() { if [ -z "$LOGNAME" ]; then clear fi menu_header "Updating fingerprints list" echo "" log_print "Checking list version." wget -T 10 -O $PRINTSTMP $PRINTSWWW 2>> $LOGFILE if [ -f "$PRINTSTMP" ]; then LISTVERSION=$(get_file_value $PRINTSTMP "PRINTSV=") if [ "$LISTVERSION" -gt "$(get_file_value $PRINTSLOC "PRINTSV=")" ]; then if [ "$(get_file_value $PRINTSTMP "PRINTSTRANSF=")" -le "$(get_file_value $PRINTSLOC "PRINTSTRANSF=")" ]; then mv -f $PRINTSTMP $PRINTSLOC # Updates list version in module.prop VERSIONTMP=$(get_file_value $MODPATH/module.prop "version=") replace_fn version $VERSIONTMP "${MODVERSION}-v${LISTVERSION}" $MODPATH/module.prop log_print "Updated list to v${LISTVERSION}." else rm -f $PRINTSTMP log_print "New fingerprints list requires module update." fi else rm -f $PRINTSTMP log_print "Fingerprints list up-to-date." fi else log_print "No connection." fi if [ "$1" == "manual" ]; then sleep 2 else sleep 0.5 fi } # Reset the module fingerprint change reset_print() { log_handler "Resetting device fingerprint." SUBA=$(get_file_value $LATEFILE "MODULEFINGERPRINT=") # Saves new module value replace_fn MODULEFINGERPRINT "\"$SUBA\"" "\"\"" $LATEFILE # Updates prop change variables in propsconf_late replace_fn PRINTEDIT 1 0 $LATEFILE # Updates improved hiding setting if [ "$(get_file_value $LATEFILE "BUILDEDIT=")" ]; then replace_fn SETFINGERPRINT "true" "false" $LATEFILE fi if [ "$2" != "file" ]; then after_change "$1" fi } # Use fingerprint change_print() { log_handler "Changing device fingerprint to $2." SUBA=$(get_file_value $LATEFILE "MODULEFINGERPRINT=") # Saves new module value replace_fn MODULEFINGERPRINT "\"$SUBA\"" "\"$2\"" $LATEFILE # Updates prop change variables in propsconf_late replace_fn PRINTEDIT 0 1 $LATEFILE # Updates improved hiding setting if [ "$(get_file_value $LATEFILE "BUILDEDIT=")" ]; then replace_fn SETFINGERPRINT "false" "true" $LATEFILE fi NEWFINGERPRINT="" if [ "$3" != "file" ]; then after_change "$1" fi } # ======================== Props files functions ======================== # Reset prop files reset_prop_files() { log_handler "Resetting prop files$3." # Changes files for PROPTYPE in $PROPSLIST; do log_handler "Disabling prop file editing for '$PROPTYPTE'." PROP=$(get_prop_type $PROPTYPE) SETPROP=$(echo "SET$PROP" | tr '[:lower:]' '[:upper:]') replace_fn $SETPROP "true" "false" $LATEFILE done # Change fingerprint replace_fn SETFINGERPRINT "true" "false" $LATEFILE # Edit settings variables replace_fn BUILDEDIT 1 0 $LATEFILE replace_fn DEFAULTEDIT 1 0 $LATEFILE if [ "$1" != "file" ]; then after_change_file "$1" "$2" fi } # Editing prop files edit_prop_files() { log_handler "Modifying prop files$3." # Checks if editing prop files is enabled if [ "$(get_file_value $LATEFILE "BUILDPROPENB=")" == 0 ]; then log_handler "Editing build.prop is disabled. Only editing default.prop." PROPSLIST=" ro.debuggable ro.secure " else # Checking if the device fingerprint is set by the module if [ "$(get_file_value $LATEFILE "FINGERPRINTENB=")" == 1 ] && [ "$(get_file_value $LATEFILE "PRINTEDIT=")" == 1 ]; then if [ "$(cat /system/build.prop | grep "$FILEFINGERPRINT")" ]; then replace_fn SETFINGERPRINT "false" "true" $LATEFILE fi fi fi for PROPTYPE in $PROPSLIST; do log_handler "Checking original file value for '$PROPTYPE'." PROP=$(get_prop_type $PROPTYPE) FILEPROP=$(echo "FILE$PROP" | tr '[:lower:]' '[:upper:]') SETPROP=$(echo "SET$PROP" | tr '[:lower:]' '[:upper:]') # Check the original file value PROPVALUE=$(get_file_value $LATEFILE "$FILEPROP=") if [ -z "$PROPVALUE" ]; then if [ "$PROPTYPE" == "ro.debuggable" ] || [ "$PROPTYPE" == "ro.secure" ]; then PROPVALUE=$(get_file_value /default.prop "${PROPTYPE}=") else PROPVALUE=$(get_file_value /system/build.prop "${PROPTYPE}=") fi fi # Checks for default/set values safe_props $PROPTYPE $PROPVALUE # Changes file only if necessary if [ "$SAFE" == 0 ]; then log_handler "Enabling prop file editing for '$PROPTYPE'." replace_fn $SETPROP "false" "true" $LATEFILE elif [ "$SAFE" == 1 ]; then log_handler "Prop file editing unnecessary for '$PROPTYPE'." replace_fn $SETPROP "true" "false" $LATEFILE else log_handler "Couldn't check safe value for '$PROPTYPE'." fi done replace_fn BUILDEDIT 0 1 $LATEFILE replace_fn DEFAULTEDIT 0 1 $LATEFILE if [ "$1" != "file" ]; then after_change_file "$1" "$2" fi } # ======================== MagiskHide Props functions ======================== # Check safe values safe_props() { SAFE="" if [ "$2" ]; then for P in $SAFELIST; do if [ "$(get_eq_left $P)" == "$1" ]; then if [ "$2" == "$(get_eq_right $P)" ]; then SAFE=1 else SAFE=0 fi break fi done fi } # Find what prop value to change to change_to() { CHANGE="" case "$1" in ro.debuggable) if [ "$2" == 0 ]; then CHANGE=1; else CHANGE=0; fi ;; ro.secure) if [ "$2" == 0 ]; then CHANGE=1; else CHANGE=0; fi ;; ro.build.type) if [ "$2" == "userdebug" ]; then CHANGE="user"; else CHANGE="userdebug"; fi ;; ro.build.tags) if [ "$2" == "test-keys" ]; then CHANGE="release-keys"; else CHANGE="test-keys"; fi ;; ro.build.selinux) if [ "$2" == 0 ]; then CHANGE=1; else CHANGE=0; fi ;; esac } # Reset the module prop change reset_prop() { # Sets variables PROP=$(get_prop_type $1) MODULEPROP=$(echo "MODULE${PROP}" | tr '[:lower:]' '[:upper:]') REPROP=$(echo "RE${PROP}" | tr '[:lower:]' '[:upper:]') SUBA=$(get_file_value $LATEFILE "${MODULEPROP}=") log_handler "Resetting $1 to default value." # Saves new module value replace_fn $MODULEPROP "\"$SUBA\"" "\"\"" $LATEFILE # Changes prop replace_fn $REPROP "true" "false" $LATEFILE # Updates prop change variable in propsconf_late PROPCOUNT=$(get_file_value $LATEFILE "PROPCOUNT=") if [ "$SUBA" ]; then if [ "$PROPCOUNT" -gt 0 ]; then PROPCOUNTP=$(($PROPCOUNT-1)) replace_fn PROPCOUNT $PROPCOUNT $PROPCOUNTP $LATEFILE fi if [ "$PROPCOUNT" == 0 ]; then replace_fn PROPEDIT 1 0 $LATEFILE fi fi if [ "$2" != "file" ]; then after_change "$1" fi } # Use prop value change_prop() { # Sets variables PROP=$(get_prop_type $1) MODULEPROP=$(echo "MODULE${PROP}" | tr '[:lower:]' '[:upper:]') REPROP=$(echo "RE${PROP}" | tr '[:lower:]' '[:upper:]') SUBA=$(get_file_value $LATEFILE "${MODULEPROP}=") log_handler "Changing $1 to $2." # Saves new module value replace_fn $MODULEPROP "\"$SUBA\"" "\"$2\"" $LATEFILE # Changes prop replace_fn $REPROP "false" "true" $LATEFILE # Updates prop change variables in propsconf_late if [ -z "$SUBA" ]; then PROPCOUNT=$(get_file_value $LATEFILE "PROPCOUNT=") PROPCOUNTP=$(($PROPCOUNT+1)) replace_fn PROPCOUNT $PROPCOUNT $PROPCOUNTP $LATEFILE fi replace_fn PROPEDIT 0 1 $LATEFILE if [ "$3" != "file" ]; then after_change "$1" fi } # Reset all module prop changes reset_prop_all() { log_handler "Resetting all props to default values." for PROPTYPE in $PROPSLIST; do PROP=$(get_prop_type $PROPTYPE) MODULEPROP=$(echo "MODULE${PROP}" | tr '[:lower:]' '[:upper:]') REPROP=$(echo "RE${PROP}" | tr '[:lower:]' '[:upper:]') SUBA=$(get_file_value $LATEFILE "${MODULEPROP}=") # Saves new module value replace_fn $MODULEPROP "\"$SUBA\"" "\"\"" $LATEFILE # Changes prop replace_fn $REPROP "true" "false" $LATEFILE done # Updates prop change variables in propsconf_late PROPCOUNT=$(get_file_value $LATEFILE "PROPCOUNT=") replace_fn PROPCOUNT $PROPCOUNT 0 $LATEFILE replace_fn PROPEDIT 1 0 $LATEFILE after_change "$1" } # ======================== Custom Props functions ======================== # Set custom prop value set_custprop() { if [ "$2" ]; then CURRCUSTPROPS=$(get_file_value $LATEFILE "CUSTOMPROPS=") TMPCUSTPROPS=$(echo "$CURRCUSTPROPS ${1}=${2}" | sed 's/^[ \t]*//') SORTCUSTPROPS=$(echo $(printf '%s\n' $TMPCUSTPROPS | sort -u)) log_handler "Setting custom prop $1." replace_fn CUSTOMPROPS "\"$CURRCUSTPROPS\"" "\"$SORTCUSTPROPS\"" $LATEFILE replace_fn CUSTOMEDIT 0 1 $LATEFILE if [ "$3" != "file" ]; then after_change "$1" fi fi } # Reset all custom prop values reset_all_custprop() { CURRCUSTPROPS=$(get_file_value $LATEFILE "CUSTOMPROPS=") log_handler "Resetting all custom props." # Removing all custom props replace_fn CUSTOMPROPS "\"$CURRCUSTPROPS\"" "\"\"" $LATEFILE replace_fn CUSTOMEDIT 1 0 $LATEFILE if [ "$1" != "file" ]; then after_change "$1" fi } # Reset custom prop value reset_custprop() { CURRCUSTPROPS=$(get_file_value $LATEFILE "CUSTOMPROPS=") log_handler "Resetting custom props $1." TMPCUSTPROPS=$(echo $CURRCUSTPROPS | sed "s/${1}=${2}//" | tr -s " " | sed 's/^[ \t]*//') # Removing all custom props replace_fn CUSTOMPROPS "\"$CURRCUSTPROPS\"" "\"$TMPCUSTPROPS\"" $LATEFILE CURRCUSTPROPS=$(get_file_value $LATEFILE "CUSTOMPROPS=") if [ -z "$CURRCUSTPROPS" ]; then replace_fn CUSTOMEDIT 1 0 $LATEFILE fi after_change "$1" }