iOS リバースエンジニアリング初体験
脱獄、iPAファイルの抽出とアンパックからUI解析、インジェクション、リバースエンジニアリングまでの探求プロセス
セキュリティについて
以前唯一セキュリティに関係することは« 中間者攻撃で通信データをスニッフィングする »だけでした;またこの話の続きとして、データ送信前にエンコードや暗号化を行い、受信時にAPP内で復号することで中間者のスニッフィングを防ぐとしたら、それでもデータが盗まれる可能性はありますか?
答えはイエスです!実際に試していなくても、破れないシステムは存在しません。問題は時間とコストだけです。解析にかかる時間や労力が得られる成果を超えない限り、それは安全と言えます!
どうやって?
ここまでできたら、あとはどうやって解析するのか?それが本記事で記録したいテーマ — 「リバースエンジニアリング」 です。あなたのAPPを解析して、どのように暗号化・復号化が行われているかを調べます。実はこの分野にはずっと漠然とした興味しかなく、iPlayground 2019で2回の大きな講演を聞いただけで、原理や実装方法をなんとなく理解している程度でした。最近ちょうど機会があったので、少し触ってみたことを皆さんと共有します!
逆向すると、何ができる?
-
APPのUIレイアウト方法と構造の確認
-
APPのリソースディレクトリを取得する .assets/.plist/icon…
-
APPの機能改変と再パッケージ化(例:広告の除去)
-
逆コンパイルによる元のプログラムコードの推測とビジネスロジック情報の取得
-
dumpした .h ヘッダーファイル / keychain の内容
実行環境
macOS バージョン: 10.15.3 Catalina
iOS バージョン: iPhone 6 (iOS 12.4.4 / 脱獄済み) 必須
Cydia: Open SSH
ジェイルブレイクの部分
どのバージョンの iOS や iPhone でも、脱獄可能なデバイスであれば使用できます。不要なリスクを避けるために、古い端末や開発機の使用をおすすめします。ご自身の端末や iOS バージョンに応じて、瘋先生越獄教學 を参考にしてください。必要に応じて、iOS 降版(認証状況の確認)を行ってから脱獄してください。
私は以前の古いiPhone 6を使ってテストしました。もともとiOS 12.4.5にアップデートしていましたが、12.4.5ではずっと脱獄に成功しませんでした。幸いにも12.4.4にダウングレードしてから、checkra1nを使って脱獄に成功しました!
手順は多くなく、難しくもありません;ただ時間をかけて待つ必要があります!
自分がやらかした経験を添えて: 古いバージョンのIPSWファイルをダウンロードした後、iPhoneをMacに接続し、Finderのファイルブラウザ(macOS 10.5以降はiTunesがありません)で左側の「場所」からiPhoneを選択します。iPhoneの情報画面が表示されたら、「Option」キーを押しながら「iPhoneを復元」をクリックすると、IPSWファイル選択ウィンドウが表示されます。そこでダウンロードした古いIPSWファイルを選べば、ダウングレードのための復元が完了します。

最初は何も考えずに「Restore iPhone」を押してしまい、最新バージョンを再インストールするだけで時間を無駄にしました…。
lookin ツールを使って他人のAPPのUIレイアウトを確認する
まずは面白い前菜として、ツールを使って脱獄したiPhoneで他人のAPPがどのようにレイアウトされているかを見てみましょう。
確認ツール:一つは老舗のReveal(機能がより充実しており、有料で約60ドル/試用可能)、もう一つはTencent QMUIチームが作成したlookinの無料オープンソースツールです。ここではlookinを使って説明しますが、Revealもほぼ同様です。
脱獄した端末がなくても問題ありません。このツールは主に開発中のプロジェクトでデバッグ時のレイアウト確認(Xcodeの簡易インスペクターの代わり)に使えます。普段の開発にも役立ちます!
他人のAPPを解析するには、脱獄済みのデバイスが必要です。
自分のプロジェクトを確認したい場合…
CocoaPods を使ったインストール、ブレークポイント挿入(シミュレーターのみ対応)、Frameworkをプロジェクトに手動で導入、手動設定 の4つの方法があります。
プロジェクトをビルドして実行すると、Lookin ツールで APP 画面を選択し、レイアウト構造を確認できます。

他人のAPPを見たい場合…

Step 1. ジェイルブレイクしたiPhoneで「 Cydia 」を開き、「 LookinLoader 」を検索して「 インストール 」→ iPhoneの「 設定 」に戻り、「 Lookin 」→「 Enabled Applications 」→ 確認したいAPPを有効化。
Step 2. USBケーブルでスマホをMacに接続 -> 確認したいAPPを起動 -> PCに戻り、LookinツールでAPP画面を選択 -> するとレイアウト構造を確認可能。
Lookin でレイアウト構造を確認する

