iPhone
iOS
macos
JailBreak
filesystem

iOS ファイルシステム紹介

More than 1 year has passed since last update.

上篇:iOS Reverse Engineeringの操作手順

Intro

アップルのエレガントなUIの下に、皆さんはきっとシステムがどのように構築されているか気になることでしょう。Jailbreakされる前はiOSはブラックボックスでした、evad3人生、盘古、太极などのチームのお陰でiOSがJailbreakされた後、ブラックボックスが開けられて、iOSの内部構造が世間に暴露されました。

iOSシステム構造

JialbreakされていないiOSには、非公式アプリに公開されたiOSファイルシステに接続できるAPIは僅か少ししかありません。開発者は書類を参考してルールに従うだけです。そのため開発者はiOSファイルシステムについて何もわかりません。

権限が低いので、AppStoreからダウンロードしたアプリの自分のフオルダ以外は何も接続できません。ですがJailbreakしたあと、CydiaからインストールしたアプリはAppStoreより高い権限が持つことでシステム全般のファイルに接続できます。CydiaでデビューしたiFileはiOSに使う非公式老舗ファイル管理アプリでした。下記写真を御覧ください。

image

CydiaのAFC2サービスのお陰でiFunBoxなどのPCソフトウェアでiOSシステムファイルに接続できます。分析したいアプリはiOSシステムからぬけるしかないので、まずはiOSシステムにアクセスするのは第一歩です。下記写真はiFunBoxのUIです。

image

iOSフォルダー構造

iOSはOSXから生み出されたシステム、OSXはUNIXに基づいて作られたシステムでした。素人から見れば随分違っているものですが、血が繋がっています。Filesystem Hierarchy Standardとhier(7)を読んでiOSのフォルダー構造標準を覗けます。Filesystem Hierarchy StandardはUNIX-likeシステムのフォルダー構造を構築するために作られた標準でした。アップルはこれに基づいて自らのhier(7)Frameworkを開発しました。具体的は以下のようになりました。

位置 説明
/ root 、すべてのファイルとフォルダーはルートに所属しています。
/bin Binaryの略称、ユーザーモードの基礎命令(ls、psなど)を保管する場所
/boot システムを成功に起動するファイルを保管する場所、iOSでは空です。
/dev “device”の略称、BSDデバイスファイルを保管する。ファイルごとにシステムのブロック・デバイスあるいはキャラクタ・デバイスを表すこと。ブロックデバイスはブロックごとに通信する、例えばハードディスク;キャラクタ・デバイスはキャラクタごとに通信する、例えばモデム
/sbin ”System Binary”の略称、Superuserモードの基礎命令(netstat、rebootなど)を保管する場所
/etc ”Et Cetera”の略称、システムスクリプトと配置ファイルを保管する場所、例えばpasswd,hostsとか。IOSには/etcはただのシンボリックリンク、実際に/private/etcにリンクしています。
/lib システムのFramework、カーネル・モジュールとデバイスドライバーなどの保管場所。iOSでは空きです。
/mnt ”mount”の略称、一時的の搭載位置フォルダーを保管場所。iOSでは空きです。
/private /private/etcと/private/varを保管する場所
/tmp 一時的のフォルダー。iOSでは/pravate/var/tmpにシンボリックリンクしています。
/usr 殆どのユーザー向きのツールとプログラムが含まれています。/binと/sbinに含まれていないツールは/usr/binに置かれています。例えばnm,killallとか;/usr/includeは標準ヘッダファイルを保管。/usr/libはライブラリファイルを保管。
/var ”variable”の略称、よく変更されるファイルを保管する。例えばログ、ユーザーデーター、一時ファイルなど。/var/mobileと /var/rootはmobieとrootのユーザーファイルを保管する場所であり、最も注意すべきところです。
上記の内容はシステムの一番下の段階にあり、逆分析するのも難しいので、初心者にむいてないから、一時は無視してもOKです。初心者にはアプリの逆分析をはじめ、どんどんツールを把握して、慣れていて実感できるてアプリから分析するほうが進歩が早いです。

./Applications

iOS開発者にとっては、日常に使われている殆どのファイルがiOS特有のフォルダー"./Applications"にあります。
./ApplicationはシステムアプリとCydiaからインストールしたアプリを保存します。AppStoreからのファイルはここでは保存していません。下記写真のように。

./Applications
image
---------------------------------------------------------------------------------------------------

