ZhgChg.Li

iOS逆向工程|越獄からUI注入・反編譯まで徹底解析

iOS逆向工程に挑戦する開発者向けに、越獄・iPA抽出・UI注入・反編譯の具体的手法と問題解決を解説し、効率的な解析スキル習得を支援します。

iOS逆向工程|越獄からUI注入・反編譯まで徹底解析
本記事は AI による翻訳です。お気づきの点があればお知らせください。

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 ログイン画面のレイアウト構造

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上の環境を準備します:

  1. Macには標準でPython 2.7が搭載されていますが、このツールはPython 2.X/3.Xに対応しているため、特にPythonを別途インストールする必要はありません。ただし、私はPython 3.Xを使って操作しています。もしPython 2.Xで問題が発生した場合は、Python 3のインストールと使用を試してみてください。

  2. pip(Pythonのパッケージ管理ツール)をインストールする

  3. pip を使って frida をインストールする:
    sudo pip install frida -upgrade -ignore-installed six (python 2.X)
    sudo pip3 install frida -upgrade -ignore-installed six (python 3.X)

  4. Terminalで frida-ps を入力し、エラーメッセージが表示されなければインストールは成功です!

  5. AloneMonkey/frida-ios-dump プロジェクトをクローンする

  6. プロジェクトに入り、テキストエディタで dump.py ファイルを開きます

  7. SSH接続設定が正しいか確認してください(デフォルトでは特に変更不要)
    User = ‘root’
    Password = ‘alpine’
    Host = ‘localhost’
    Port = 2222

脱獄したiPhoneの環境:

  1. Open SSHのインストール:Cydia → 検索 → Open SSH → インストール

  2. Fridaのインストール元:Cydia → ソース → 右上の「編集」 → 左上の「追加」 → https://build.frida.re

  3. Fridaのインストール:Cydia → 検索 → Frida → 携帯のプロセッサバージョンに応じたツールをインストール(例:私はiPhone 6 A11なので、Frida for pre-A12 devices をインストール)

環境が整ったら、作業開始:

1.スマホをUSBでパソコンに接続する

2.MacでTerminalを開き、iproxy 2222 22 を入力してサーバーを起動します。

3.スマホとパソコンが同じネットワーク環境にあることを確認する(例:同じWiFiに接続)

  1. もう一つターミナルを開き、ssh [email protected] と入力し、SSHパスワード(デフォルトは alpine)を入力します。

  1. もう一つターミナルを開き、クローンした /frida-ios-dump ディレクトリにcdしてからダンプコマンドを実行します。

dump.py -l を入力すると、携帯にインストールされている、または実行中のアプリが一覧表示されます。

  1. 解析・ダンプしたいAPPの名前 / Bundle IDを見つけて、入力してください:

dump.py APP名またはBundleID -o 出力先のパス/出力ファイル名.ipa

ここでは必ず 出力結果のパス/ファイル名 を指定してください。デフォルトの出力パスは /opt/dump/frida-ios-dump/ ですが、これを /opt/dump に移動したくないため、権限エラーを避けるために出力パスを指定する必要があります。

  1. 出力が成功すると、アンパック済みの .ipa ファイルを取得できます!

  • 携帯電話は脱獄された状態でなければツールを使用できません。

  • 接続エラーや reset by peer などの問題が発生した場合は、USBケーブルを抜き差しするか、iproxyを再起動してみてください。

  1. .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. 最後で最も難しい — 逆コンパイルを行う

IDAHopper のリバースエンジニアリングツールを使って解析できます。どちらも有料ツールですが、Hopper は30分間の無料トライアルが可能です。

取得した APP名称.app ファイルを直接 Hopper にドラッグすると、解析を開始できます。

しかし、私はここで止まりました。なぜなら、ここからは機械語の解析やclass-dumpの結果をもとにしたメソッドの推測など、非常に高度な技術が必要になるからです。

逆コンパイルを突破した後、自分で動作を改変し、新しいAPPとして再パッケージ化できます。

画像はワンピースから

画像はワンピースからのものです

逆向エンジニアリングのその他のツール

1. MITM Proxy 無料ツールを使ってAPIのネットワークリクエスト情報を傍受する

»APPはHTTPSで通信しているが、データは盗まれてしまった。

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を注入…

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のセキュリティについても理解が深まりました!

PostZMediumToMarkdown によって Medium から変換されました。

GitHub で編集
この記事を改善
本記事は Medium で初公開
オリジナルを読む
この記事をシェア
リンクをコピー · SNS でシェア
ZhgChgLi
著者

ZhgChgLi

An iOS, web, and automation developer from Taiwan 🇹🇼 who also loves sharing, traveling, and writing.

コメント