Facebookログイン画面のレイアウト構造
左側の欄で View Hierarchy を確認し、右側の欄で選択したオブジェクトを動的に編集できます。

元の「新しいアカウントを作成する」が「哈哈哈」に変更されました
オブジェクトの変更もリアルタイムでスマホのAPPに反映されます。上の図のように。
ウェブの「F12」開発者ツールと同様に、すべての変更はViewにのみ有効で、実際のデータには影響しません。主にデバッグ用ですが、もちろん値を変更したり、スクリーンショットを撮ったりして、友達を騙すこともできます XD
Reveal ツールを使ってAPPのUIレイアウト構造を確認する

Revealは有料ですが、個人的にはRevealの方が好きです。構造表示の情報がより詳細で、右側の情報欄はほぼXCodeの開発環境と同じで、リアルタイムで調整が可能です。また、Constraint Errorの提示もあり、UIレイアウトの修正に非常に役立ちます!
この2つのツールは、日常的に自分のAPPを開発する上で非常に役立ちます!
環境や興味深いポイントを理解したところで、本題に入りましょう!
*以下はすべて脱獄済みのiPhoneが必要です
APP .ipa ファイルの抽出とアンパック
App StoreからインストールしたすべてのAPPの.ipaファイルにはFairPlay DRMによる保護がかかっており、俗にいう「パッキング保護」です。これを解除することを「アンパック(砕殻)」と呼びます。したがって、単にApp Storeから.ipaを抽出しても意味がなく、使用できません。
*もう一つのツール APP Configurator 2 は保護されたファイルのみ抽出可能で、あまり意味がないため詳述しません。興味のある方はこちらの解説を参照してください。
ツールと脱獄済みiPhoneを使って砕殻後の元の .ipa ファイルを抽出する:
ツールに関して、最初は Clutch を使っていましたが、何度試しても FAILED が出ました。プロジェクトの issue を調べると、多くの人が同じ状況で、このツールは iOS 12 以上では使えなくなっているようです。
また、もう一つの老舗ツール dumpdecrypted もありますが、私は調査していません。
ここでは frida-ios-dump というPythonツールを使って動的にアンパックします。とても便利です!
まずはMac上の環境を準備します:
-
Macには標準でPython 2.7が搭載されていますが、このツールはPython 2.X/3.Xに対応しているため、特にPythonを別途インストールする必要はありません。ただし、私はPython 3.Xを使って操作しています。もしPython 2.Xで問題が発生した場合は、Python 3のインストールと使用を試してみてください。
-
pip(Pythonのパッケージ管理ツール)をインストールする
-
pip を使って frida をインストールする:
sudo pip install frida -upgrade -ignore-installed six(python 2.X)
sudo pip3 install frida -upgrade -ignore-installed six(python 3.X) -
Terminalで
frida-psを入力し、エラーメッセージが表示されなければインストールは成功です! -
AloneMonkey/frida-ios-dump プロジェクトをクローンする
-
プロジェクトに入り、テキストエディタで dump.py ファイルを開きます
-
SSH接続設定が正しいか確認してください(デフォルトでは特に変更不要)
User = ‘root’
Password = ‘alpine’
Host = ‘localhost’
Port = 2222
脱獄したiPhoneの環境:
-
Open SSHのインストール:Cydia → 検索 → Open SSH → インストール
-
Fridaのインストール元:Cydia → ソース → 右上の「編集」 → 左上の「追加」 → https://build.frida.re
-
Fridaのインストール:Cydia → 検索 → Frida → 携帯のプロセッサバージョンに応じたツールをインストール(例:私はiPhone 6 A11なので、
Frida for pre-A12 devicesをインストール)
環境が整ったら、作業開始:
1.スマホをUSBでパソコンに接続する
2.MacでTerminalを開き、iproxy 2222 22 を入力してサーバーを起動します。
3.スマホとパソコンが同じネットワーク環境にあることを確認する(例:同じWiFiに接続)
- もう一つターミナルを開き、ssh [email protected] と入力し、SSHパスワード(デフォルトは
alpine)を入力します。

- もう一つターミナルを開き、クローンした /frida-ios-dump ディレクトリにcdしてからダンプコマンドを実行します。
dump.py -l を入力すると、携帯にインストールされている、または実行中のアプリが一覧表示されます。

