iOS 7の中身に興味津々!Jailbreakなしでファイルシステムを覗いてみたりしよう
2016/05/24
価値ある情報をユーザー視点で発信するブログ
2016/05/24
もくじ
ひとりぶろぐのmoyashi (@hitoriblog) です。
大幅刷新が図られたiOS 7がとうとう出ましたね。
中身はどんな感じに変わってるんでしょうか? 早速覗いてみたいと思います。
用意するのはファームウェアのipsw。今回ターゲットにするのは、iPhone 4 (GSM)用のiOS 7。「iPhone3,1_7.0_11A465_Restore.ipsw」というやつですね。以下がAppleのサーバへの直接リンク。これをダウンロード。
ダウンロードを終えたら、末尾に拡張子.zipを付けて解凍します。
038-3447-395.dmg がiOS 7のルートファイルシステムのディスクイメージです。ただし、暗号化されています。
038-3447-395.dmg を、デスクトップにコピー。デスクトップを選んでいるのは説明の簡単のためなので、各自の美意識に則って適宜読み替えてください。(続きは[Read More]から)
暗号化されたファイルシステムを復号します。以下からVFDecryptをチェックアウト。
ディレクトリに降りてmakeします。僕の環境はOS X 10.8.4、Xcode 4.6.3 + Command Line Tools、Homebrewといった感じのものです。
make mac
ビルドしたものを置いておきます。解凍、ないしはビルドして得たvfdecryptデスクトップにコピー。
デスクトップにvfdecryptと038-3447-395.dmgを置きました。
以下のページから038-3447-395.dmg用のRootFS Keyをコピーしてきます。RootFS Keyは2013.9.20現在iPhone 4用のものしか公開されていないので、今回それが選ばれているわけです。
Innsbruck 11A465 (iPhone 4 GSM) – The iPhone Wiki
具体的には以下です。
89d4dadced94577508999a1ce2a08b346328d9b25ad4e63b4220ce441cce35cf9e0a108b
ターミナルを起動して以下のように実行。
cd ~/Desktop ./vfdecrypt -k 89d4dadced94577508999a1ce2a08b346328d9b25ad4e63b4220ce441cce35cf9e0a108b -i 038-3447-395.dmg -o rootfs.dmg
暗号化を解除したディスクイメージが得られました。
ダブルクリックでマウントしてみます。
ディレクトリツリーを取ってみます。
brew install tree tree >~/Desktop/ios7tree.txt
全ファイルのリストなので、3.8MBのテキストファイルになりました。人力で把握するのは無理w
ディレクトリのみ。さらに、lproj、_CodeSignatureを省略したディレクトリツリーを取ってみます。158KB。これなら何とか。
tree -d | egrep -v 'lproj|_CodeSignature' >~/Desktop/ios7dirtree.txt
SpringBoardのclass-dumpを取ってみます。iPhone 5s、Xcode 5.0で登場したarm64に対応したclass-dumpのfork。Xcode 4.6.3でビルドできました。
今回いじっているのはiPhone 4用のファイルシステムなので、在来のclass-dump-zで大丈夫かと思いますが。
https://github.com/nygard/class-dump
バイナリ。class-dumpをデスクトップにコピー。
SpringBoardのバイナリをデスクトップにコピーしてclass-dumpします。
cd ~/Desktop cp /Volumes/Innsbruck11A465.N90OS/System/Library/CoreServices/SpringBoard.app/SpringBoard . mkdir SpringBoard7 ./class-dump -H SpringBoard -o SpringBoard7
取れたヘッダ。うへへへへへ!
iPhone OS 3.1から、ライブラリ、framework、bundle類はパフォーマンス向上を目的に、一つの巨大なバイナリにまとめ上げられました。
dyld_shared_cache – iPhone Development Wiki
framework、bundleをclass-dumpするには、それを一度解体せねばなりません。実機にしかないライブラリ、frameworkとリンクする場合にも解体したものが必要ですね。
そのために使うツールは、KennyTM氏のdyld_decache。
KennyTM氏は既にJailbreak業界を去っているのでメンテナンスは止まっています。代替ツールがOpenJailbreakプロジェクトから提供されていますがビルドが面倒で、まだお世話になっていません。dyld_decacheは、iOS 7でもまだ使えます。
概要 – libdyldcache-1.0 – OpenJailbreak.org
話はdyld_decacheに戻って、ここからdyld_decache v0.1bがダウンロードできます。
解凍したものをデスクトップに置きます。
ターミナルから以下のように実行。
cd ~/Desktop cp /Volumes/Innsbruck11A465.N90OS/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armv7 . chmod +x dyld_decache ./dyld_decache dyld_shared_cache_armv7
これで、librariesディレクトリの中に解体されたライブラリ、framework、bundleができます。公開framework、そして非公開frameworkの一部はSDKに含まれていますが、機種依存のframeworkはSDKに含まれないのが普通です。例えば、Touch ID関係のframeworkとか。それを実機のiOSから得ることができるわけです。ヒャッハーーー!
iPhone 5sのファイルシステムが触れる日が楽しみですね。
ちなみに、Control CenterはPlug-inで拡張可能な作りにはなっていないようです。
SpringBoard自体にハードコーディングされた機能の一部なのでしょう。