ひとりぶろぐ

価値ある情報をユーザー視点で発信するブログ

iOS 7の中身に興味津々!Jailbreakなしでファイルシステムを覗いてみたりしよう

      2016/05/24

iOS 7の中身を覗いてみよう

ひとりぶろぐのmoyashi (@hitoriblog) です。

大幅刷新が図られたiOS 7がとうとう出ましたね。

中身はどんな感じに変わってるんでしょうか? 早速覗いてみたいと思います。

用意するのはファームウェアのipsw。今回ターゲットにするのは、iPhone 4 (GSM)用のiOS 7。「iPhone3,1_7.0_11A465_Restore.ipsw」というやつですね。以下がAppleのサーバへの直接リンク。これをダウンロード。

ダウンロードを終えたら、末尾に拡張子.zipを付けて解凍します。

Skitched 20130920 125221

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.zip

デスクトップにvfdecryptと038-3447-395.dmgを置きました。

Skitched 20130920 130950

以下のページから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

暗号化を解除したディスクイメージが得られました。

Skitched 20130920 131619

ファイルシステムをつぶさに眺める

ダブルクリックでマウントしてみます。

Skitched 20130920 131738

ディレクトリツリーを取ってみます。

brew install tree
tree >~/Desktop/ios7tree.txt

全ファイルのリストなので、3.8MBのテキストファイルになりました。人力で把握するのは無理w

ディレクトリのみ。さらに、lproj、_CodeSignatureを省略したディレクトリツリーを取ってみます。158KB。これなら何とか。

tree -d | egrep -v 'lproj|_CodeSignature' >~/Desktop/ios7dirtree.txt


class-dumpを取る

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

取れたヘッダ。うへへへへへ!

ライブラリ、framework、bundle類を解体

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のファイルシステムが触れる日が楽しみですね。

Skitched 20130920 140040

ちなみに、Control CenterはPlug-inで拡張可能な作りにはなっていないようです。

SpringBoard自体にハードコーディングされた機能の一部なのでしょう。

 - iOS, iPad, iPhone, OS X