iOS ファイルシステム紹介

上篇：[iOS Reverse Engineeringの操作手順](http://qiita.com/roysue/items/024a8e01347be1a91bd8)

## Intro

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

## iOSシステム構造

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

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

![image](https://qiita-image-store.s3.amazonaws.com/0/179982/1ead1a81-13fa-ec52-309b-578c7094c0d1.png)

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

![image](https://qiita-image-store.s3.amazonaws.com/0/179982/1227cbbc-22ef-b3bd-5de2-8718a8279a2e.png)



## 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のユーザーファイルを保管する場所であり、最も注意すべきところです。|

<div class='alert alert-warning'>
上記の内容はシステムの一番下の段階にあり、逆分析するのも難しいので、初心者にむいてないから、一時は無視してもOKです。初心者にはアプリの逆分析をはじめ、どんどんツールを把握して、慣れていて実感できるてアプリから分析するほうが進歩が早いです。

</div>

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

|./Applications|
|:--:|
|![image](https://qiita-image-store.s3.amazonaws.com/0/179982/a6c0afe3-8a23-1a95-724b-a83d4e1c1e55.png)|
|---------------------------------------------------------------------------------------------------|

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

|./Developer|
|:--:|
|![image](https://qiita-image-store.s3.amazonaws.com/0/179982/78fb2a05-1698-e0b9-377d-8c5c54766ec6.png)|
|![image](https://qiita-image-store.s3.amazonaws.com/0/179982/27617ef9-d331-07ad-5bc1-78cfc8b9489d.png)|
|-------------------------------------------------------------------------------------------------------------|


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

|./Library|
|:--:|
|![image](https://qiita-image-store.s3.amazonaws.com/0/179982/00d32812-e688-ebd8-38b9-81e1099471c7.png)|
|---------------------------------------------------------------------------------------------------|

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

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

|./System/Library|
|:--:|
|![image](https://qiita-image-store.s3.amazonaws.com/0/179982/05d05d10-d96a-6d6e-c604-566fb4c432ba.png)|
|---------------------------------------------------------------------------------------------------|

<div class='alert alert-warning'>
./Systemの深さは決して以上の３つのフォルダーに限らない、皆一緒に掘りましょう！
</div>


### ./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](https://qiita-image-store.s3.amazonaws.com/0/179982/ee58db11-ede1-ba25-a4a5-da4bc351fd61.png)|
|![image](https://qiita-image-store.s3.amazonaws.com/0/179982/8bda1510-c6af-f826-427d-91efc97fcf17.png)|
|---------------------------------------------------------------------------------------------------|



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

>IOSはマルチユーザーシステムであり、ユーザーと言うのは抽象のコンセプト、システムにてどんなパーミッションを持つことを表すこと。例えば、mobileのユーザーがrebootのコマンドですステムを再起動できません、rootユーザーはこれができる。rootユーザーはシステムのすべてに所有権と使用権が持つこと。グループはユーザーを組織に編隊すること、グループに何人も編入できるが、一人もいくつの組織に参加できます。
>>ファイルごとに自分のオーナー・ユーザーとオーナー・グループがあります、あるいはこのユーザーとこのグループがこのファイルを所有しています。ファイルごとにパーミッションがあります、簡単に言えば、パーミッションと言うのはファイルのオーナー・ユーザーとオーナー・グループが何ができるのかを表すことです。IOSには３つのbitでファイルのパーミッションを表示します、上から下にはr(read)、w(write)、 x(execute)の３つのパーミッションでした。

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

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

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

ということで、パーミッションを表現するには、3*3　Bitの形必要です。2進数 Bitは１の場合はパーミッション有効、０の場合は無効です。例えば、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　バイナリーファイル解読](http://qiita.com/roysue/items/164dbb1f982669f3844d)