./Developer

iPhoneがXCODEに接続されてデッバガーデバイスに認定された後、XCODEはiPhoneにこのフォルダーを作ります、デッバガーになくてはならないツールとデーダーを保管します。

./Developer
image
image
-------------------------------------------------------------------------------------------------------------

./Library

システム機能をサポートするDeamonやFrameworkを保管する場所。その中に/Library/MobileSubstrate/にすべてのCydiaSubstrateを基づいて作られたTweakが保管しています。

./Library
image
---------------------------------------------------------------------------------------------------

./System/Library

iOSにとって最も重要なフォルダーの一つであり、システムファイルを大量に保管しています、このフォルダーの中にどうしても無視できない内容は以下のように:

  • ./System/Library/Frameworksと./System/Library/PrivateFrameworksはIOSに使う様々なFrameworksを保管する、SDKに現れたのは九牛の一毛であり、また数えない機能がこれらのファイルに残って我らに待っています。
  • ./System/Library/CoreServicesにあるSpringBoard.appはiOSにのデスクトップマネジャーであり、ユーザーとコミュニケーションする一番大切なUIです。
./System/Library
image
---------------------------------------------------------------------------------------------------
./Systemの深さは決して以上の3つのフォルダーに限らない、皆一緒に掘りましょう!

./User

ユーザーフォルダー、実際に/var/mobile/にシンボリックリンクしています。大量のユーザーデーターを保管しています。

  • /var/mobile/Media/DCIM に写真を保管している
  • /var/mobile/Media/Recordings に録音データーを保管する
  • /var/mobile/Library/SMS にメッセージデーターを保管する
  • /var/mobile/Library/Mail にメールデーターを保管する
  • /var/mobile/Containers にはユーザーがAppStoreからインストールしたアプリを保管しています。アプリのバイナリーは/var/mobile/Containers/Bundleにあり、そのデーターは/var/mobile/Containers/Dataにあります。
./User and /var/mobile/Containers
image
image
---------------------------------------------------------------------------------------------------

iOSシステムのファイルパーミッション

IOSはマルチユーザーシステムであり、ユーザーと言うのは抽象のコンセプト、システムにてどんなパーミッションを持つことを表すこと。例えば、mobileのユーザーがrebootのコマンドですステムを再起動できません、rootユーザーはこれができる。rootユーザーはシステムのすべてに所有権と使用権が持つこと。グループはユーザーを組織に編隊すること、グループに何人も編入できるが、一人もいくつの組織に参加できます。

ファイルごとに自分のオーナー・ユーザーとオーナー・グループがあります、あるいはこのユーザーとこのグループがこのファイルを所有しています。ファイルごとにパーミッションがあります、簡単に言えば、パーミッションと言うのはファイルのオーナー・ユーザーとオーナー・グループが何ができるのかを表すことです。IOSには3つのbitでファイルのパーミッションを表示します、上から下にはr(read)、w(write)、 x(execute)の3つのパーミッションでした。

アップルのMacOSとIOSのカーネルはXNUです、XNUの意味はX is Not Unix。ということで、たとえUnixじゃないけれとも、必死にUnixを真似して出来る限りぴったりにすることです。上記のパーミッションもUnixと丸で同じ仕組みです。

ファイルとユーザーに以下の3つの関係が存在している:

  • このユーザーがオーナー
  • このユーザーがオーナーじゃない、でもユーザーと同じグループに編入している
  • このユーザーはオーナーじゃない、ユーザーと同じグループも編入していません

ということで、パーミッションを表現するには、3*3 Bitの形必要です。2進数 Bitは1の場合はパーミッション有効、0の場合は無効です。例えば、111101101はrwxr-xr-xを代表しています、オーナーがr、w、xのパーミッションを持つ、グループの諸君はr、xのパーミッションを持つ、完全に第三者もr、xのパーミッションを持ってます。2進数の111101101を十六進法に変更すれば755です、よく見られるのパーミッションの一つです。

パーミッションのr、w、x以外も、SUID、SGIDとStichyなどの特殊パーミッションが持っています、一般的には使わないから初心者はr、w、xを把握して十分です。

SUMMARY

iOSフォルダーは大体このような仕組みです。これからは目的に応じてフォルダーを分析していきます。上記の紹介は僅か氷山の一角で、数え切れないほどの秘密がのこっています。

次章:iOS バイナリーファイル解読