ios-reverse-engineering について
ios-reverse-engineeringは、iOSアプリのパッケージやバイナリを調べるスキルです。セキュリティ研究者やアプリ分析者向けに、コード構造、API呼び出し、SDK、セキュリティ上の問題を調査し、構造化して記録します。
主な機能
- 01クラス・メタデータ・バイナリ情報の抽出
- 02呼び出し経路とAPIの追跡
- 03認証情報やクラウドキーのスキャン
- 04サードパーティSDKとバージョンの特定
- 05改ざん対策とセキュリティパターンの確認
- 06構造化された分析文書の作成
活用シーン
- 01IPAやMach-Oのアプリ構造を調査
- 02アプリ内のネットワークAPIを記録
- 03バイナリの認証情報とセキュリティリスクを確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ incogbyte/ ios-reverse-engineering-claude-skill --skill ios-reverse-engineeringインストール後、Claude Code で/ios-reverse-engineeringを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/anti-tampering-patterns.mdapi-extraction-patterns.mdcall-flow-analysis.mdclass-dump-usage.mdcloud-secrets-patterns.mdreversing-tools-guide.mdsdk-fingerprinting.mdsetup-guide.mdvulnerability-patterns.mdscripts/audit-vulnerabilities.shcheck-deps.shdeep-secret-scan.shdetect-protections.shdetect-sdks.shextract-ipa.shfind-api-calls.shinstall-dep.shreversing-analyze.shscripts/ghidra/DecompileAllFunctions.javaExportAPICalls.javaExportCryptoUsage.javaExportStringXrefs.javaFindSecrets.javascripts/lib/plist.sh詳細
iOS リバースエンジニアリング
ipsw(blacktop/ipsw)、otool、strings、radare2/rizin、Ghidra headless を使用して、iOS の IPA ファイル、.app バンドル、Mach-O バイナリ、ダイナミックライブラリ、フレームワークを抽出して分析します。アプリケーションコードの呼び出しフローを追跡し、セキュリティパターンを分析し、クラウドプロバイダーの認証情報(Firebase、GCP、AWS、Azure)を詳細にスキャンし、逆コンパイルや Ghidra headless スクリプトによる LLM 支援のバイナリリバースエンジニアリングを実施します。バージョン検出と CVE 照合により、組み込まれたサードパーティ SDK のフィンガープリントを特定し、改ざん防止機能(難読化ツール、デバッグ対策、dylib インジェクション防止、整合性チェック、脱獄検出)を検出します。抽出した API とセキュリティ上の所見を体系的に文書化します。Swift と Objective-C の両方のアプリケーションに対応しています。
前提条件
このスキルには、ipsw(class-dump 機能などを含む)が必要です。また、macOS では、Xcode Command Line Tools に含まれる標準開発ツール(otool、strings、plutil、codesign)が必要です。詳細なバイナリ分析には、radare2(または rizin)を推奨します。高度な逆コンパイルには、Ghidra headless を任意で使用できます。Linux では、ipsw がクロスプラットフォームの Mach-O 分析、entitlements、class-dump、スライス化を提供し、libplist/plistutil(または python3 の plistlib)が plist の解析を、binutils が strings/nm を提供します。otool/codesign/plutil/PlistBuddy/lipo は macOS 専用です。スクリプトは自動的に ipsw/plistutil/python3 にフォールバックするため、Linux では macOS ツールは不要です。依存関係チェッカーを実行して確認してください。
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/check-deps.sh
不足しているものがあれば、${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/setup-guide.md のインストール手順に従ってください。
ワークフロー
フェーズ 1:依存関係の確認とインストール
分析を始める前に、必要なツールが利用可能か確認し、不足しているものがあればインストールしてください。
アクション:依存関係チェック用スクリプトを実行します。
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/check-deps.sh
出力には、機械で読み取り可能な次の行が含まれます。
INSTALL_REQUIRED:<dep>— 続行する前にインストールが必要ですINSTALL_OPTIONAL:<dep>— 推奨されますが、必須ではありません
必須の依存関係が不足している場合(終了コード 1)、自動的にインストールします。
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/install-dep.sh <dep>
インストールスクリプトは OS とパッケージマネージャーを検出し、次のように処理します。
- Homebrew が利用可能な場合は、Homebrew 経由でインストールします(
brew install blacktop/tap/ipsw) - 利用できない場合は、GitHub のリリースから
~/.local/share/にダウンロードし、~/.local/bin/にシンボリックリンクを作成します - インストールに失敗すると、正確な手動インストールコマンドを表示してコード 2 で終了します。これらの手順をユーザーに提示してください
任意の依存関係については、インストールするかユーザーに確認してください。より詳細な分析には jtool2 と frida を推奨します。
インストール後、check-deps.sh を再実行して、すべての準備が整っていることを確認してください。必須の依存関係がすべて OK になるまで、フェーズ 2 に進まないでください。
フェーズ 2:クラスを抽出してダンプする
抽出スクリプトを使用して、対象ファイルを処理します。このスクリプトは、IPA、.app、Mach-O、.dylib、.framework ファイルに対応しています。
操作:抽出スクリプトを実行します。
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/extract-ipa.sh [OPTIONS] <file>
IPA ファイルの場合:スクリプトは ZIP アーカイブを展開し、Payload/ 内の .app バンドルを探して、メインの Mach-O バイナリを特定し、ipsw class-dump を実行します。また、Info.plist、エンタイトルメント、埋め込みフレームワーク、文字列定数、Mach-O ヘッダーフラグ(macho-flags.txt — PIE/ハードニングランタイムの指標)、Apple のプライバシーマニフェスト(PrivacyInfo.xcprivacy。存在する場合は分析ルートにコピー)を抽出します。
.app バンドルの場合:スクリプトはバンドルディレクトリを直接処理します(IPA と同じ成果物が生成されます)。
Mach-O バイナリ、.dylib、および .framework ファイルの場合:スクリプトは ipsw class-dump と文字列の抽出を直接実行します。
Linux では、Mach-O の成果物(load-commands.txt、linked-libraries.txt、symbols.txt、macho-flags.txt、objc-info.txt、エンタイトルメント)は、otool/codesign/lipo/nm の代わりに ipsw macho info を使って生成され、plist は python3 の plistlib/plistutil を使って読み取られます。出力は macOS での実行結果と同等です。
オプション:
-o <dir>— カスタム出力ディレクトリ(デフォルト:<filename>-analysis)--no-classdump— クラスダンプをスキップ(高速化、メタデータのみの分析)--thin <arch>— fat バイナリから特定のアーキテクチャを抽出(例:arm64)--swift-demangle— 出力内の Swift シンボルをデマングル
ipsw class-dump の詳細なリファレンスについては、${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/class-dump-usage.md を参照してください。
フェーズ 3:構造を分析する
抽出した出力を確認し、アプリのアーキテクチャを把握します。
操作:
-
<output>/Info.plistの Info.plist を読み取ります:- バンドル識別子(
CFBundleIdentifier)を特定します - iOS の最小バージョン(
MinimumOSVersion)を確認します - URL スキーム(
CFBundleURLTypes)を探します - App Transport Security の設定(
NSAppTransportSecurity)を確認します - バックグラウンドモード(
UIBackgroundModes)を探します - プライバシー関連の使用目的の説明(カメラ、位置情報など)を確認します
- バンドル識別子(
-
<output>/entitlements.plistのエンタイトルメントを確認します:- Keychain のアクセスグループ
- App グループ
- プッシュ通知のエンタイトルメント
- 関連付けられたドメイン(ユニバーサルリンク)
-
<output>/class-dump/にある ipsw class-dump の出力を調査します:- ViewController を特定します。これらは UI のエントリーポイントです
API、Network、Service、Client、Manager、Repositoryを名前に含むクラスを探します- アプリのコードとフレームワークのコードを区別します
- アーキテクチャパターン(MVC、MVVM、VIPER、Coordinator)を特定します
-
<output>/frameworks/にある埋め込みフレームワークを一覧表示します:- サードパーティ製フレームワーク(Alamofire、AFNetworking、Firebase など)を特定します
- ネットワークコードを含む可能性のあるカスタムフレームワークに注目します
-
アーキテクチャパターンを特定します:
- MVC:ネットワークコードを直接含む ViewController
- MVVM:バインディングパターンを持つ ViewModel クラス
- VIPER:Interactor、Presenter、Router クラス
- Coordinator:ナビゲーションを管理する Coordinator/Flow クラス
- これにより、次のフェーズでネットワーク呼び出しを調べる場所がわかります
フェーズ 4:呼び出しフローを追跡する
ユーザー向けのエントリーポイントからネットワーク呼び出しまで、実行パスをたどります。
アクション:
-
エントリーポイントから始める:フェーズ 3 で特定したメインの ViewController または AppDelegate を読みます。
-
初期化チェーンをたどる:
AppDelegate.application(_:didFinishLaunchingWithOptions:)または@main App構造体で、HTTP クライアント、ベース URL、DI フレームワークを設定していることがよくあります。まずこれを読みます。 -
ユーザーアクションを追跡する:ViewController から、次の順にたどります。
viewDidLoad()→ セットアップ → IBAction/ボタンターゲット- IBAction/ターゲット → ViewModel/Presenter メソッド
- ViewModel → Repository/Service → API クライアント
- API クライアント → URLSession/Alamofire の呼び出し
-
DI とサービスの生成場所を特定する:ネットワーキングサービスがインスタンス化される場所を探します。
- Swinject コンテナー
- init パラメーターを介した手動の依存性注入
- シングルトンパターン(
shared、default、instance)
-
Swift の名前マングリングに対処する:シンボルがマングルされている場合は、strings の出力と ipsw class-dump ヘッダーを手掛かりとして使います。最適化されたビルドでも、プロトコル適合とプロパティ名は読み取れます。
詳しい手法と grep コマンドについては、${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/call-flow-analysis.md を参照してください。
フェーズ 5:API を抽出して記録する
すべての API エンドポイントを探し、構造化されたドキュメントを作成します。
アクション:API 検索スクリプトを実行して、広範囲に検索します。
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/find-api-calls.sh <output>/
追加オプション:
--context N— 各一致箇所の前後に N 行のコンテキストを表示します(推奨:--context 3)--report FILE— 結果を構造化された Markdown レポートとしてエクスポートします--dedup— エンドポイント/URL ごとに結果を重複排除します
対象を絞った検索:
# Only URLSession patterns
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/find-api-calls.sh <output>/ --urlsession
# Only Alamofire/AFNetworking
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/find-api-calls.sh <output>/ --alamofire
# Only hardcoded URLs
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/find-api-calls.sh <output>/ --urls
# Only auth patterns
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/find-api-calls.sh <output>/ --auth
# Only Combine/async-await patterns
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/find-api-calls.sh <output>/ --swift-concurrency
# Only GraphQL patterns
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/find-api-calls.sh <output>/ --graphql
# Only WebSocket patterns
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/find-api-calls.sh <output>/ --websocket
# Only security patterns (ATS, cert pinning, jailbreak detection)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/find-api-calls.sh <output>/ --security
# Full analysis with context and Markdown report
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/find-api-calls.sh <output>/ --context 3 --dedup --report report.md
次に、見つかった各エンドポイントについて、周辺のソースコード/文字列を読み、次の情報を抽出します。
- HTTP メソッドとパス
- ベース URL
- パスパラメーター、クエリパラメーター、リクエストボディ
- ヘッダー(特に認証)
- レスポンスタイプ
- 呼び出し元(フェーズ 4 の呼び出しチェーン)
次の形式で各エンドポイントを記録します。
### `METHOD /path`
- **Source**: `MyApp.APIService` (class-dump header or strings reference)
- **Base URL**: `https://api.example.com/v1`
- **Path params**: `id` (String)
- **Query params**: `page` (Int), `limit` (Int)
- **Headers**: `Authorization: Bearer <token>`
- **Request body**: `{ "email": "string", "password": "string" }`
- **Response**: `Codable struct User`
- **Called from**: `LoginViewController → LoginViewModel → AuthService → APIClient`
ライブラリ固有の検索パターンとドキュメントテンプレート全体については、${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/api-extraction-patterns.md を参照してください。
フェーズ 6:セキュリティ分析
抽出したアプリで、セキュリティに関係するパターンを検索します。
アクション:セキュリティに重点を置いた検索を実行します。
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/find-api-calls.sh <output>/ --security --context 3
次の項目を探して、フラグを立てます。
- App Transport Security(ATS)の例外 —
NSAllowsArbitraryLoads、NSExceptionAllowsInsecureHTTPLoadsを含むNSExceptionDomains - 証明書ピンニングの無効化 — 常に信頼するカスタムの
URLAuthenticationChallenge処理、ServerTrustPolicy.disableEvaluation - 露出した秘密情報 — 文字列または class-dump の出力にあるハードコードされたパスワード、API キー、暗号化キー
- 脱獄検出の回避 —
/Applications/Cydia.app、canOpenURL("cydia://")、/bin/bashの存在確認 - 脆弱な暗号化 — MD5 ハッシュ、ECB モード、ハードコードされた IV/キー、CC_MD5 の使用
- Keychain の誤用 —
kSecAttrAccessibleAlways、アクセス制御フラグの欠如 - デバッグフラグ —
#if DEBUGの成果物、ステージング URL、詳細なログ記録 - プライバシー — クリップボードへのアクセス、ペーストボードの監視、同意のないトラッキング
セキュリティパターンの全リストについては、${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/api-extraction-patterns.md を参照してください。
Phase 7: LLM による詳細なシークレットおよび認証情報の分析
バイナリに埋め込まれたクラウドプロバイダーの認証情報、API キー、シークレットを包括的にスキャンします。LLM が各検出結果を分析して分類し、リスクを評価し、修正方法を提示します。
アクション:詳細なシークレットスキャナーを実行します。
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/deep-secret-scan.sh <output>/ --report secrets-report.md
誤検出の最小化(組み込み):スキャナーは grep の行ではなく値からシークレット候補を抽出し、重複を排除するため、3 つのファイルに含まれるシークレットも検出結果は 1 件になります。各候補は次の条件に照らして検証されます。
- プレースホルダーの許可リスト(
AKIAIOSFODNN7EXAMPLE、your_key、別の低重要度パターンで扱うsk_test/pk_test、<...>、placeholderなど)→ INFO に引き下げ - プロバイダーごとの厳格な形式/文字セットのチェック(AWS は
AKIA+ 16 文字、GCP はAIza+ 35 文字、Stripe はプレフィックス + 24 文字、JWT は 3 セグメントのヘッダーなど)→ 不一致の場合は FP の可能性が高まる - シャノンエントロピー(約 3.0 ビット/文字未満 → シークレットではなくバイナリアーティファクトの可能性が高い)
- クライアントセーフフラグ(Firebase API Key、Stripe の公開可能キー、Mapbox のパブリックキー、Infura/Alchemy →
client-safe=yes、critical から medium に引き下げ)
すべての検出結果には FP の可能性(Low/Medium/High)と client-safe タグが付与されます。フィルタリングをすべて無効にして総当たりでトリアージするには --raw を使用します(一致結果には引き続き FP の可能性がタグ付けされます)。設定を示す情報(SDK のクラス名、エンドポイント URL)は INFO として報告され、critical/high の合計から除外されます。
# Brute-force: keep every match (placeholders still listed, tagged FP:High)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/deep-secret-scan.sh <output>/ --raw --severity info --report secrets-raw.md
対象を絞ったスキャン:
# Firebase / Google only
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/deep-secret-scan.sh <output>/ --firebase
# AWS only
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/deep-secret-scan.sh <output>/ --aws
# Azure only
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/deep-secret-scan.sh <output>/ --azure
# GCP only
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/deep-secret-scan.sh <output>/ --gcp
# Payment providers (Stripe, PayPal, RevenueCat)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/deep-secret-scan.sh <output>/ --payments
# Messaging (Twilio, SendGrid, Slack, OneSignal)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/deep-secret-scan.sh <output>/ --messaging
# Analytics (Sentry, Mixpanel, Amplitude, Segment)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/deep-secret-scan.sh <output>/ --analytics
# JWT tokens
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/deep-secret-scan.sh <output>/ --jwt
# Developer-platform keys (GitHub, GitLab, Mailgun, Mailchimp, Telegram, Square)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/deep-secret-scan.sh <output>/ --devtools
# Web3 keys (Infura, Alchemy, Ethereum private keys, PEM blocks)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/deep-secret-scan.sh <output>/ --web3
# Critical and high severity only
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/deep-secret-scan.sh <output>/ --severity high --report secrets-report.md
LLM による分析:スキャン完了後、レポートを読み込み、各検出結果について次の項目を確認します。
- 分類 — サービスと認証情報の種類を特定します
- クライアントセーフかどうかの評価 — Firebase API キーや Stripe の公開可能キーなど、クライアントでの使用を想定したキーもあります
- 影響範囲の特定 — 攻撃者がこの認証情報を使って何を実行できるかを確認します
- 誤検出の確認 — サンプル値、ドキュメントの文字列、テストデータを確認します
- 検証方法の提案 — 認証情報が有効かどうかをテストする安全なコマンドを提示します
- 修正方法の推奨 — ローテーション、API キーの制限、サーバー側への移動、環境設定の使用を提案します
次の形式で各検出結果を記録します。
### [SEVERITY] Service — Credential Type
- **Value**: `[first 4 chars]...[last 4 chars]` (redacted)
- **Location**: `file:line`
- **Client-safe**: Yes / No
- **Impact**: What an attacker could do
- **False positive likelihood**: Low / Medium / High
- **Validation**: How to test if active
- **Remediation**: Specific steps to fix
クラウドプロバイダーのパターン、キー形式、リスク評価の全一覧については、${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/cloud-secrets-patterns.md を参照してください。
フェーズ 8:LLM 分析によるバイナリの詳細リバースエンジニアリング
CLI リバースエンジニアリングツール(radare2/rizin または Ghidra headless)を使用して、バイナリを詳細に分析します。LLM は構造化された出力を読み取り、文字列やパターンの照合だけでは見つけられないセキュリティ上の問題を特定します。
前提条件:radare2/rizin または Ghidra がインストールされている必要があります。次のコマンドでインストールします。
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/install-dep.sh radare2
# or
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/install-dep.sh ghidra
操作:メインバイナリのリバースエンジニアリング分析を実行します。
# Full analysis (functions, strings, imports, exports, classes, security, network, crypto, auth, entropy)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/reversing-analyze.sh <main-binary> -o <output>/reversing
# Quick scan (functions + strings + imports only)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/reversing-analyze.sh --quick <main-binary> -o <output>/reversing
# Force Ghidra headless (uses Java scripts for decompilation, secret scanning, crypto analysis)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/reversing-analyze.sh --tool ghidra <main-binary> -o <output>/reversing
Ghidra Headless スクリプト:Ghidra を使用する場合、ツールは ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/ghidra/ にある専用の Java スクリプトを自動的に実行します。
DecompileAllFunctions.java— すべての関数を擬似 C にデコンパイルします(対象を絞ってデコンパイルする場合は--security-onlyを使用します)FindSecrets.java— デコンパイル済みコードから、ハードコードされた認証情報、API キー、シークレットを検索しますExportAPICalls.java— ネットワーク API シンボルを見つけ、呼び出し元をたどり、デコンパイル済みコードから URL を抽出しますExportCryptoUsage.java— 暗号関数の使用箇所を特定し、暗号関数を呼び出す関数をデコンパイルして、脆弱なパターンを検出しますExportStringXrefs.java— すべての文字列とクロスリファレンスをエクスポートし、種類(URL、認証、暗号、クラウド)ごとに分類します
対象を絞った分析:
# Focus on secret/credential handling code
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/reversing-analyze.sh --secrets <binary> -o <output>/reversing
# Focus on networking code
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/reversing-analyze.sh --network <binary> -o <output>/reversing
# Focus on crypto implementations
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/reversing-analyze.sh --crypto <binary> -o <output>/reversing
# Focus on authentication logic
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/reversing-analyze.sh --auth <binary> -o <output>/reversing
# Decompile a specific function
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/reversing-analyze.sh --decompile "sym.objc.AuthService.login" <binary> -o <output>/reversing
# Decompile all functions matching a pattern
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/reversing-analyze.sh --decompile-pattern "auth\|login\|token" <binary> -o <output>/reversing
# Cross-references to a specific function
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/reversing-analyze.sh --xrefs "sym.imp.CCCrypt" <binary> -o <output>/reversing
# Call graph for a function
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/reversing-analyze.sh --callgraph "sym.objc.NetworkManager.request" <binary> -o <output>/reversing
# Entropy analysis (detect packing/encryption)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/reversing-analyze.sh --entropy <binary> -o <output>/reversing
LLM による分析:リバースエンジニアリングツールが出力を生成したら、生成されたファイルを読み取り、分析します。
functions-secrets.txtを読む — 認証情報、キー、トークンを扱う関数を特定しますfunctions-network.txtを読む — ネットワーク層を把握し、コード内の API エンドポイントを探しますfunctions-crypto.txtを読む — 暗号の実装を特定し、脆弱なパターンがないか確認しますfunctions-auth.txtを読む — 認証フローと潜在的なバイパスを把握しますxrefs-security.txtを読む — 暗号 API/キーチェーン API が実際にどのように呼び出されるかをたどりますxrefs-network.txtを読む — ネットワーク API の呼び出し方をたどり、隠れたエンドポイントを探しますclasses-interesting.txtを読む — セキュリティ上重要なクラスとその関係を特定しますstrings-interesting.txtを読む — デコンパイル済みコードと照合します- 興味深い関数で
--decompileを使用して、詳細な分析に使う擬似コードを取得します - 主要な関数で
--callgraphを使用して、実行パスを可視化します
デコンパイル済みコードで確認すべき主な点:
- 暗号関数に渡されるハードコード値(キー、IV、ソルト)
- 認証バイパス条件(デバッグフラグ、ハードコードされた認証情報)
- 安全でないデータフロー(UserDefaults へのシークレットの保存、コンソールへのログ出力)
- 証明書ピンニングがバイパスされる可能性
- 脱獄検出ロジック(理解のためであり、バイパスするためではありません)
- 難読化された文字列の復号ルーチン
radare2/rizin/Ghidra コマンドの完全なリファレンスについては、${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/reversing-tools-guide.md を参照してください。
フェーズ 9:SDK とフレームワークのフィンガープリント
アプリケーションに組み込まれているサードパーティ製 SDK とフレームワークをすべて特定します。可能な場合はバージョンを検出し、既知の CVE と照合します。
アクション:SDK 検出スクリプトを実行します:
# Full SDK detection with CVE checking
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/detect-sdks.sh <output>/ --check-cves --report sdks-report.md
# Verbose output with match details
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/detect-sdks.sh <output>/ --verbose --check-cves
# JSON output for programmatic use
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/detect-sdks.sh <output>/ --json --check-cves
このスクリプトは、以下を検索して SDK のフィンガープリントを特定します:
Frameworks/内に組み込まれたフレームワーク名otool -Lの出力に含まれるリンク済みライブラリ- class-dump ヘッダー内のクラスプレフィックス(例:
FIR*= Firebase、STP*= Stripe) - バイナリ内の SDK 固有の文字列(ドメイン名、API パターン)
- シンボルとメタデータ
検出対象の SDK カテゴリ:ネットワーキング、アナリティクス、広告、認証、決済、プッシュ通知、マップ、ソーシャル、データベース、クラウドストレージ、UI/UX、セキュリティ、メッセージング、クラッシュレポート、A/B テスト、ディープリンク、AR/ML。
LLM による分析:検出後、以下を評価します:
- 攻撃対象領域 — 各 SDK は潜在的な攻撃ベクトルです。SDK が増えるほど、攻撃対象領域も広がります
- 古いバージョン — 検出したバージョンを CVE データベースと照合します
- API キーの安全性 — 公開されたキーがクライアントで安全に使用できるもの(Firebase API キー)か、サーバー専用のもの(Stripe シークレットキー)かを判断します
- データフローのマッピング — 各 SDK が収集するデータと、その送信先を確認します
- プライバシーコンプライアンス — トラッキング SDK について ATT(App Tracking Transparency)への準拠を確認します
- 不要な SDK — 使用されていない SDK は、メリットがないままリスクを高めます
SDK フィンガープリントの完全なデータベース、検出手法、CVE リファレンスについては、${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/sdk-fingerprinting.md を参照してください。
フェーズ 10:保護機能と改ざん防止の検出
アプリケーションで使用されているセキュリティ保護、改ざん防止メカニズム、難読化、アンチデバッグ手法を検出します。
アクション:保護機能検出スクリプトを実行します:
# Full protection analysis
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/detect-protections.sh <output>/ --report protections-report.md
# With direct binary analysis (more accurate for some checks)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/detect-protections.sh <output>/ --binary <path-to-macho-binary> --report protections-report.md
対象を絞った分析:
# Only obfuscation detection
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/detect-protections.sh <output>/ --obfuscation
# Only anti-debugging checks
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/detect-protections.sh <output>/ --debugger
# Only dylib injection prevention
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/detect-protections.sh <output>/ --injection
# Only integrity/tampering checks
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/detect-protections.sh <output>/ --integrity
# Only jailbreak detection
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/detect-protections.sh <output>/ --jailbreak
# Only binary encryption (FairPlay DRM)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/detect-protections.sh <output>/ --encryption
検出される保護の種類:
- 難読化 — 既知のツール(iXGuard、SwiftShield、OLLVM、Arxan)、クラス/メソッド名の難読化率、文字列暗号化、制御フローの平坦化
- アンチデバッグ —
ptrace(PT_DENY_ATTACH)、sysctl による P_TRACED チェック、タイミングベースの検出、例外ポートの操作、SIGTRAP ハンドラー、デバッグサーバーの検出 - Dylib インジェクションの防止 —
__RESTRICTセグメント、DYLD_INSERT_LIBRARIESのチェック、ロード済みライブラリの列挙/検証、Substrate/Frida の検出 - 整合性チェック — 実行時のコード署名検証、バイナリのハッシュによる自己チェック、チーム ID の検証、プロビジョニングプロファイルの検証、App Store レシートの検証
- 脱獄検出 — ファイルパスのチェック(Cydia、Sileo、SSH、apt)、URL スキームのチェック、サンドボックス脱出テスト(fork)、シンボリックリンクの検証、環境変数のチェック、検出ライブラリ(IOSSecuritySuite)
- バイナリ暗号化 — FairPlay DRM(LC_ENCRYPTION_INFO cryptid)、復号ツールに関するガイダンス付き
保護スコア:スクリプトは保護の全体的なレベルを評価する保護スコア(0~20)を出力します:
- 15~20:強力な保護
- 10~14:十分な保護
- 5~9:中程度の保護
- 1~4:軽度の保護
- 0:保護なし
LLM による分析:検出後、以下を評価します:
- 保護の品質 — 保護が複数層になっているか、単一障害点になっているか
- 回避の難易度 — 単一関数でのチェックか、分散されたチェックか
- 検出後の対応 — アプリがクラッシュするか、サーバーに報告するか、機能を段階的に制限するか
- 難読化の範囲 — 部分的な難読化では、機密性の高いコードが読み取れる状態で残る可能性があります
- サーバーサイドのアテステーション — クライアントサイドのチェックは回避できますが、App Attest/DeviceCheck は回避できません
保護パターンと検出手法に関する完全なリファレンスについては、${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/anti-tampering-patterns.md を参照してください。
フェーズ 11:静的脆弱性監査
抽出したアプリを監査し、パターンレベルのセキュリティスキャン(フェーズ 6)とシークレットスキャン(フェーズ 7)では対象にならない、iOS 固有の脆弱性クラスを検出します。これはそれらのフェーズを補完するもので、API 呼び出しや認証情報の値ではなく、脆弱性パターンを探します。
アクション:脆弱性監査ツールを実行します。
# Full audit across all categories, with a Markdown report
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/audit-vulnerabilities.sh <output>/ --all --report vuln-report.md
カテゴリフィルター(個別に実行するか、組み合わせて実行できます):
# Insecure local storage (UserDefaults tokens, sqlite/realm, UIFileSharingEnabled, file protection off)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/audit-vulnerabilities.sh <output>/ --storage
# WebView / JS-bridge (UIWebView, allowUniversalAccessFromFileURLs, addScriptMessageHandler, TLS-bypass)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/audit-vulnerabilities.sh <output>/ --webview
# Deeplink / URL-scheme hijack (custom schemes, token-in-callback, universal links)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/audit-vulnerabilities.sh <output>/ --deeplink
# Weak crypto / RNG (ECB, arc4random/rand for tokens, MD5/SHA1, hardcoded IV/salt)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/audit-vulnerabilities.sh <output>/ --crypto
# Biometric/local-auth, sensitive-data logging, ATS detail, privacy/tracking, entitlements, debug artifacts
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/audit-vulnerabilities.sh <output>/ --auth --logging --network --privacy --entitlements --debug
# Mach-O hardening flags (non-PIE executable, no MH_NO_HEAP_EXECUTION, hardened-runtime weakening)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/audit-vulnerabilities.sh <output>/ --hardening
# Data injection / dynamic dispatch (NSPredicate/NSExpression format strings, KVC, NSSelectorFromString/performSelector, stringWithFormat)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/audit-vulnerabilities.sh <output>/ --injection
# Insecure deserialization (NSKeyedUnarchiver unsafe APIs, decodeObject(forKey:) without NSSecureCoding)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/audit-vulnerabilities.sh <output>/ --deserialization
# Unsafe parsing / archive handling (XXE via NSXMLParser/libxml2, Zip Slip via archive libs)
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/audit-vulnerabilities.sh <output>/ --parsing
# Only high/critical findings
bash ${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/scripts/audit-vulnerabilities.sh <output>/ --all --severity high --report vuln-report.md
検出されるカテゴリ:安全でないローカルストレージ(バックアップ除外設定の欠落や、App-Group の UserDefaults によるシークレット露出も対象)、WebView/JS ブリッジ、ディープリンク/URL スキームの乗っ取り、脆弱な暗号化/乱数生成、生体認証/ローカル認証のパターン(Sign in with Apple の nonce 欠落も対象)、機密データのログ出力、ATS の詳細(NSAllowsArbitraryLoads/ForMedia、NSMinimumTLSVersion、NSRequiresForwardSecrecy)、平文通信/安全でない WebSocket、サードパーティの証明書ピンニング設定ミス(AFNetworking/TrustKit/Alamofire)と永続保存される URL 認証情報、プライバシー/トラッキング(ATT なしの IDFA、ペーストボード、画面キャプチャ、アプリスイッチャー/バックグラウンドのスナップショット漏えい、LSApplicationQueriesSchemes によるフィンガープリンティング、プライバシーマニフェスト PrivacyInfo.xcprivacy の欠落と、使用目的の説明 × API の照合)、エンタイトルメントのリスク(ライブラリ検証の無効化、App Group、共有キーチェーン)、デバッグ/ステージング用の残存物、Mach-O の強化フラグ(PIE/強化ランタイム/ライブラリ検証)、データインジェクション/動的ディスパッチ(NSPredicate/NSExpression、KVC、NSSelectorFromString/performSelector、stringWithFormat)、安全でないデシリアライズ(NSKeyedUnarchiver の安全でない API、NSSecureCoding の欠落)、安全でない解析/アーカイブ処理(NSXMLParser/libxml2 による XXE、アーカイブ展開ライブラリを介した Zip Slip)。
データインジェクションの検出結果(--injection)については、フェーズ 8 で逆コンパイルされた呼び出し箇所と照合してください。Ghidra の ExportAPICalls.java の出力である injection-callers.txt は、NSSelectorFromString/performSelector/setValueForKeyPath/predicateWithFormat/NSPredicate/NSExpression/stringWithFormat の呼び出し元をたどれるため、深刻度を上げる前に文字列が攻撃者に制御されているか確認できます。
各検出結果には、深刻度、信頼度、誤検出の可能性(低/中/高)、証拠(ファイル:行番号)が含まれます。近接性に基づく検出結果(シークレットのログ出力、UserDefaults 内のトークン、トークンに使われる乱数生成)は、1 行内の共起マッチです。つまり、1 行にトリガーとシークレットのキーワードの両方が含まれています。信頼度が中程度のシグナルとして扱い、複数行にまたがるケースも含め、周囲の関数を確認してください。欠落に基づく検出結果(NSURLFileProtectionKey なし、画面キャプチャ対策なし)は、設計上、誤検出の可能性が高くなります。
LLM による分析:監査完了後、誤検出の可能性フィールドを使って優先順位を付けます。
- まず誤検出の可能性で分類する — 誤検出の可能性が高い検出結果(欠落に基づくもの、許容度の高い近接性に基づくもの)は、対応前に手動で確認する必要があります。
- 次に深刻度 × 信頼度で分類する — 深刻度が重大/高で信頼度も高い場合は直ちに対応し、中程度の場合は調査します。
- 証拠をコードに照らして確認する — 逆コンパイル/クラスダンプの出力(フェーズ 8)で
file:line:matchを読み、悪用可能性を確認します。 - 相互参照する —
deep-secret-scan.sh(フェーズ 7)と照合して実際の認証情報の値を確認し、detect-protections.sh(フェーズ 10)と照合して、動的な確認が改ざん防止機能によって阻止されるかを確認します。
すべてのパターンについては、${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/vulnerability-patterns.md を参照してください(深刻度、誤検出に関する注記、脆弱なコード、修正方法)。
出力
ワークフローの最後に、以下を提出します。
- 抽出したアプリの内容(出力ディレクトリ内)
- アーキテクチャの概要 — アプリの構造、主要クラス、使用パターン、フレームワーク
- API ドキュメント — 検出したすべてのエンドポイントを上記の形式で記載
- 呼び出しフローマップ — UI からネットワークまでの主要な経路(特に認証と主要機能)
- セキュリティ調査結果 — ATS 設定、証明書ピンニングの状況、露出したシークレット、ジェイルブレイク検出、暗号化の問題
- クラウド認証情報レポート — 検証済みで誤検知を除外したシークレット。誤検知の可能性とクライアント安全性タグを含む(フェーズ 7)
- バイナリの詳細分析 — 逆コンパイルした関数、相互参照、暗号化分析、データフローに関する調査結果(フェーズ 8)
- SDK インベントリ — 特定したすべてのサードパーティ SDK。バージョン、カテゴリ、CVE 該当状況、リスク評価を含む(フェーズ 9)
- 保護機能の評価 — 改ざん防止メカニズム、難読化、デバッグ防止、インジェクション防止と保護スコア(フェーズ 10)
- 脆弱性監査レポート — iOS の脆弱性クラス(ストレージ+バックアップ除外+App-Group UserDefaults、WebView、ディープリンク、暗号化、認証+Sign-in-with-Apple の nonce、ログ記録、ATS+証明書ピンニングの設定ミス+永続化された認証情報、プライバシー+プライバシーマニフェスト/使用目的の説明との照合+バックグラウンドスナップショット+LSApplicationQueriesSchemes、エンタイトルメント、デバッグ、Mach-O のハードニング、データインジェクション/動的ディスパッチ、安全でないデシリアライズ、安全でない解析/アーカイブ処理)について、深刻度、確信度、誤検知の可能性、証拠を含む(フェーズ 11)
find-api-calls.sh、deep-secret-scan.sh、detect-sdks.sh、detect-protections.sh で --report report.md を使用すると、構造化された Markdown レポートを自動生成できます。
参考資料
${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/setup-guide.md— ipsw、jtool2、frida、および任意のツールのインストール${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/class-dump-usage.md— ipsw class-dump CLI のオプション、Swift のサポート、Mach-O 分析${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/api-extraction-patterns.md— ライブラリ固有の検索パターンとドキュメントテンプレート${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/call-flow-analysis.md— iOS アプリの呼び出しフローを追跡する手法${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/cloud-secrets-patterns.md— クラウドプロバイダーの認証情報パターン(Firebase、GCP、AWS、Azure、Stripe、GitHub、GitLab、web3 など)と誤検知の最小化${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/reversing-tools-guide.md— CLI リバースエンジニアリングツールのリファレンス(radare2、rizin、Ghidra headless)${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/sdk-fingerprinting.md— SDK フィンガープリントデータベース、クラスプレフィックス、バージョン抽出、CVE リファレンス${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/anti-tampering-patterns.md— 改ざん防止、難読化、デバッグ防止、インジェクション防止のパターン${CLAUDE_PLUGIN_ROOT}/skills/ios-reverse-engineering/references/vulnerability-patterns.md— iOS の脆弱性クラス(ストレージ、WebView、ディープリンク、暗号化、認証、ログ記録、ATS、プライバシー、エンタイトルメント、デバッグ、Mach-O のハードニング、データインジェクション/動的ディスパッチ、安全でないデシリアライズ、安全でない解析/アーカイブ処理)。誤検知に関する注記と修正方法を含む