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


上篇:iOS ファイルシステム紹介

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

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

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

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

Info.plist

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

Xcodeでplistを見る
---------------------------------------------------------------------------------------------------

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

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

実行ファイル

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

plistファイルを観察してExcutable Fileを定位
---------------------------------------------------------------------------------------------------

lproj フォルダー

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

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を管理している
---------------------------------------------------------------------------------------------------
次章はIOSのDynamic Library とDaemonを解読します、お楽しみに!