frida-ios-hooks について
Objective-C、Swift、ネイティブコードで構築された iOS アプリを調査・計装する Frida スキルです。セキュリティ実務者向けに、ランタイム確認、フックの発見、証明書ピンニングやジェイルブレイク環境のトラブルシューティングを案内します。
主な機能
- 01Objective-C ランタイムフック
- 02Swift とネイティブシンボルの調査
- 03モジュールとクラスの列挙
- 04ネットワークピンニングの調査
- 05rootless ジェイルブレイクの設定メモ
活用シーン
- 01iOS アプリのネットワークリクエスト調査
- 02Swift またはネイティブ関数の特定
- 03証明書ピンニング経路の調査
- 04Frida のアタッチ問題の診断
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ rudra-ravi/ frida-skills --skill frida-ios-hooksインストール後、Claude Code で/frida-ios-hooksを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yamlreferences/ios-patterns.md
詳細
Frida iOS フック
iOS の Objective-C、Swift、またはネイティブの動作を計測する際に、このスキルを使用します。
セットアップの確認
frida --version
frida-ps -Uai
frida -U -f com.example.app -l agent.js --no-pause
ランタイムが利用可能であることを確認します。
console.log("ObjC.available =", ObjC.available);
console.log(Process.platform, Process.arch);
iOS アプリで ObjC.available が false の場合、スクリプトに問題があると判断する前に frida-troubleshooting を使用してください。
Objective-C のフックパターン
if (ObjC.available) {
const cls = ObjC.classes.NSURLSession;
const method = cls["- dataTaskWithRequest:completionHandler:"];
Interceptor.attach(method.implementation, {
onEnter(args) {
const request = new ObjC.Object(args[2]);
console.log("[NSURLSession]", request.URL().toString());
}
});
}
Swift とネイティブのルール
- Swift のマングル名を推測する前に、モジュールとシンボルを列挙します。
- 可能であれば、Objective-C から参照可能な Swift を ObjC クラス経由でフックします。
- 純粋な Swift/ネイティブ関数については、シンボルを解決し、
frida-native-hooksを使用します。 - フックをアプリデリゲート、ネットワークスタック、または改ざん防止の初期化より前に実行する必要がある場合は、スポーンします。
- 信頼性評価、暗号化、署名の生成、リクエストの構築については、結果を変更する前に観察フックを優先します。
実践パターン
- 利用可能な場合は、デリゲート、URL ローディング、キーチェーン、ペーストボード、ファイル API、暗号化ラッパー、脱獄検出セレクターなど、Objective-C ランタイムのサーフェスから始めます。
- Swift を多用するアプリでは、モジュール/シンボルの列挙と呼び出し元のスタックトレースを使用します。Swift が Objective-C に公開していない限り、セレクターが存在すると仮定しないでください。
- ピンニングについては、Objective-C フレームワークとネイティブの
Security/BoringSSL/CommonCrypto の両方の経路を確認します。アプリでは両方が混在していることがよくあります。 - 発見には ObjC メソッドオブザーバーなどの CodeShare ツールを使用し、クラス名/メソッド名が判明したら、対象を絞ったフックに置き換えます。
- rootless 脱獄環境では、セットアップの失敗とフックの不具合を混同しないよう、「ランタイムが利用可能」かどうかを確認する最小限のスクリプトを、実際のエージェントとは別に用意します。
検出用スニペット
if (ObjC.available) {
for (const name of Object.keys(ObjC.classes).filter(n => n.includes("Trust"))) {
console.log(name);
}
}
for (const m of Process.enumerateModules()) {
if (m.name.includes("Target")) console.log(m.name, m.base, m.path);
}
ピンニングと rootless に関する注意点
- ピンニングが
NSURLSession、SecTrustEvaluate*、サードパーティ製フレームワーク、ネイティブのカスタムコードのどこにあるかを特定します。 - rootless 脱獄環境では、Frida パッケージのバージョンを揃え、正しいブートストラップパスを設定し、ツールを更新する必要がある場合があります。バージョンの不整合は、アタッチの失敗や ObjC ブリッジの欠落のように見えることがよくあります。
- 通常のアタッチがブロックされていて、アプリの変更が許可されている場合は、Gadget を使用します。
参考資料
Objective-C、Swift のシンボル、SecTrust、モジュール、および rootless のトラブルシューティングパターンについては、references/ios-patterns.md を参照してください。
コメント
Markdown 対応