@@ -410,6 +410,87 @@ extract() {
410410 cp -R " $cache " " $out "
411411}
412412
413+ download_apfs_sealvolume () {
414+ local src=" $1 "
415+ IOS_VERSION=" $( basename " $src " | awk -F_ ' {print $2}' ) "
416+ filename=" apfs_sealvolume_$IOS_VERSION "
417+
418+ PROJECT_DIR=" $( cd " $SCRIPT_DIR /.." && pwd) "
419+ TOOLS_PREFIX=" $PROJECT_DIR /.tools"
420+
421+ if [[ -f " $TOOLS_PREFIX /$filename " ]]; then
422+ echo " $filename already present"
423+ else
424+ echo " Downloading $filename "
425+ TMP_DIR=" $( mktemp -d) "
426+
427+ # List matching macOS version to the iOS version
428+ while IFS= read -r url; do
429+ bn=" $( basename " $url " ) "
430+ ver=" ${bn#* _} "
431+ ver=" ${ver%% _* } "
432+
433+ [[ " $ver " == " $IOS_VERSION " ]] || continue
434+
435+ selected_src=" $url "
436+ BUILD=" $( awk -F_ ' {print $3}' <<< " $bn" ) "
437+ break
438+ done < <(
439+ ipsw download appledb \
440+ --os macOS \
441+ --version $IOS_VERSION \
442+ --urls
443+ )
444+
445+ # Download BuildManifest first
446+ ipsw download appledb \
447+ --os macOS \
448+ --build $BUILD \
449+ --pattern " ^BuildManifest.plist\$ " \
450+ --output " $TMP_DIR "
451+
452+ BUILD_MANIFEST=" $( find " $TMP_DIR " -name BuildManifest.plist -print -quit) "
453+ if [ -z " $BUILD_MANIFEST " ]; then
454+ echo " Failed to locate BuildManifest.plist"
455+ rm -rf " $TMP_DIR "
456+ exit 1
457+ fi
458+
459+ RAMDISK_PATH=" $( /usr/bin/plutil -extract ' BuildIdentities.0.Manifest.RestoreRamDisk.Info.Path' raw -o - " $BUILD_MANIFEST " ) "
460+ if [ -z " $RAMDISK_PATH " ]; then
461+ echo " Failed to read RestoreRamDisk path from BuildManifest"
462+ rm -rf " $TMP_DIR "
463+ exit 1
464+ fi
465+
466+ # Download the ramdisk referenced by BuildManifest
467+ ipsw download appledb \
468+ --os macOS \
469+ --build $BUILD \
470+ --pattern " $RAMDISK_PATH " \
471+ --output " $TMP_DIR "
472+
473+ RAMDISK_IM4P=" $( find " $TMP_DIR " -path " *${RAMDISK_PATH} " -print -quit) "
474+ if [ -z " $RAMDISK_IM4P " ]; then
475+ echo " Failed to locate downloaded ramdisk: $RAMDISK_PATH "
476+ rm -rf " $TMP_DIR "
477+ exit 1
478+ fi
479+
480+ RAMDISK=" $TMP_DIR /ramdisk.dmg"
481+ ipsw img4 im4p extract --output " $RAMDISK " " $RAMDISK_IM4P "
482+
483+ MOUNT=$( hdiutil attach -readonly -nobrowse " $RAMDISK " | awk ' END{ print$NF}' )
484+ cp " $MOUNT /System/Library/Filesystems/apfs.fs/Contents/Resources/apfs_sealvolume" \
485+ " $TOOLS_PREFIX /$filename "
486+ hdiutil detach " $MOUNT " > /dev/null 2>&1 || true
487+ rm -rf " $TMP_DIR "
488+ echo " Downloaded: $TOOLS_PREFIX /$filename "
489+ echo " Resigning $filename "
490+ codesign --force --sign - " $TOOLS_PREFIX /$filename "
491+ fi
492+ }
493+
413494LIST_FIRMWARES=" ${LIST_FIRMWARES:- 0} "
414495IPHONE_DEVICE=" ${IPHONE_DEVICE:- $DEFAULT_IPHONE_DEVICE } "
415496IPHONE_VERSION=" ${IPHONE_VERSION:- } "
@@ -537,6 +618,13 @@ echo ""
537618fetch " $IPHONE_SOURCE " " $IPHONE_IPSW_PATH "
538619fetch " $CLOUDOS_SOURCE " " $CLOUDOS_IPSW_PATH "
539620
621+ VARIANT=" ${VARIANT:- } "
622+ if [[ " $VARIANT " == " less" ]]; then
623+ download_apfs_sealvolume " $IPHONE_SOURCE "
624+ else
625+ echo " ==> Downloading apfs sealvolume (skipped — patchless variant only)"
626+ fi
627+
540628IPHONE_CACHE=" ${IPSW_DIR} /${IPHONE_DIR} "
541629CLOUDOS_CACHE=" ${IPSW_DIR} /${CLOUDOS_DIR} "
542630
0 commit comments