- 解析・ダンプしたいAPPの名前 / Bundle IDを見つけて、入力してください:
dump.py APP名またはBundleID -o 出力先のパス/出力ファイル名.ipa
ここでは必ず 出力結果のパス/ファイル名 を指定してください。デフォルトの出力パスは /opt/dump/frida-ios-dump/ ですが、これを /opt/dump に移動したくないため、権限エラーを避けるために出力パスを指定する必要があります。
- 出力が成功すると、アンパック済みの .ipa ファイルを取得できます!

-
携帯電話は脱獄された状態でなければツールを使用できません。
-
接続エラーや reset by peer などの問題が発生した場合は、USBケーブルを抜き差しするか、iproxyを再起動してみてください。
- .ipaファイルの拡張子を直接.zipに変更し、右クリックで解凍します。
/Payload/APP名.app が表示されます
元のAPPファイルを入手した後にできること…
1. APPのリソースディレクトリを抽出する
APP名称.app を右クリック → 「パッケージの内容を表示」で APP のリソースディレクトリを見ることができます。

2. class-dump で APP の .h ヘッダーファイル情報を出力する
class-dump ツールを使用して、アプリ全体(Frameworkを含む)の .h ヘッダーファイル情報を抽出する(Objective-C のみ対応、プロジェクトが Swift の場合は無効)
nygard/class-dump _大きなツールで試みましたが、ずっと失敗しました;最終的にはやはりAloneMonkey / MonkeyDev のツールセットで改良された class-dump ツールを使って成功しました。*
-
ここから直接 Download MonkeyDev/bin/class-dump ツール
-
ターミナルを開いて直接使用します:
./class-dump -H APPパス/APP名.app -o 出力先パス

dump に成功すると、APP 全体の .h 情報を取得できます。
4. 最後で最も難しい — 逆コンパイルを行う
IDA と Hopper のリバースエンジニアリングツールを使って解析できます。どちらも有料ツールですが、Hopper は30分間の無料トライアルが可能です。
取得した APP名称.app ファイルを直接 Hopper にドラッグすると、解析を開始できます。

しかし、私はここで止まりました。なぜなら、ここからは機械語の解析やclass-dumpの結果をもとにしたメソッドの推測など、非常に高度な技術が必要になるからです。
逆コンパイルを突破した後、自分で動作を改変し、新しいAPPとして再パッケージ化できます。

画像はワンピースからのものです
逆向エンジニアリングのその他のツール
1. MITM Proxy 無料ツールを使ってAPIのネットワークリクエスト情報を傍受する

2.Cycript (脱獄済みのiPhoneと併用) 動的解析/注入ツール:
-
脱獄したiPhoneで「Cydia」を開き、「Cycript」を検索して「インストール」してください。
-
パソコンでターミナルを開き、Open SSHを使って携帯に接続します。
ssh root@携帯のIP(デフォルトのパスワードはalpine) -
ターゲットのAPPを開く(APPはフォアグラウンドに保持)
-
ターミナルで
ps -e \\| grep APP Bundle IDを入力し、実行中のAPPのプロセスIDを探します。 -
cycript -p プロセスIDを使って、実行中のAPPにツールを注入します。
Objective-C/Javascript を使用してデバッグ制御が可能です。

例えば:
cy# alert = [[UIAlertView alloc] initWithTitle:@"HIHI" message:@"ZhgChg.li" delegate:nil cancelButtonTitle:@"キャンセル" otherButtonTitles:nl]
cy# [alert show]

UIAlertViewControllerを注入する…
-
chose() : ターゲットを取得する
-
UIApp.keyWindow.recursiveDescription().toString() : ビュー階層の構造情報を表示する
-
new Instance(メモリ位置): オブジェクトを取得する
-
exit(0) : 終了
詳細な操作はこちらの記事 をご参照ください。
3. Lookin / Reveal UIレイアウト確認ツール
前にも紹介しましたが、改めておすすめします。自分のプロジェクトの日常開発でも非常に便利なので、Revealの購入をおすすめします。
4. MonkeyDev 統合ツール 、動的に注入してAPPを改変し、新しいAPPとして再パッケージ可能
5. ptoomey3 / Keychain-Dumper 、KeyChainの内容をエクスポート
詳細な操作はこちらの記事 を参照してください。ただし、私は成功しませんでした。プロジェクトのissueを見ると、iOS 12以降では動作しなくなっているようです。
まとめ
この分野は非常に奥が深く、多くの技術知識がなければ習得は難しいです。本記事は逆向き解析の「体験」をざっくりと紹介しただけなので、不足があればご了承ください。学術研究目的のみで使用し、不正行為は禁止です。個人的には一連のツールを使う過程がとても面白く、APPのセキュリティについても理解が深まりました!
Post は ZMediumToMarkdown によって Medium から変換されました。



コメント