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")