diff --git a/README.md b/README.md index f812bd0..4b7f1a4 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,7 @@ - [Identify your device here](https://ipsw.me/device-finder) - **iPhone 5C and iPad mini 3 devices are NOT supported!** - iPhone 5C can still be restored to versions that you have SHSH blobs for + - iPhone 4 devices also support restoring with SHSH blobs (iOS 5 and newer only) diff --git a/resources/blobs.sh b/resources/blobs.sh index 2be3e56..2448bd2 100755 --- a/resources/blobs.sh +++ b/resources/blobs.sh @@ -30,7 +30,7 @@ SaveOTABlobs() { Log "Saving iOS $OSVer blobs with tsschecker..." BuildManifest="resources/manifests/BuildManifest_${ProductType}_${OSVer}.plist" - ExtraArgs="-d $ProductType -i $OSVer -e $UniqueChipID -m $BuildManifest -o -s -B ${HWModel}ap --generator 0x1111111111111111 --no-baseband" + ExtraArgs="-d $ProductType -i $OSVer -e $UniqueChipID -m $BuildManifest -o -s -B ${HWModel}ap -g 0x1111111111111111 -b" SHSHChk=${UniqueChipID}_${ProductType}_${HWModel}ap_${OSVer}-${BuildVer}_3a88b7c3802f2f0510abc432104a15ebd8bd7154.shsh* $tsschecker $ExtraArgs @@ -41,7 +41,7 @@ SaveOTABlobs() { "It is also possible that $OSVer for $ProductType is no longer signed" elif [[ ! -e $SHSH ]]; then - Log "Saving $OSVer blobs failed, but found existing saved SHSH blobs. Continuing..." + Log "Saving $OSVer blobs failed, but found existing saved SHSH blobs." cp $SHSHExisting . SHSH=$(ls $SHSHChk) SHSHContinue=1 diff --git a/resources/depends.sh b/resources/depends.sh index ec9bfa3..6631b8f 100755 --- a/resources/depends.sh +++ b/resources/depends.sh @@ -44,11 +44,12 @@ SetToolPaths() { ideviceenterrecovery="$MPath/ideviceenterrecovery" ideviceinfo="$MPath/ideviceinfo" iproxy="$MPath/iproxy" - ipsw="./tools/ipsw_$platform" + ipsw="../resources/tools/ipsw_$platform" ipwndfu="$python ipwndfu" irecoverychk="$MPath/irecovery" irecovery="$irecoverychk" partialzip="./resources/tools/partialzip_$platform" + ping="ping -c1" rmsigchks="$python rmsigchks.py" SimpleHTTPServer="$python -m SimpleHTTPServer 8888" SSH="-F ./resources/ssh_config" @@ -78,7 +79,6 @@ SetToolPaths() { SaveExternal() { local ExternalURL="https://github.com/$1/$2.git" local External=$2 - [[ $2 == "iOS-OTA-Downgrader-Keys" ]] && External="firmware" cd resources if [[ ! -d $External || ! -d $External/.git ]]; then Log "Downloading $External..." @@ -150,7 +150,7 @@ InstallDepends() { elif [[ $platform == "macos" ]]; then xcode-select --install - libimobiledevice=("https://github.com/libimobiledevice-win32/imobiledevice-net/releases/download/v1.3.14/libimobiledevice.1.2.1-r1116-osx-x64.zip" "328e809dea350ae68fb644225bbf8469c0f0634b") + libimobiledevice=("https://github.com/LukeZGD/iOS-OTA-Downgrader-Keys/releases/download/tools/libimobiledevice_macos.zip" "66a49e4f69757a3d9dc51109a8e4651020bfacb8") Echo "* iOS-OTA-Downgrader provides a copy of libimobiledevice and libirecovery by default" Echo "* In case that problems occur, try installing them from Homebrew" Echo "* The script will detect this automatically and will use the Homebrew versions of the tools" diff --git a/resources/device.sh b/resources/device.sh index a62de8e..21e6ee0 100755 --- a/resources/device.sh +++ b/resources/device.sh @@ -5,8 +5,12 @@ FindDevice() { local i=0 local Timeout=999 local USB - [[ $1 == "DFU" ]] && USB=1227 || USB=1281 - [[ -n $2 ]] && Timeout=3 + if [[ $1 == "DFU" ]]; then + USB=1227 + elif [[ $1 == "Recovery" ]]; then + USB=1281 + fi + [[ -n $2 ]] && Timeout=5 Log "Finding device in $1 mode..." while (( i < Timeout )); do @@ -92,7 +96,7 @@ GetDeviceValues() { BasebandSHA1="e6f54acc5d5652d39a0ef9af5589681df39e0aca" LatestVer="9.3.5" - elif [[ $ProductType == "iPad2,3" ]]; then + elif [[ $ProductType == "iPad2,3" || $ProductType == "iPhone3,3" ]]; then Baseband="Phoenix-3.6.03.Release.bbfw" BasebandSHA1="8d4efb2214344ea8e7c9305392068ab0a7168ba4" @@ -114,22 +118,34 @@ GetDeviceValues() { Baseband="Mav5-11.80.00.Release.bbfw" BasebandSHA1="8951cf09f16029c5c0533e951eb4c06609d0ba7f" LatestVer="10.3.4" - + elif [[ $ProductType == "iPad4,2" || $ProductType == "iPad4,3" || $ProductType == "iPad4,5" || - $ProductType == "iPhone6,1" || $ProductType == "iPhone6,2" || - $ProductType == "iPhone5,3" || $ProductType == "iPhone5,4" ]]; then + $ProductType == "iPhone5"* || $ProductType == "iPhone6"* ]]; then BasebandURL=$(cat $Firmware/14G60/url) Baseband="Mav7Mav8-7.60.00.Release.bbfw" BasebandSHA1="f397724367f6bed459cf8f3d523553c13e8ae12c" - - elif [[ $ProductType != "iPad2"* && $ProductType != "iPad3"* && $ProductType != "iPad4,1" && - $ProductType != "iPad4,4" && $ProductType != "iPod5,1" ]]; then - Error "Your device $ProductType ${version}is not supported." - else + if [[ $ProductType == "iPhone5"* ]]; then + Log "iPhone 5C detected. Your device does not support OTA downgrades." + Echo "* Functions will be limited to entering kDFU and restoring with blobs." + fi + + elif [[ $ProductType == "iPhone3"* ]]; then + BasebandURL=$(cat $Firmware/11D257/url) + Baseband="ICE3_04.12.09_BOOT_02.13.Release.bbfw" + BasebandSHA1="007365a5655ac2f9fbd1e5b6dba8f4be0513e364" + + elif [[ $ProductType == "iPad2"* || $ProductType == "iPad3"* || $ProductType == "iPad4,1" || + $ProductType == "iPad4,4" || $ProductType == "iPod5,1" ]]; then BasebandURL=0 + else + Error "Your device $ProductType ${version}is not supported." fi - if [[ $ProductType == "iPad2"* || $ProductType == "iPad3,1" || $ProductType == "iPad3,2" || + if [[ $ProductType == "iPhone3"* ]]; then + DeviceProc=4 + Log "$ProductType detected. Your device does not support OTA downgrades." + Echo "* Functions will be limited to entering kDFU and restoring with blobs." + elif [[ $ProductType == "iPad2"* || $ProductType == "iPad3,1" || $ProductType == "iPad3,2" || $ProductType == "iPad3,3" || $ProductType == "iPhone4,1" || $ProductType == "iPod5,1" ]]; then DeviceProc=5 elif [[ $ProductType == "iPhone5"* || $ProductType == "iPad3"* ]]; then @@ -148,7 +164,7 @@ GetDeviceValues() { if [[ $ProductType == "iPod5,1" ]]; then iBSS="${HWModel}ap" iBSSBuildVer="10B329" - elif [[ $ProductType == "iPad3,1" ]]; then + elif [[ $ProductType == "iPad3,1" || $ProductType == "iPhone3"* ]]; then iBSS="${HWModel}ap" iBSSBuildVer="11D257" elif [[ $ProductType == "iPhone6"* ]]; then @@ -169,23 +185,22 @@ GetDeviceValues() { Log "ECID: $UniqueChipID" } -CheckM8() { +EnterPwnDFU() { local pwnDFUTool local pwnDFUDevice local pwnD=1 if [[ $platform == "macos" ]]; then - Selection=("iPwnder32" "ipwnder_lite") + Selection=("ipwnder_lite" "iPwnder32") Input "PwnDFU Tool Option" Echo "* This option selects what tool to use to put your device in pwnDFU mode." - Echo "* If unsure, select 1 for Intel Macs, select 2 for Apple Silicon (M1) Macs." - Echo "* This option is set to iPwnder32 by default (1)." + Echo "* If unsure, select 1. Select 2 if 1 does not work." + Echo "* This option is set to ${Selection[0]} by default (1)." Input "Select your option:" select opt in "${Selection[@]}"; do case $opt in "ipwnder_lite" ) pwnDFUTool="$ipwnder_lite"; break;; - "ipwndfu" ) pwnDFUTool="ipwndfu"; break;; - * ) pwnDFUTool="$ipwnder32"; break;; + "iPwnder32" ) pwnDFUTool="$ipwnder32"; break;; esac done else @@ -197,21 +212,21 @@ CheckM8() { cd resources/ipwndfu Echo "* Enter your user password when prompted" $ipwndfu -p - if [[ $DeviceProc == 7 ]]; then + pwnDFUDevice=$? + if [[ $DeviceProc == 7 ]]; then Log "Running rmsigchks.py..." $rmsigchks pwnDFUDevice=$? - cd ../.. else - cd ../.. - kDFU iBSS || echo - pwnDFUDevice=$? + SendiBSS=1 fi + cd ../.. else $pwnDFUTool -p pwnDFUDevice=$? fi [[ $DeviceProc == 7 ]] && pwnD=$($irecovery -q | grep -c "PWND") + [[ $DeviceProc == 4 ]] && SendiBSS=1 if [[ $pwnDFUDevice != 0 && $pwnD != 1 ]]; then echo -e "\n${Color_R}[Error] Failed to enter pwnDFU mode. Please run the script again ${Color_N}" @@ -246,8 +261,8 @@ Recovery() { exit 0 fi - Echo "* Hold TOP and HOME buttons for 8 seconds." - for i in {08..01}; do + Echo "* Hold TOP and HOME buttons for 10 seconds." + for i in {10..01}; do echo -n "$i " sleep 1 done @@ -259,7 +274,7 @@ Recovery() { echo FindDevice "DFU" error - CheckM8 + EnterPwnDFU } RecoveryExit() { @@ -275,6 +290,17 @@ kDFU() { local kloader local VerDetect=$(echo $ProductVer | cut -c 1) + if [[ $DeviceState != "Normal" ]]; then + Log "Device is already in $DeviceState mode" + return + fi + + if [[ $iBSSBuildVer == $BuildVer && -e "$IPSW.ipsw" ]]; then + Log "Extracting iBSS from IPSW..." + mkdir -p saved/$ProductType 2>/dev/null + unzip -o -j $IPSW.ipsw Firmware/dfu/$iBSS.dfu -d saved/$ProductType + fi + if [[ ! -e saved/$ProductType/$iBSS.dfu ]]; then Log "Downloading iBSS..." $partialzip "$(cat $Firmware/$iBSSBuildVer/url)" Firmware/dfu/$iBSS.dfu $iBSS.dfu @@ -288,22 +314,7 @@ kDFU() { Log "Patching iBSS..." $bspatch saved/$ProductType/$iBSS.dfu tmp/pwnediBSS resources/patches/$iBSS.patch - - if [[ $1 == iBSS ]]; then - cd resources/ipwndfu - if [[ $platform == "macos" ]]; then - Echo "* Attempting to send pwned iBSS." - Echo "* This will fail on Apple Silicon Macs, as well as on macOS 12.3 and later." - Echo "* If this is the case, you need to send pwned iBSS yourself before continuing." - Echo "* For more details, read the \"Troubleshooting\" wiki page in GitHub" - fi - Log "Sending iBSS..." - $ipwndfu -l ../../tmp/pwnediBSS - local ret=$? - cd ../.. - return $ret - fi - + [[ $VerDetect == 1 ]] && kloader="kloader_hgsp" [[ $VerDetect == 5 ]] && kloader="kloader5" [[ ! $kloader ]] && kloader="kloader" diff --git a/resources/downgrade.sh b/resources/downgrade.sh index d0741ae..6bcaf30 100755 --- a/resources/downgrade.sh +++ b/resources/downgrade.sh @@ -32,91 +32,8 @@ FRBaseband() { fi } -Downgrade() { +FutureRestore() { local ExtraArgs=("--use-pwndfu") - local IPSWExtract - Verify=1 - - Log "Select your options when asked. If unsure, go for the defaults (press Enter/Return)." - echo - - if [[ $OSVer == "Other" ]]; then - Input "Select your IPSW file in the file selection window." - IPSW="$($zenity --file-selection --file-filter='IPSW | *.ipsw' --title="Select IPSW file")" - [[ ! -s "$IPSW" ]] && Error "No IPSW selected, or IPSW file not found." - IPSW="${IPSW%?????}" - Log "Selected IPSW file: $IPSW.ipsw" - Input "Select your SHSH file in the file selection window." - SHSH="$($zenity --file-selection --file-filter='SHSH | *.shsh *.shsh2' --title="Select SHSH file")" - [[ ! -s "$SHSH" ]] && Error "No SHSH selected, or SHSH file not found." - Log "Selected SHSH file: $SHSH" - - unzip -o -j "$IPSW.ipsw" Restore.plist -d tmp - BuildVer=$(cat tmp/Restore.plist | grep -i ProductBuildVersion -A 1 | grep -oPm1 "(?<=)[^<]+") - Log "Getting firmware keys for $ProductType-$BuildVer" - mkdir resources/firmware/$ProductType/$BuildVer 2>/dev/null - curl -L https://github.com/LukeZGD/iOS-OTA-Downgrader-Keys/raw/master/$ProductType/$BuildVer/index.html -o tmp/index.html - mv tmp/index.html resources/firmware/$ProductType/$BuildVer - - elif [[ $DeviceProc != 7 ]]; then - Input "Jailbreak Option" - Echo "* When this option is enabled, your device will be jailbroken on restore." - if [[ $ProductType == "iPad2,5" || $ProductType == "iPad2,6" || $ProductType == "iPad2,7" ]]; then - Echo "* Based on some reported issues, Jailbreak Option might be broken for iPad mini 1 devices." - Echo "* I recommend to disable the option for these devices and sideload EtasonJB, HomeDepot, or daibutsu manually." - fi - Echo "* This option is enabled by default (Y)." - read -p "$(Input 'Enable this option? (Y/n):')" Jailbreak - - if [[ $Jailbreak != 'N' && $Jailbreak != 'n' ]]; then - JailbreakSet - Log "Jailbreak option enabled." - else - Log "Jailbreak option disabled by user." - fi - echo - fi - - if [[ $OSVer != "Other" ]]; then - [[ -z $IPSWCustom ]] && IPSWCustom="${IPSWType}_${OSVer}_${BuildVer}_Custom" - - MemoryOption - SaveOTABlobs - IPSWFind - - if [[ $Verify == 1 ]]; then - IPSWVerify - elif [[ -e "$IPSWCustom.ipsw" ]]; then - Log "Found existing Custom IPSW. Skipping IPSW verification." - Log "Setting restore IPSW to: $IPSWCustom.ipsw" - IPSWRestore=$IPSWCustom - fi - - if [[ $DeviceState == "Normal" && $iBSSBuildVer == $BuildVer && -e "$IPSW.ipsw" ]]; then - Log "Extracting iBSS from IPSW..." - mkdir -p saved/$ProductType 2>/dev/null - unzip -o -j $IPSW.ipsw Firmware/dfu/$iBSS.dfu -d saved/$ProductType - fi - else - IPSWCustom=0 - fi - - [[ $DeviceState == "Normal" ]] && kDFU - - if [[ $Jailbreak == 1 ]]; then - IPSW32 - IPSWExtract="$IPSWCustom" - else - IPSWExtract="$IPSW" - fi - - Log "Extracting IPSW: $IPSWExtract.ipsw" - unzip -oq "$IPSWExtract.ipsw" -d "$IPSWExtract"/ - - if [[ ! $IPSWRestore ]]; then - Log "Setting restore IPSW to: $IPSW.ipsw" - IPSWRestore="$IPSW" - fi Log "Proceeding to futurerestore..." [[ $platform == "linux" ]] && Echo "* Enter your user password when prompted" @@ -130,7 +47,7 @@ Downgrade() { $irecovery -f README.md sleep 2 ExtraArgs+=("-s" "$IPSWRestore/Firmware/all_flash/$SEP" "-m" "$BuildManifest") - else + elif [[ $SendiBSS != 1 ]]; then ExtraArgs+=("--no-ibss") fi @@ -159,3 +76,48 @@ Downgrade() { fi Log "Downgrade script done!" } + +DowngradeOther() { + Input "Select your IPSW file in the file selection window." + IPSW="$($zenity --file-selection --file-filter='IPSW | *.ipsw' --title="Select IPSW file")" + [[ ! -s "$IPSW" ]] && Error "No IPSW selected, or IPSW file not found." + IPSW="${IPSW%?????}" + Log "Selected IPSW file: $IPSW.ipsw" + Input "Select your SHSH file in the file selection window." + SHSH="$($zenity --file-selection --file-filter='SHSH | *.shsh *.shsh2' --title="Select SHSH file")" + [[ ! -s "$SHSH" ]] && Error "No SHSH selected, or SHSH file not found." + Log "Selected SHSH file: $SHSH" + + if [[ ! -e resources/firmware/$ProductType/$BuildVer/index.html ]]; then + unzip -o -j "$IPSW.ipsw" Restore.plist -d tmp + BuildVer=$(cat tmp/Restore.plist | grep -i ProductBuildVersion -A 1 | grep -oPm1 "(?<=)[^<]+") + Log "Getting firmware keys for $ProductType-$BuildVer" + mkdir -p resources/firmware/$ProductType/$BuildVer 2>/dev/null + curl -L https://github.com/LukeZGD/iOS-OTA-Downgrader-Keys/raw/master/$ProductType/$BuildVer/index.html -o tmp/index.html + mv tmp/index.html resources/firmware/$ProductType/$BuildVer + fi + + kDFU + IPSWSetExtract + FutureRestore +} + +DowngradeOTA() { + [[ $DeviceProc != 7 ]] && JailbreakOption + SaveOTABlobs + IPSWFindVerify + kDFU + [[ $Jailbreak == 1 ]] && IPSW32 + IPSWSetExtract + FutureRestore +} + +Downgrade() { + Log "Select your options when asked. If unsure, go for the defaults (press Enter/Return)." + echo + if [[ $OSVer == "Other" ]]; then + DowngradeOther + return + fi + DowngradeOTA +} diff --git a/resources/firmware/iPhone3,1/11D257/url b/resources/firmware/iPhone3,1/11D257/url new file mode 100644 index 0000000..c60d356 --- /dev/null +++ b/resources/firmware/iPhone3,1/11D257/url @@ -0,0 +1 @@ +http://appldnld.apple.com/iOS7.1/031-4812.20140627.cq6y8/iPhone3,1_7.1.2_11D257_Restore.ipsw \ No newline at end of file diff --git a/resources/firmware/iPhone3,1/hwmodel b/resources/firmware/iPhone3,1/hwmodel new file mode 100644 index 0000000..ba3496e --- /dev/null +++ b/resources/firmware/iPhone3,1/hwmodel @@ -0,0 +1 @@ +n90 diff --git a/resources/firmware/iPhone3,2/11D257/url b/resources/firmware/iPhone3,2/11D257/url new file mode 100644 index 0000000..ae7dd7e --- /dev/null +++ b/resources/firmware/iPhone3,2/11D257/url @@ -0,0 +1 @@ +http://appldnld.apple.com/iOS7.1/031-4785.20140627.zZ42j/iPhone3,2_7.1.2_11D257_Restore.ipsw diff --git a/resources/firmware/iPhone3,2/hwmodel b/resources/firmware/iPhone3,2/hwmodel new file mode 100644 index 0000000..0424ef5 --- /dev/null +++ b/resources/firmware/iPhone3,2/hwmodel @@ -0,0 +1 @@ +n90b diff --git a/resources/firmware/iPhone3,3/11D257/url b/resources/firmware/iPhone3,3/11D257/url new file mode 100644 index 0000000..032eaa7 --- /dev/null +++ b/resources/firmware/iPhone3,3/11D257/url @@ -0,0 +1 @@ +http://appldnld.apple.com/iOS7.1/031-4768.20140627.DXmmp/iPhone3,3_7.1.2_11D257_Restore.ipsw diff --git a/resources/firmware/iPhone3,3/13G37/url b/resources/firmware/iPhone3,3/13G37/url new file mode 100644 index 0000000..a33881f --- /dev/null +++ b/resources/firmware/iPhone3,3/13G37/url @@ -0,0 +1 @@ +http://updates-http.cdn-apple.com/2019/ios/041-80042-20190722-68F07B91-8EA1-4A3B-A930-35314A006ECB/iPad2,3_9.3.6_13G37_Restore.ipsw \ No newline at end of file diff --git a/resources/firmware/iPhone3,3/hwmodel b/resources/firmware/iPhone3,3/hwmodel new file mode 100644 index 0000000..70e9103 --- /dev/null +++ b/resources/firmware/iPhone3,3/hwmodel @@ -0,0 +1 @@ +n92 diff --git a/resources/ipsw.sh b/resources/ipsw.sh index eca3018..72a5b20 100755 --- a/resources/ipsw.sh +++ b/resources/ipsw.sh @@ -3,7 +3,6 @@ JailbreakSet() { Jailbreak=1 IPSWCustom="${IPSWType}_${OSVer}_${BuildVer}_Custom" - [[ -e "$IPSWCustom.ipsw" ]] && Verify= if [[ $ProductType == "iPhone4,1" || $ProductType == "iPhone5,2" ]] && [[ $OSVer == "8.4.1" ]]; then Input "Jailbreak Tool Option" @@ -34,40 +33,68 @@ JailbreakSet() { Log "Using $JBName for the jailbreak" } -MemoryOption() { - if [[ $Jailbreak == 1 && $Verify == 1 ]]; then - Input "Memory Option for creating custom IPSW" - Echo "* This option makes creating the custom IPSW faster, but it requires at least 8GB of RAM." - Echo "* If you do not have enough RAM, disable this option and make sure that you have enough storage space." - Echo "* This option is enabled by default (Y)." - read -p "$(Input 'Enable this option? (Y/n):')" JBMemory - if [[ $JBMemory == 'N' || $JBMemory == 'n' ]]; then - Log "Memory option disabled by user." - else - Log "Memory option enabled." - fi - echo +JailbreakOption() { + Input "Jailbreak Option" + Echo "* When this option is enabled, your device will be jailbroken on restore." + if [[ $ProductType == "iPad2,5" || $ProductType == "iPad2,6" || $ProductType == "iPad2,7" ]]; then + Echo "* Based on some reported issues, Jailbreak Option might be broken for iPad mini 1 devices." + Echo "* I recommend to disable the option for these devices and sideload EtasonJB, HomeDepot, or daibutsu manually." fi + Echo "* This option is enabled by default (Y)." + read -p "$(Input 'Enable this option? (Y/n):')" Jailbreak + if [[ $Jailbreak != 'N' && $Jailbreak != 'n' ]]; then + JailbreakSet + Log "Jailbreak option enabled." + else + Log "Jailbreak option disabled by user." + fi + + [[ -z $IPSWCustom ]] && IPSWCustom="${IPSWType}_${OSVer}_${BuildVer}_Custom" + echo + + if [[ $Jailbreak != 1 ]]; then + return + fi + Input "Memory Option for creating custom IPSW" + Echo "* This option makes creating the custom IPSW faster, but it requires at least 8GB of RAM." + Echo "* If you do not have enough RAM, disable this option and make sure that you have enough storage space." + Echo "* This option is enabled by default (Y)." + read -p "$(Input 'Enable this option? (Y/n):')" JBMemory + if [[ $JBMemory == 'N' || $JBMemory == 'n' ]]; then + Log "Memory option disabled by user." + JBMemory= + else + Log "Memory option enabled." + JBMemory="-memory" + fi + echo } -IPSWFind() { +IPSWFindVerify() { IPSW="${IPSWType}_${OSVer}_${BuildVer}_Restore" - if [[ ! -e "$IPSW.ipsw" && $Verify == 1 ]]; then - Log "iOS $OSVer IPSW for $ProductType cannot be found." + local IPSWDL=$IPSW + local OSVerDL=$OSVer + local BuildVerDL=$BuildVer + + if [[ -e "$IPSWCustom.ipsw" ]]; then + Log "Found existing Custom IPSW. Skipping $OSVerDL IPSW verification." + return + fi + + if [[ ! -e "$IPSW.ipsw" ]]; then + Log "iOS $OSVerDL IPSW for $ProductType cannot be found." Echo "* If you already downloaded the IPSW, move/copy it to the directory where the script is located." Echo "* Do NOT rename the IPSW as the script will fail to detect it." - Echo "* The script will now proceed to download it for you. If you want to download it yourself, here is the link: $(cat $Firmware/$BuildVer/url)" + Echo "* The script will now proceed to download it for you. If you want to download it yourself, here is the link: $(cat $Firmware/$BuildVerDL/url)" Log "Downloading IPSW... (Press Ctrl+C to cancel)" - curl -L $(cat $Firmware/$BuildVer/url) -o tmp/$IPSW.ipsw - mv tmp/$IPSW.ipsw . + curl -L $(cat $Firmware/$BuildVerDL/url) -o tmp/$IPSWDL.ipsw + mv tmp/$IPSWDL.ipsw . fi -} -IPSWVerify() { - Log "Verifying IPSW..." - IPSWSHA1=$(cat $Firmware/$BuildVer/sha1sum) + Log "Verifying $IPSWDL.ipsw..." + IPSWSHA1=$(cat $Firmware/$BuildVerDL/sha1sum) Log "Expected SHA1sum: $IPSWSHA1" - IPSWSHA1L=$(shasum $IPSW.ipsw | awk '{print $1}') + IPSWSHA1L=$(shasum $IPSWDL.ipsw | awk '{print $1}') Log "Actual SHA1sum: $IPSWSHA1L" if [[ $IPSWSHA1L != $IPSWSHA1 ]]; then Error "Verifying IPSW failed. Your IPSW may be corrupted or incomplete. Delete/replace the IPSW and run the script again" \ @@ -76,13 +103,27 @@ IPSWVerify() { Log "IPSW SHA1sum matches." } +IPSWSetExtract() { + if [[ -e "$IPSWCustom.ipsw" ]]; then + Log "Setting restore IPSW to: $IPSWCustom.ipsw" + IPSWRestore="$IPSWCustom" + elif [[ -z $IPSWRestore ]]; then + Log "Setting restore IPSW to: $IPSW.ipsw" + IPSWRestore="$IPSW" + fi + + Log "Extracting IPSW: $IPSWRestore.ipsw" + unzip -oq "$IPSWRestore.ipsw" -d "$IPSWRestore"/ +} + IPSW32() { local Bundle="Down_${ProductType}_${OSVer}_${BuildVer}.bundle" local ExtraArgs local JBFiles + local JBFiles2 local JBSHA1 - if [[ $IPSWRestore == $IPSWCustom ]]; then + if [[ -e $IPSWCustom.ipsw ]]; then Log "Found existing Custom IPSW. Skipping IPSW creation." return fi @@ -96,6 +137,7 @@ IPSW32() { JBFiles2=("bin.tar" "cydia.tar" "untether.tar") JBSHA1=("98034227c68610f4c7dd48ca9e622314a1e649e7" "2e9e662afe890e50ccf06d05429ca12ce2c0a3a3" "f88ec9a1b3011c4065733249363e9850af5f57c8") cd tmp + mkdir jailbreak for i in {0..2}; do local URL="https://github.com/dora2-iOS/daibutsuCFW/raw/main/build/src/" (( i > 0 )) && URL+="daibutsu/${JBFiles2[$i]}" || URL+="${JBFiles2[$i]}" @@ -104,7 +146,7 @@ IPSW32() { SaveFile $URL ${JBFiles2[$i]} ${JBSHA1[$i]} mv ${JBFiles2[$i]} ../resources/jailbreak fi - JBFiles2[$i]=jailbreak/${JBFiles2[$i]} + cp ../resources/jailbreak/${JBFiles2[$i]} jailbreak/ done cd .. @@ -112,13 +154,11 @@ IPSW32() { if [[ $OSVer == "8.4.1" ]]; then JBFiles=("fstab.tar" "etasonJB-untether.tar" "Cydia8.tar") JBSHA1="6459dbcbfe871056e6244d23b33c9b99aaeca970" - ExtraArgs+="-s 2305 " + ExtraArgs+="-s 2305" elif [[ $OSVer == "6.1.3" ]]; then JBFiles=("fstab_rw.tar" "p0sixspwn.tar" "Cydia6.tar") JBSHA1="1d5a351016d2546aa9558bc86ce39186054dc281" - ExtraArgs+="-s 1260 " - else - Error "No OSVer selected?" + ExtraArgs+="-s 1260" fi if [[ ! -e resources/jailbreak/${JBFiles[2]} ]]; then cd tmp @@ -128,29 +168,25 @@ IPSW32() { cd .. fi for i in {0..2}; do - JBFiles[$i]=jailbreak/${JBFiles[$i]} + JBFiles[$i]=../resources/jailbreak/${JBFiles[$i]} done fi ExtraArgs+="-bbupdate" if [[ ! -e $IPSWCustom.ipsw ]]; then - [[ $JBMemory != 'N' && $JBMemory != 'n' ]] && ExtraArgs+=" -memory" Log "Preparing custom IPSW..." - cd resources - rm -rf FirmwareBundles - if [[ $JBDaibutsu == 1 && -d firmware/JailbreakBundles/$Bundle ]]; then - cp -R firmware/JailbreakBundles FirmwareBundles + cd tmp + if [[ $JBDaibutsu == 1 ]]; then + cp -R ../resources/firmware/JailbreakBundles FirmwareBundles else - cp -R firmware/FirmwareBundles FirmwareBundles + cp -R ../resources/firmware/FirmwareBundles FirmwareBundles fi - $ipsw ./../$IPSW.ipsw ./../$IPSWCustom.ipsw $ExtraArgs ${JBFiles[@]} + $ipsw ./../$IPSW.ipsw ./../$IPSWCustom.ipsw $ExtraArgs $JBMemory ${JBFiles[@]} cd .. fi + if [[ ! -e $IPSWCustom.ipsw ]]; then Error "Failed to find custom IPSW. Please run the script again" \ "You may try selecting N for memory option" fi - - Log "Setting restore IPSW to: $IPSWCustom.ipsw" - IPSWRestore=$IPSWCustom } diff --git a/resources/patches/iBSS.n90ap.RELEASE.patch b/resources/patches/iBSS.n90ap.RELEASE.patch new file mode 100644 index 0000000..695e195 Binary files /dev/null and b/resources/patches/iBSS.n90ap.RELEASE.patch differ diff --git a/resources/patches/iBSS.n90bap.RELEASE.patch b/resources/patches/iBSS.n90bap.RELEASE.patch new file mode 100644 index 0000000..366c0e9 Binary files /dev/null and b/resources/patches/iBSS.n90bap.RELEASE.patch differ diff --git a/resources/patches/iBSS.n92ap.RELEASE.patch b/resources/patches/iBSS.n92ap.RELEASE.patch new file mode 100644 index 0000000..a1eed3b Binary files /dev/null and b/resources/patches/iBSS.n92ap.RELEASE.patch differ diff --git a/restore.sh b/restore.sh index 7b6796f..24ae5ea 100755 --- a/restore.sh +++ b/restore.sh @@ -75,7 +75,7 @@ Main() { fi Log "Checking Internet connection..." - ping -c1 8.8.8.8 >/dev/null + $ping 8.8.8.8 >/dev/null if [[ $? != 0 ]]; then Error "Please check your Internet connection before proceeding." fi @@ -106,11 +106,13 @@ Main() { Mode="$1" else [[ $1 != "NoDevice" ]] && Selection+=("Downgrade Device") - Selection+=("Save OTA Blobs") + [[ $DeviceProc != 4 ]] && Selection+=("Save OTA Blobs") + if [[ $DeviceProc != 7 ]]; then - Selection+=("Create Custom IPSW") + [[ $DeviceProc != 4 ]] && Selection+=("Create Custom IPSW") [[ $DeviceState == "Normal" ]] && Selection+=("Put Device in kDFU Mode") fi + Selection+=("(Re-)Install Dependencies" "(Any other key to exit)") Echo "*** Main Menu ***" Input "Select an option:" @@ -129,18 +131,18 @@ Main() { SelectVersion if [[ $Mode == "IPSW32" ]]; then - Verify=1 echo - JailbreakSet - MemoryOption - IPSWFind - if [[ $Verify == 1 ]]; then - IPSWVerify - elif [[ -e "$IPSWCustom.ipsw" ]]; then + JailbreakOption + if [[ -e "$IPSWCustom.ipsw" ]]; then Log "Found existing Custom IPSW, stopping here." Echo "* If you want to re-create the custom IPSW, move/delete the existing one first." exit 0 + elif [[ $Jailbreak != 1 ]]; then + Log "Creating custom IPSW is not needed for non-jailbroken restores on your device." + exit 0 fi + + IPSWFindVerify IPSW32 Log "Custom IPSW has been created: $IPSWCustom.ipsw" Echo "* This custom IPSW has a jailbreak built in ($JBName)" @@ -161,9 +163,9 @@ Main() { elif [[ $DeviceState == "Recovery" ]]; then Recovery elif [[ $DeviceState == "DFU" ]]; then - CheckM8 + EnterPwnDFU fi - + elif [[ $DeviceState == "DFU" ]]; then if [[ $1 != "PwnedDevice" ]]; then echo -e "\n${Color_R}[Error] 32-bit A${DeviceProc} device detected in DFU mode. ${Color_N}" @@ -179,26 +181,25 @@ Main() { Echo "* If you do not know what you are doing, EXIT NOW by pressing Ctrl+C and restart your device in normal mode." Input "Select the mode that your device is currently in:" Selection=("kDFU mode") - [[ $DeviceProc == 5 ]] && Selection+=("pwnDFU mode (A5)") - [[ $DeviceProc == 6 ]] && Selection+=("DFU mode (A6)") + [[ $DeviceProc == 5 ]] && Selection+=("pwnDFU mode (A5)") || Selection+=("DFU mode (A6)") Selection+=("Any other key to exit") select opt in "${Selection[@]}"; do case $opt in "kDFU mode" ) break;; - "DFU mode (A6)" ) CheckM8; break;; + "DFU mode (A6)" ) EnterPwnDFU; break;; "pwnDFU mode (A5)" ) Echo "* Make sure that your device is in pwnDFU mode using an Arduino+USB Host Shield!"; Echo "* This option will not work if your device is not in pwnDFU mode."; Input "Press Enter/Return to continue (or press Ctrl+C to cancel)"; read -s; - kDFU iBSS; break;; + SendiBSS=1; break;; * ) exit 0;; esac done Log "Downgrading $ProductType in kDFU/pwnDFU mode..." elif [[ $DeviceState == "Recovery" ]]; then - if [[ $DeviceProc == 6 ]]; then + if [[ $DeviceProc == 4 || $DeviceProc == 6 ]]; then Recovery else Log "32-bit A${DeviceProc} device detected in recovery mode." @@ -222,7 +223,7 @@ SelectVersion() { return fi - if [[ $ProductType == "iPhone5,3" || $ProductType == "iPhone5,4" ]]; then + if [[ $ProductType == "iPhone5,3" || $ProductType == "iPhone5,4" || $ProductType == "iPhone3"* ]]; then Selection=() else Selection=("iOS 8.4.1")