記事

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を選択して情報画面を表示します。そこで、「Option」キーを押しながら「iPhoneを復元」をクリックすると、IPSWファイル選択ウィンドウが表示されます。ダウンロードした古いIPSWファイルを選べば、ダウングレードの復元が完了します。

最初は何も考えずに「iPhoneを復元」を押してしまい、最新バージョンを再インストールするだけで時間を無駄にしました…

lookin ツールを使って他人のAPPのUIレイアウトを確認する

まずは楽しい前菜として、ツールを使って脱獄したiPhoneで他人のAPPがどのようにレイアウトされているかを見てみましょう。

表示ツール:一つは老舗のReveal(機能が充実しており、有料で約60ドル/試用可能)、もう一つはテンセントのQMUIチームが作成したlookinという無料オープンソースツールです。ここではlookinを例として使用しますが、Revealもほぼ同様です。

脱獄していないiPhoneでも問題ありません。このツールは主に開発中のプロジェクトで、デバッグ時のレイアウト確認(Xcodeの簡易インスペクターの代わり)に使えます。普段の開発でも活用可能です!

他人のAPPを見るには、脱獄したiPhoneが必要です。

自分のプロジェクトを見る場合…

以下の4つの方法から選択できます: CocoaPods を使ったインストール、 ブレークポイント挿入 (シミュレーターのみ対応)、 Frameworkを手動でプロジェクトに導入手動設定

プロジェクトをビルドして実行すると、Lookin ツールでアプリ画面を選択しレイアウト構造を確認 できます。

他人のAPPを見たい場合…

Step 1. 脱獄したiPhoneで「 Cydia 」を開き->「 LookinLoader 」を検索->「 インストール 」-> iPhoneの「 設定 」に戻り->「 Lookin 」->「 Enabled Applications 」-> 確認したいAPPを有効化

Step 2. USBケーブルで iPhoneをMacに接続 -> 確認したいAPPを起動 -> Macに戻り、 LookinツールでAPP画面を選択 -> すると レイアウト構造を確認可能

Lookin レイアウト構造の確認

Facebook ログイン画面のレイアウト構造

Facebook ログイン画面のレイアウト構造

左側の欄で View Hierarchy を表示し、右側の欄で選択したオブジェクトを動的に編集できます。

元の「新しいアカウントを作成」が「ハハハ」に変更されている

元の「新しいアカウントを作成する」が「哈哈哈」に変更されました

オブジェクトの変更はリアルタイムでスマホのAPPに反映されます。上の図のように。

ウェブページの「F12」開発者ツールと同様に、すべての変更はViewにのみ有効で、実際のデータには影響しません。主にデバッグ用ですが、もちろん値を変更したり、スクリーンショットを撮って友達をだますこともできます XD

Reveal ツールを使ってAPPのUIレイアウト構造を確認する

Reveal は有料ですが、個人的には Reveal の方が好きです。構造表示の情報がより詳細で、右側の情報欄はほぼ XCode 開発環境と同じなので、リアルタイムで調整が可能です。また、Constraint Error を表示してくれるため、UI レイアウトの修正に非常に役立ちます!

これら二つのツールは、日常的な自分の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でターミナルを開き、iproxy 2222 22 を入力してサーバーを起動します。

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

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

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

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

  1. 砕殻してエクスポートするAPPの名前 / バンドル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 ツールを使って全てのAPP(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 に成功すると、アプリ全体の .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 Process ID を使って、実行中のAPPにツールを注入する

Objective-C/Javascript を使ってデバッグ制御が可能です。

例えば:

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

ご質問やご意見がありましたら、お問い合わせ ください。

Post MediumからZMediumToMarkdownを使って変換。


🍺 Buy me a beer on PayPal

👉👉👉 Follow Me On Medium! (1,053+ Followers) 👈👈👈

本記事は Medium にて初公開されました(こちらからオリジナル版を確認)。ZMediumToMarkdown による自動変換・同期技術を使用しています。

Improve this page on Github.

本記事は著者により CC BY 4.0 に基づき公開されています。

© ZhgChgLi. All rights reserved.
閲覧数: 802,415+, 最終更新日時: 2026-01-15 11:14:58 +08:00

本サイトは Chirpy テーマを使用し、Jekyll 上で構築されています。
Medium の記事は ZMediumToMarkdown により変換されています。