iOS　バイナリーファイル解読

上篇：[iOS ファイルシステム紹介](http://qiita.com/roysue/items/4371aa29722aafdff376)

**初心者の段階に我々の目標はApplication、Dynamic Library(略称dylib)とDaemonこの３つの種類のバイナリーファイル、理解はふかければ深いほどバイナリーにの逆分析はうまく行けるようになります。３つの種類のバイナリーの役目も違うしそれなりのフォルダー仕組みもパーミッションもそれぞれです。**

# Application

Applicationとは毎日使われているアプリのことです。IOS開発者にとって仕事そのものがアプリと付き合うことです。Reverse　EngineeringにとってはIOSアプリ開発者と全く違うものに興味を持っています。これからReverse　Engineeringに大事なコンセプトをご紹介します。

## 1,Bundle

BundleのコンセプトはNeXTSTEPから継ぐ生まれるもの、ファイルではありません、ある標準で構築されたフォルダーです。その中に実行ファイルに必要とされている環境も、サポートファイルも、写真、音声ファイルも保存しています。IOS開発にとってアプリもFrameworkもBundleの形で存在しています。Reverse　Engineeringによく見られているPreferenceBundleもSettingに依存するアプリ、構築もアプリと似てて、本質もBundleです。

FrameworkもBundleであり、中身は実行ファイルの代わりに、dylibです。一般的にFrameworkの地位はアプリより高い、アプリは皆Frameworkを調達して役目を達成できることになります。あるBundleを目標に確定したら殆どの手懸かりはBundleの中で見つけられます、難易度は随分に下がるだろう。

|PreferenceBundle|
|:--:|
|![image](https://qiita-image-store.s3.amazonaws.com/0/179982/fe8c64bb-7e61-7df8-e25c-eddd35460fda.png)|
|---------------------------------------------------------------------------------------------------|


## 2,アプリフォルダーの中身

**Reverse　Engineeringにとってフォルダーにの熟練程度は仕事の効率に関わる鍵です。Bundleの中に下の３つの部分が肝心です。**

### Info.plist

>Info.plistがAppのMetadataを記録しています、Bundle　Identifier、Bundle　Name、Icon、配布設置など。この中にBundle　IdentifierがTweakの大事なパラメ—タとなる。Macでは直接OpenできますダブルクリックしてXcodeで開きます。

|Xcodeでplistを見る|
|:--:|
|
![image](https://qiita-image-store.s3.amazonaws.com/0/179982/983437f9-b792-1181-7205-89f0a5e674e3.png)|
|---------------------------------------------------------------------------------------------------|

> Xcodeで搭載されたCMDコマンドラインツール：plutilと使って同じ効果です。一般的にはCMDツールをおすすめします。

```shell-session
snakeninnysiMac:~ snakeninny$ plutil -p
/Users/snakeninny/Code/iOSSystemBinaries/8.1_iPhone5/SiriViewServic
| grep CFBundleIdentifier
"CFBundleIdentifier" => "com.apple.SiriViewService"
```

### 実行ファイル

> 実行ファイルは言わなくても私達の目標としてナンバーワンです。Appフォルダーのコアです。Info.plistを観察して実際の実行ファイルを定位する。

|plistファイルを観察してExcutable　Fileを定位|
|:--:|
|![image](https://qiita-image-store.s3.amazonaws.com/0/179982/e13c37f6-ad39-7423-5b2e-93949e6bd9e9.png)|
|---------------------------------------------------------------------------------------------------|


### lproj　フォルダー

> lproj　フォルダーは様々なグローバル・ローカル言語設定ファイル（.strings）、**リバースエンジニアリングに重要な手懸かりであります、plutilで観察できます。これからどんどん紹介します。

```shell-session
snakeninnysiMac:~ snakeninny$ plutil -p
/Users/snakeninny/Code/iOSSystemBinaries/8.1_iPhone5/SiriViewServic
{
"ASSISTANT_INITIAL_QUERY_IPAD" => "What can I help youwith?"
"ASSISTANT_BOREALIS_EDUCATION_SUBHEADER_IPAD" => "Justsay "Hey Siri" to learn more."
"ASSISTANT_FIRST_UNLOCK_SUBTITLE_FORMAT" => "Yourpasscode is required when %@ restarts"
……
```

## 3,システム・アプリ　VS　AppStore・アプリ

> /Applications/にシステムAppとCydia　Appを保管しています、CydiaからインストールしたAppもシステムAppと見られます。/var/mobile/Containers/にはAppStoreからダウンロードしたAppです。同じAppに認定されても、以下のように区別があります。

### フォルダー組成
AppのBundle内部は殆ど同じ、Info.plist、実行ファイル、lprojフォルダーなどは存在しています。Dataフォルダーの位置は違います、AppStoreのアプリは/var/mobile/Containers/Data/にあり、ユーザーのmobileとして起動したシステムアプリは/var/mobile/にあり、ユーザーのrootとして起動したシステムアプリは/var/root/にあります。

### インストーラーのフォーマットとパーミッション
Cydiaアプリのインストーラーフォーマットはdeb、Debianから継ぐインストーラーパッケージです、Cydiaの作者SaurikよりIOSに移植しました、**debパッケージのオーナー・ユーザーはrootで、オーナー・グループはadminであります**、rootのパーミッションで全システムで動くます。AppStoreアプリはアップル専有のIPAでインストールされます、**オーナー・ユーザーとオーナー・グループは全部mobileで**、mobileのパーミッションでシステムの一部地域しか動けません。

### Sandbox
- 一般的に言えば、IOSのSandboxは訪問制限ルールセットであります。ルールのセットファイル（entitlements）はIOSのコアセキュリティ対策の一つであり、その実現は複雑すぎて今の私達にとって手は及びません。今はただ、SandboxはAppを梱包して、全ての接続はApp以内に限定されていることを知ればいいです。Appは隣のAppの存在すら分からないぐらい厳しくて、接続などはもちろん話にならないです。Appno機能もリミットされています、例えばICLOUDに接続したら必ずSandboxを通します、システムのメッセージもメールも通話にの接続も全部Sandboxを通さなければなりません。
- **今はSandboxの存在を意識するだけでいいです**、脱獄はもうIOSの殆どのセキュリティ対策を抜いています。Sandboxのルールのセットファイル（entitlements）にも手術をして、それを感じなくぐらいにさせた。もしTweakを作った途端、あるファイルが書き込めませんとか、函数を調達しても効果が出ないとか、自分のコードを確保するうえ、Sandboxのルールのセットファイル（entitlements）は問題あるかどうかに振り返して見てみよう。

|SandboxはAppを管理している|
|:--:|
|![image](https://qiita-image-store.s3.amazonaws.com/0/179982/0ccf8070-562a-1950-cea0-91256a82276e.png)|
|---------------------------------------------------------------------------------------------------|


<div class='alert alert-warning'>
次章はIOSのDynamic Library とDaemonを解読します、お楽しみに！
</div>