From d55072aaa8cf94b326a36e88ba1558f919ed05a7 Mon Sep 17 00:00:00 2001 From: LukeeGD Date: Fri, 14 Aug 2020 11:57:20 +0800 Subject: [PATCH] Changes for dependencies (especially macOS) - python3 no longer required - Homebrew no longer required - macOS libimobiledevice is from imobiledevice-net --- resources/tools/bspatch_macos | Bin 0 -> 18688 bytes resources/tools/irecovery_macos | Bin 0 -> 46000 bytes restore.sh | 114 ++++++++++++++++++-------------- 3 files changed, 64 insertions(+), 50 deletions(-) create mode 100755 resources/tools/bspatch_macos create mode 100755 resources/tools/irecovery_macos diff --git a/resources/tools/bspatch_macos b/resources/tools/bspatch_macos new file mode 100755 index 0000000000000000000000000000000000000000..8c99e3048dfc54203e6ba67dba80f1f173291793 GIT binary patch literal 18688 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 literal 0 HcmV?d00001 diff --git a/resources/tools/irecovery_macos b/resources/tools/irecovery_macos new file mode 100755 index 0000000000000000000000000000000000000000..3ef7727b72b86e9cdbffb5c2a438469cb7660f86 GIT binary patch literal 46000 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 W)^jWz?MA!f_pvVvVgd~}g8={(^UyH> literal 0 HcmV?d00001 diff --git a/restore.sh b/restore.sh index 91871e8..9842a5a 100755 --- a/restore.sh +++ b/restore.sh @@ -21,22 +21,39 @@ function Main { echo "******* iOS-OTA-Downgrader *******" echo " Downgrader script by LukeZGD " echo - [[ $OSTYPE == "linux-gnu" ]] && platform='linux' - [[ $OSTYPE == "darwin"* ]] && platform='macos' + + if [[ $OSTYPE == "linux-gnu" ]]; then + platform='linux' + bspatch="bspatch" + ideviceenterrecovery="ideviceenterrecovery" + ideviceinfo="ideviceinfo" + iproxy="iproxy" + irecovery="sudo LD_LIBRARY_PATH=/usr/local/lib irecovery" + lsusb="lsusb" + python="python2" + elif [[ $OSTYPE == "darwin"* ]]; then + platform='macos' + bspatch="resources/tools/bspatch_macos" + ideviceenterrecovery="resources/libimobiledevice/ideviceenterrecovery" + ideviceinfo="resources/libimobiledevice/ideviceinfo" + iproxy="resources/libimobiledevice/iproxy" + irecovery="resources/tools/irecovery_macos" + lsusb="system_profiler SPUSBDataType" + python="python" + fi + futurerestore1="sudo LD_PRELOAD=libcurl.so.3 resources/tools/futurerestore1_$platform" + futurerestore2="sudo LD_LIBRARY_PATH=/usr/local/lib resources/tools/futurerestore2_$platform" + pzb="resources/tools/pzb_$platform" + tsschecker="env LD_LIBRARY_PATH=/usr/local/lib resources/tools/tsschecker_$platform" + [[ ! $platform ]] && Error "OSTYPE unknown/not supported." "Supports Linux and macOS only" [[ ! $(ping -c1 google.com 2>/dev/null) ]] && Error "Please check your Internet connection before proceeding." [[ $(uname -m) != 'x86_64' ]] && Error "Only x86_64 distributions are supported. Use a 64-bit distro and try again" - futurerestore1="sudo LD_PRELOAD=libcurl.so.3 resources/tools/futurerestore1_$platform" - futurerestore2="sudo LD_LIBRARY_PATH=/usr/local/lib resources/tools/futurerestore2_$platform" - irecovery="sudo LD_LIBRARY_PATH=/usr/local/lib irecovery" - pzb="resources/tools/pzb_$platform" - tsschecker="env LD_LIBRARY_PATH=/usr/local/lib resources/tools/tsschecker_$platform" - - DFUDevice=$(lsusb | grep -c '1227') - RecoveryDevice=$(lsusb | grep -c '1281') - if [[ $1 == Install ]] || [ ! $(which bspatch) ] || [ ! $(which ideviceinfo) ] || - [ ! $(which lsusb) ] || [ ! $(which ssh) ] || [ ! $(which python3) ]; then + DFUDevice=$($lsusb | grep -c '1227') + RecoveryDevice=$($lsusb | grep -c '1281') + if [[ $1 == Install ]] || [ ! $(which $bspatch) ] || [ ! $(which $ideviceinfo) ] || + [ ! $(which $lsusb) ] || [ ! $(which ssh) ] || [ ! $(which $python) ]; then InstallDependencies elif [ $DFUDevice == 1 ] || [ $RecoveryDevice == 1 ]; then ProductType=$(sudo LD_LIBRARY_PATH=/usr/local/lib resources/tools/igetnonce_$platform 2>/dev/null) @@ -44,14 +61,14 @@ function Main { UniqueChipID=$($irecovery -q | grep 'ECID' | cut -c 7-) ProductVer='Unknown' else - ideviceinfo=$(ideviceinfo -s) - HWModel=$(echo "$ideviceinfo" | grep 'HardwareModel' | cut -c 16- | tr '[:upper:]' '[:lower:]' | sed 's/.\{2\}$//') - ProductType=$(echo "$ideviceinfo" | grep 'ProductType' | cut -c 14-) - [ ! $ProductType ] && ProductType=$(ideviceinfo | grep 'ProductType' | cut -c 14-) - ProductVer=$(echo "$ideviceinfo" | grep 'ProductVer' | cut -c 17-) + ideviceinfo2=$($ideviceinfo -s) + HWModel=$(echo "$ideviceinfo2" | grep 'HardwareModel' | cut -c 16- | tr '[:upper:]' '[:lower:]' | sed 's/.\{2\}$//') + ProductType=$(echo "$ideviceinfo2" | grep 'ProductType' | cut -c 14-) + [ ! $ProductType ] && ProductType=$($ideviceinfo | grep 'ProductType' | cut -c 14-) + ProductVer=$(echo "$ideviceinfo2" | grep 'ProductVer' | cut -c 17-) VersionDetect=$(echo $ProductVer | cut -c 1) - UniqueChipID=$(echo "$ideviceinfo" | grep 'UniqueChipID' | cut -c 15-) - UniqueDeviceID=$(echo "$ideviceinfo" | grep 'UniqueDeviceID' | cut -c 17-) + UniqueChipID=$(echo "$ideviceinfo2" | grep 'UniqueChipID' | cut -c 15-) + UniqueDeviceID=$(echo "$ideviceinfo2" | grep 'UniqueDeviceID' | cut -c 17-) fi [ ! $ProductType ] && ProductType=0 BasebandDetect @@ -74,7 +91,6 @@ function Main { esac done SelectVersion - elif [[ $RecoveryDevice == 1 ]] && [[ $A7Device != 1 ]]; then Error "32-bit device detected in recovery mode. Please put the device in normal mode and jailbroken before proceeding" "For usage of 32-bit ipwndfu, put the device in DFU mode (A6) or pwnDFU mode (A5 using Arduino)" fi @@ -197,12 +213,12 @@ function kDFU { fi [[ ! -e saved/$ProductType/$iBSS.dfu ]] && Error "Failed to save iBSS. Please run the script again" Log "Patching iBSS..." - bspatch saved/$ProductType/$iBSS.dfu tmp/pwnediBSS resources/patches/$iBSS.patch + $bspatch saved/$ProductType/$iBSS.dfu tmp/pwnediBSS resources/patches/$iBSS.patch if [[ $1 == iBSS ]]; then cd resources/ipwndfu 2>/dev/null Log "Booting iBSS..." - sudo python2 ipwndfu -l ../../tmp/pwnediBSS + sudo $python ipwndfu -l ../../tmp/pwnediBSS cd ../.. return $? fi @@ -214,7 +230,7 @@ function kDFU { [ ! $(which iproxy) ] && Error "iproxy cannot be found. Please re-install dependencies and try again" "./restore.sh InstallDependencies" iproxy 2222 22 & iproxyPID=$! - WifiAddr=$(echo "$ideviceinfo" | grep 'WiFiAddress' | cut -c 14-) + WifiAddr=$(echo "$ideviceinfo2" | grep 'WiFiAddress' | cut -c 14-) WifiAddrDecr=$(echo $(printf "%x\n" $(expr $(printf "%d\n" 0x$(echo "${WifiAddr}" | tr -d ':')) - 1)) | sed 's/\(..\)/\1:/g;s/:$//') echo '#!/bin/bash' > tmp/pwn.sh echo "nvram wifiaddr=$WifiAddrDecr" >> tmp/pwn.sh @@ -236,7 +252,7 @@ function kDFU { Log "Finding device in DFU mode..." while [[ $DFUDevice != 1 ]]; do - DFUDevice=$(lsusb | grep -c '1227') + DFUDevice=$($lsusb | grep -c '1227') sleep 2 done Log "Found device in DFU mode." @@ -244,12 +260,12 @@ function kDFU { } function Recovery { - RecoveryDevice=$(lsusb | grep -c '1281') + RecoveryDevice=$($lsusb | grep -c '1281') if [[ $RecoveryDevice != 1 ]]; then Log "Entering recovery mode..." ideviceenterrecovery $UniqueDeviceID >/dev/null while [[ $RecoveryDevice != 1 ]]; do - RecoveryDevice=$(lsusb | grep -c '1281') + RecoveryDevice=$($lsusb | grep -c '1281') sleep 2 done fi @@ -268,7 +284,7 @@ function Recovery { echo -e "\n* Release POWER and hold HOME button for 10 seconds." for i in {10..01}; do echo -n "$i " - DFUDevice=$(lsusb | grep -c '1227') + DFUDevice=$($lsusb | grep -c '1227') [[ $DFUDevice == 1 ]] && CheckM8 sleep 1 done @@ -280,13 +296,13 @@ function CheckM8 { [[ $A7Device == 1 ]] && echo -e "\n[Log] Device in DFU mode detected." Log "Entering pwnDFU mode with ipwndfu..." cd resources/ipwndfu - sudo python2 ipwndfu -p - pwnDFUDevice=$(sudo lsusb -v -d 05ac:1227 2>/dev/null | grep -c 'checkm8') + sudo $python ipwndfu -p + pwnDFUDevice=$(sudo $lsusb -v -d 05ac:1227 2>/dev/null | grep -c 'checkm8') if [ $pwnDFUDevice == 1 ]; then Log "Device in pwnDFU mode detected." if [[ $A7Device == 1 ]]; then Log "Running rmsigchks.py..." - sudo python2 rmsigchks.py + sudo $python rmsigchks.py cd ../.. else kDFU iBSS @@ -338,8 +354,8 @@ function Downgrade { if [ ! -e $IPSWCustom.ipsw ]; then Log "Preparing custom IPSW..." cp $IPSW/Firmware/all_flash/$SEP . - bspatch $IPSW/Firmware/dfu/$iBSS.im4p $iBSS.im4p resources/patches/$iBSS.patch - bspatch $IPSW/Firmware/dfu/$iBEC.im4p $iBEC.im4p resources/patches/$iBEC.patch + $bspatch $IPSW/Firmware/dfu/$iBSS.im4p $iBSS.im4p resources/patches/$iBSS.patch + $bspatch $IPSW/Firmware/dfu/$iBEC.im4p $iBEC.im4p resources/patches/$iBEC.patch cp -f $iBSS.im4p $iBEC.im4p $IPSW/Firmware/dfu cd $IPSW zip ../$IPSWCustom.ipsw -rq0 * @@ -355,7 +371,7 @@ function Downgrade { $irecovery -f $iBSS.im4p $irecovery -f $iBEC.im4p sleep 5 - RecoveryDevice=$(lsusb | grep -c '1281') + RecoveryDevice=$($lsusb | grep -c '1281') if [[ $RecoveryDevice != 1 ]]; then echo "[Error] Failed to detect device in pwnREC mode." echo "* If you device has backlight turned on, you may try re-plugging in your device and attempt to continue" @@ -363,7 +379,7 @@ function Downgrade { read -s Log "Finding device in pwnREC mode..." while [[ $RecoveryDevice != 1 ]]; do - RecoveryDevice=$(lsusb | grep -c '1281') + RecoveryDevice=$($lsusb | grep -c '1281') sleep 2 done fi @@ -373,7 +389,7 @@ function Downgrade { Log "Preparing for futurerestore... (Enter root password of your PC/Mac when prompted)" cd resources - sudo bash -c "python3 -m http.server 80 &" + sudo bash -c "$python -m SimpleHTTPServer 80 &" cd .. if [ $Baseband == 0 ]; then @@ -420,7 +436,7 @@ function Downgrade { echo Log "futurerestore done!" Log "Stopping local server... (Enter root password of your PC/Mac when prompted)" - ps aux | awk '/python3/ {print "sudo kill -9 "$2" 2>/dev/null"}' | bash + ps aux | awk '/python/ {print "sudo kill -9 "$2" 2>/dev/null"}' | bash Log "Downgrade script done!" } @@ -433,14 +449,14 @@ function InstallDependencies { Log "Installing dependencies..." if [[ $ID == "arch" ]] || [[ $ID_LIKE == "arch" ]]; then # Arch Linux - sudo pacman -Sy --noconfirm --needed bsdiff curl libcurl-compat libpng12 libimobiledevice libusbmuxd libzip openssh openssl-1.0 python2 python unzip usbmuxd usbutils + sudo pacman -Sy --noconfirm --needed bsdiff curl libcurl-compat libpng12 libimobiledevice libusbmuxd libzip openssh openssl-1.0 python2 unzip usbmuxd usbutils sudo ln -sf /usr/lib/libzip.so.5 /usr/lib/libzip.so.4 elif [[ $UBUNTU_CODENAME == "focal" ]]; then # Ubuntu Focal sudo add-apt-repository universe sudo apt update - sudo apt install -y autoconf automake binutils bsdiff build-essential checkinstall curl git libimobiledevice-utils libplist3 libreadline-dev libtool-bin libusb-1.0-0-dev libusbmuxd6 libusbmuxd-tools libzip5 openssh-client python2 python3 usbmuxd usbutils + sudo apt install -y autoconf automake binutils bsdiff build-essential checkinstall curl git libimobiledevice-utils libplist3 libreadline-dev libtool-bin libusb-1.0-0-dev libusbmuxd6 libusbmuxd-tools libzip5 openssh-client python2 usbmuxd usbutils SavePkg ar x libcurl3.deb data.tar.xz tar xf data.tar.xz @@ -451,7 +467,7 @@ function InstallDependencies { sudo ln -sf /usr/lib/x86_64-linux-gnu/libusbmuxd.so.6 /usr/local/lib/libusbmuxd-2.0.so.6 elif [[ $ID == "fedora" ]]; then - sudo dnf install -y automake bsdiff git libimobiledevice-utils libpng12 libtool libusb-devel libusbmuxd-utils libzip make perl-Digest-SHA python2 python readline-devel + sudo dnf install -y automake bsdiff git libimobiledevice-utils libpng12 libtool libusb-devel libusbmuxd-utils libzip make perl-Digest-SHA python2 readline-devel SavePkg rpm2cpio openssl-1.0.0.rpm | cpio -idmv sudo cp usr/lib64/libcrypto.so.1.0.0 usr/lib64/libssl.so.1.0.0 /usr/lib64 @@ -462,22 +478,20 @@ function InstallDependencies { elif [[ $OSTYPE == "darwin"* ]]; then # macOS - if [[ ! $(which brew) ]]; then - Log "Homebrew is not detected/installed, installing Homebrew..." - /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" - fi - brew install --HEAD usbmuxd - brew install --HEAD libimobiledevice - brew install --HEAD libusbmuxd - brew install libzip lsusb python3 - brew install make automake autoconf libtool pkg-config gcc + curl -L https://github.com/libimobiledevice-win32/imobiledevice-net/releases/download/v1.3.4/libimobiledevice.1.2.1-r1079-osx-x64.zip -o libimobiledevice.zip + rm -rf ../resources/libimobiledevice + mkdir ../resources/libimobiledevice + unzip libimobiledevice.zip -d ../resources/libimobiledevice + chmod +x ../resources/libimobiledevice/* else Error "Distro not detected/supported by the install script." "See the repo README for supported OS versions/distros" fi - Compile libimobiledevice libirecovery - [[ $platform == linux ]] && sudo cp ../resources/lib/* /usr/local/lib + if [[ $platform == linux ]]; then + Compile libimobiledevice libirecovery + sudo cp ../resources/lib/* /usr/local/lib + fi Log "Install script done! Please run the script again to proceed" exit