futurerestoreで"libc++abi.dylib: terminating with uncaught exception of type libipatcher::exception: std::exception"が出たときの対処法

先日 iPod touch 5g のダウングレードを行うために futurerestore を用いて iOS 6.1.3 の復元を試みたところ、タイトルにあるようなエラーが出力されて止まってしまった。

調べてみると、どうやら ipsw.me が提供している復号化キーに復元対象のデバイス/バージョンが含まれていないと、このエラーが表示されるようで自前で復号化キーを用意すれば解決するらしい。

必要なもの
  • 復元先の ipsw
  • Firmware Keys
  • xpwntool
手順

復号化キーの雛形を入手する。もし iPod touch 5g, iOS 6.1.3 に復元するならば以下のファイルがそのまま使える。他のデバイス/バージョンの場合は次の手順により復号化キーなどを書き換える。
drive.google.com

ダウンロードした index.html に対してまず以下を書き換える。

   "identifier":"<復元するモデルのID>",
   "buildid":"<復元先バージョンのBuild ID>",
   "codename":"<復元先バージョンのコードネーム>",
   "baseband":"0",

iPod touch は baseband が無いので "baseband":"0" となっているが、iPhone などの baseband があるものは適宜ググって書き換える。

次に復元先の ipsw を展開し、中から以下のファイルに対して xpwntool を用いて KBAG を取得する。

./Firmware/all_flash/all_flash.<model>.production/*.img3
./Firmware/dfu/*
./*.dmg
./kernelcache.release.<model>

./xpwntool <path to file> nul

index.html の Keys の部分を、取得した KBAG と以下のサイトから得られる Firmware Keys に書き換える。存在しないイメージや書いてないイメージのキーは消したり追加したりして、上記のファイルすべてのキーが含まれるようにする。
www.theiphonewiki.com

      {
         "image":"<イメージ名>",
         "filename":"<イメージのファイルパス>",
         "kbag":"<KBAG>",
         "key":"<Key>",
         "iv":"<IV>",
         "date":"2014-02-20T00:00:00Z"
      },


書き換えが終わったら適当に http サーバを建てて、ホームディレクトリから
/firmware/<model ID>/<Build>/index.html (例: /firmware/iPod5,1/10B329/index.html)
となるようにファイルを配置する。
macOS の場合はホームディレクトリに上記のように配置した後

$ sudo python -m SimpleHTTPServer 80

でhttpサーバを建てられる。

httpサーバを建てたら、通常通り futurerestore で復元を行う。

完成
f:id:mdoca:20190830222329p:plain:w200