frida-android-hooks について
frida-android-hooksは、FridaでAndroidのJava、Kotlin、JNIの動作を調べるスキルです。環境確認、フック手法、コード探索、一般的なセキュリティチェックの分析を扱います。
主な機能
- 01Fridaの環境確認とプロセス選択
- 02Javaメソッドとコンストラクターのフック
- 03クラスローダーとメソッドの探索
- 04TLSと完全性チェックの調査
活用シーン
- 01起動時や実行中のアプリ動作の確認
- 02Javaスタックトレースによる呼び出し元の追跡
- 03難読化または動的ロードされたクラスの調査
- 04TLSの信頼経路とピンニングの確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ rudra-ravi/ frida-skills --skill frida-android-hooksインストール後、Claude Code で/frida-android-hooksを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yamlreferences/android-patterns.md
詳細
Frida Android Hooks
Android の Java/Kotlin/JNI の動作を計測する場合は、このスキルを使用します。
セットアップの確認
- ホストとデバイスのバージョンが一致していることを確認します:
frida --version adb shell /data/local/tmp/frida-server --version frida-ps -Uai - 初期化の早い段階で処理する場合は spawn を使用します:
frida -U -f com.example.app -l agent.js --no-pause - アプリ起動後に到達可能な動作には attach を使用します:
frida -U -n com.example.app -l agent.js
Java フックのパターン
Java.perform(() => {
const Target = Java.use("com.example.Target");
Target.method.overload("java.lang.String").implementation = function (value) {
console.log("[Target.method]", value);
const result = this.method(value);
console.log("[Target.method] ->", result);
return result;
};
});
Android のルール
- ネイティブ API のみを使用する場合を除き、必ず
Java.perform()内でフックします。 - オーバーロードを明示的に解決します。曖昧なメソッド名に依存しないでください。
- コンストラクターは
$initを通じてフックします。 - Kotlin では、コンパニオンクラス、合成メソッド、デフォルト引数用ヘルパー、難読化された名前を想定します。
- クラスが見つからない場合は、クラスローダーを調べ、対象クラスを認識できるアプリのローダーを
Java.classFactory.loaderに設定します。 - ネイティブメソッドの場合は、ロード済みの
.soと JNI シンボルを特定してからfrida-native-hooksに引き継ぎます。
実践的なパターン
- 難読化されたコードでは、まず URL/リクエストビルダー、JSON パーサー、Base64、暗号、SharedPreferences、キーストア、ファイル I/O、WebView、クラスのロード、ネイティブライブラリのロードなど、意味のあるプラットフォーム境界をフックします。
- シグナルの強いフックで Java のスタックトレースを記録し、アプリ固有のフックを作成する前に、アプリ側の呼び出し元を特定します。
- バイト配列は慎重に変換します。有効な場合に限り、16 進数と UTF-8/ASCII の両方を出力します。暗号のバイナリデータは、多くの場合テキストではありません。
- クラスが遅れて出現する場合は、リフレクションと動的ロードをフックします:
Class.forName、ClassLoader.loadClass、DexClassLoader、PathClassLoader、Runtime.loadLibrary*。 - TLS/ピンニングでは、バイパスする前に実際のスタックを特定します:OkHttp/CertificatePinner、TrustManager、Conscrypt、WebView、Flutter/BoringSSL、またはネイティブのカスタム検証。
- ルート化/エミュレーター/完全性チェックのバイパスでは、盲目的に大規模なスクリプトを最終回答として使わないでください。チェックの特定には使い、その後は対象の動作を変える最小限のフックだけを残します。
検出用スニペット
Java.perform(() => {
const groups = Java.enumerateMethods("*crypto*!*/isu");
console.log(JSON.stringify(groups, null, 2));
});
Java.perform(() => {
Java.enumerateClassLoaders({
onMatch(loader) {
try {
Java.classFactory.loader = loader;
Java.use("com.example.Target");
console.log("loader:", loader);
} catch (_) {}
},
onComplete() {}
});
});
ピンニングと認証の作業
- 公開されているバイパス用スニペットは、最終的な証明ではなく、調査のための手がかりとして扱います。
- 実際の信頼経路を特定します:プラットフォームの TrustManager、OkHttp、Conscrypt、WebView、ネイティブ TLS、カスタム署名、またはバックエンドのチャレンジ。
- 信頼性の判定を置き換える前に、入力と出力を記録します。
- 証拠を保持します:フックしたクラス、スタックトレース、エンドポイント、観測した証明書またはハッシュのデータ、アプリのバージョン。
参考資料
オーバーロード、コンストラクター、クラスローダー、JNI、OkHttp、WebView、spawn のタイミングに関するパターンについては、references/android-patterns.md を参照してください。
コメント
Markdown 対応