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 で復元を行う。
完成