
phantom-frida v17.16.4-20260816-run36.1
ソースから検出回避Fridaサーバをビルド。約90のパッチが16の検出ベクトルをカバー、毎週ランダムな名前で自動ビルド。
phantom-frida
phantom-frida は、Android Frida Server と Gadget をソースからビルドし、対象となる一連の観測可能なランタイム識別子を変更します。これはビルダー兼検証ハーネスであり、すべてのアプリケーション固有の検出方法が打ち負かされることを約束するものではありません。
現在の互換性ターゲットは、Android 上の Frida 17.16.4 です。他の Frida バージョンは、ソース契約、完全なビルド、およびルート化デバイスの受理が繰り返されるまでは意図的に未検証として扱われます。
このプロジェクトは、あなたが所有するかテストを許可されたアプリケーションとデバイスでのみ使用してください。
検証されていること
リポジトリは3種類のエビデンスを区別します:
- ユニットテストとフィクスチャテストは、入力処理、厳密な Frida 17.16.4 ソースパッチ契約、DEX 再構築、アーティファクトプロモーション、メタデータ、ワークフロー、および障害動作を検証します。
build.py --verifyは Server と Gadget の両方を必要とし、ステージングされた Gadget をストリップし、その後、いずれかのアーティファクトを公開する前に既知の禁止ランタイムマーカーを拒否します。scripts/android_smoke.pyは、1台のルート化デバイス上でビルドされたアーティファクトを実行します。認証された abstract-UNIX トランスポート、標準クライアント RPC、spawn、attach、Java ブリッジアサーション、/procチェック、外部ルートメモリスキャン、および個別にロードされた Gadget を含みます。
ソーステストまたはバイトスキャンに合格しても、ランタイムステルスと同等ではありません。Android の動作に関する主張には、生成された編集済みのスモークテストレポートを含める必要があります。
GitHub Actions によるビルド
Actions タブから Build Custom Frida を実行します。再利用可能なビルドワークフロー:
- ユーザー制御のすべてのビルド入力を検証します;
- Google から Android NDK r29 をダウンロードし、公開されているチェックサムを検証します;
- パッチ適用済みソースをキャッシュするのではなく、新しいアップストリームソースツリーをクローンします;
- ハードアーティファクトとマーカーゲートを通過した後にのみ Gadget シンボルをストリップしてアップロードします;
- 1つのビルドアーティファクトに
build-info.jsonとSHA256SUMSを含めます。
週次ワークフローは、認証された GitHub API を介して最新リリースを解決し、同じ読み取り専用ビルドワークフローを呼び出し、ダウンロードしたアーティファクトを検証して証明し、最終ジョブにのみリリース書き込み権限を付与します。
ローカルビルド
要件:
- Ubuntu 22.04 以降(WSL 対応);
- Python 3.10 以降;
- Git、curl、unzip、C/C++ ツールチェーン、JDK 17、Node.js 18 以降(CI は Node.js 24.13.1 を使用);
android.jarと D8 を含む Android SDK プラットフォームおよびビルドツール;- 約 20 GB の空きディスク容量。
--ndk-path を省略した場合、ビルダーは build/ の下に Android NDK r29 をダウンロードします。検証済みの固定入力 arm64 ビルドは次のとおりです:
export ANDROID_SDK_ROOT=/path/to/Android/Sdk
python3 build.py \
--version 17.16.4 \
--name oemcodec \
--arch android-arm64 \
--port 27142 \
--extended \
--strict-wx \
--verify
便利なオプション:
--version, -v Exact Frida semantic version (required)
--name, -n Lowercase replacement name, 3-20 characters
--arch, -a One or more supported Android architectures
--port, -p Listening port; omitted keeps 27042
--extended, -e Apply the optional extended identifier transformations
--strict-wx Harden Frida-owned persistent anonymous RWX mappings on Android
--temp-fixes Apply opt-in, device-specific stability changes
--verify Reject known forbidden markers in final artifacts
--skip-build Patch source without compiling
--skip-clone Use an existing source tree in the work directory
--ndk-path Use an existing Android NDK r29 directory
出力と来歴
上記の例の場合、output/ には以下が含まれます:
oemcodec-server-17.16.4-android-arm64
oemcodec-server-17.16.4-android-arm64.gz
oemcodec-gadget-17.16.4-android-arm64.so
oemcodec-gadget-17.16.4-android-arm64.so.gz
build-info.json
SHA256SUMS
build-info.json は、正確なビルダー、Frida、frida-core のコミット、NDK バージョン、UTC ビルド時刻、アーキテクチャ、名前、ポート、厳密な W^X コードプールモード、および Actions でビルドされた場合のワークフロー URL を記録します。使用前にダウンロードしたバイナリファイルを検証してください:
cd output
sha256sum --check SHA256SUMS
python3 -m json.tool build-info.json >/dev/null
公開週次リリースには、GitHub ビルド来歴証明も付与されます。SHA256SUMS は1つの出力セットを識別します。バイナリハッシュは異なるビルドホスト間で一致することは想定されていません。
標準クライアント互換性
ビルダーは、re.frida.* 以下の D-Bus プロトコルインターフェース、/re/frida/GadgetSession パス、パブリックな大文字 Frida JavaScript API 文字列、および標準クライアントが必要とする生成された C ABI シンボルを保持します。これらの値を変更すると、通常の Frida クライアント/サーバー契約が破られます。
D-Bus サービス識別子、ヘルパー JNI パッケージ、zymbiote ソケットプレフィックス、選択されたプロセス/ライブラリ/パス識別子、選択されたスレッド名、およびオプションのカスタムポートは、ビルダーが変換できる別個の実装詳細です。出力検証ツールは、この明示的なマーカーセットを拒否します:
frida\0
frida-zymbiote
re/frida/HelperBackend
frida-server
frida-helper
frida-agent
frida-gadget
frida-eternal-agent
frida-generate-certificate
frida-main-loop
frida:rpc
FridaScriptEngine
GLib-GIO
GDBusProxy
GumScript
Frida/
gum-js-loop
gmain\0
gdbus\0
pool-frida
pool-spawner
jit-cache\0
正確な公開 API 文字列 Frida\0 と許可リストに登録された re.frida.* プロトコル識別子は、意図的に保持されたままです。HTTP/Inspector プレフィックス Frida/ は検証エラーであり、独立して名前が変更されます。
ルート化 Android 受理
build-info.json に記録された正確な Python バインディングをインストールし、固定された Java ブリッジ依存関係をインストールし、1台のルート化された Android デバイスを接続します:
python3 -m pip install "frida==17.16.4" frida-tools
npm ci --ignore-scripts
python3 scripts/android_smoke.py \
--server output/oemcodec-server-17.16.4-android-arm64 \
--gadget output/oemcodec-gadget-17.16.4-android-arm64.so \
--name oemcodec \
--port 27142 \
--package com.example.app \
--ndk build/android-ndk-r29 \
--report android-smoke-report.json
パッケージは、テストを許可されたインストール済みの Java アプリケーションである必要があります。ハーネスは、Frida 17 が必要とする明示的な frida-java-bridge を使用して test_comprehensive.js をコンパイルします。Server と Gadget はそれぞれ、ランダムな認証済み abstract-UNIX ソケットで待機します。それらのホスト TCP ポートは ADB フォワードとしてのみ存在し、デバイス TCP リスナーは公開されません。ハーネスはまた、Frida 自身のプロセスビューの外部で、/proc/<pid>/mem を介してマッピングされたエージェントと Gadget イメージをスキャンする、ABI が一致するルートプローブをコンパイルします。終了時にプロセス、フォワード、リモートテストディレクトリをクリーンアップします。/proc ゲートはまた、レガシーな linjector ファイル記述子名と非ゼロの TracerPid を拒否します。
Frida Gadget 設定は、ライブラリの隣に lib<name>-gadget.config.so として名前を付ける必要があります。ハーネスがこのファイルを生成してデプロイします。
開発チェック
python -m pip install --requirement requirements-dev.txt
npm ci --ignore-scripts
python -m pytest
ruff check .
ruff format --check .
mypy build.py patches.py namegen.py scripts
node --check test_comprehensive.js
bash -n build-wsl.sh
go run github.com/rhysd/actionlint/cmd/[email protected]
完全な証拠要件については、CONTRIBUTING.md を参照してください。
リポジトリ構成
build.py Clone, patch, compile, verify, and collect artifacts
patches.py Source and same-length binary transformations
namegen.py Seeded build-name and port generation
scripts/android_smoke.py Rooted Android Server/Gadget acceptance harness
test_comprehensive.js Structured Frida 17 Java bridge assertions
tests/ Unit, contract, fixture, and workflow tests
.github/workflows/ CI, CodeQL, reusable build, and release isolation
既知の制約
- 現在の検証ターゲットは Frida 17.16.4 のみです。すべての 17.x または 16.x リリースに対するサポートは推測されません。
--temp-fixesはランタイム動作を変更し、オプトインのままです。- マーカーが存在しないことは、動作、整合性、タイミング、またはアプリケーション固有の検出に対する耐性を証明するものではありません。
- 標準クライアント互換性は、公開 ABI/プロトコル動作を保持します。アクティブなプロトコルプロービングとコード整合性チェックは、依然としてインストルメンテーションを識別する可能性があります。
- このビルダーは、root、自動アプリ起動、Interceptor コード変更、ユーザースクリプト文字列、またはリモートアテステーションによって報告される障害を隠しません。
--strict-wxは、Android インジェクターの実行可能コードを書き込み可能なデータおよびスタックページから分離し、Gum の永続的な RWX コードプールを無効にし、GumJS のNativeCallbackクロージャコードを専用の RX ページに配置し、libffi ストレージを RW に保ち、新しく生成されたコードを RX として確定します。一致するリモート libc が利用できない場合、Android インジェクターはアップストリームの RWX フォールバックを使用する代わりに、クローズ状態で失敗します。既に RWX であったページは保持され、ユーザースクリプトによる明示的な RWX メモリ要求は拒否されません。ランタイムの/proc/mapsサンプルは、実行可能コードのパッチ中に一時的な RWX 権限変更が発生しないことを証明するものではありません。- 外部メモリゲートは、マッピングされたエージェント/Gadget イメージをその明示的なマーカーセットに対してスキャンします。すべての匿名ヒープページの汎用スキャンではありません。
- Frida 17 の raw エージェントは、明示的なブリッジインポートまたはバンドルが必要です。ハーネスは
frida.Compilerを使用します。Frida REPL とトレーサーは、独自のバンドルされたブリッジを提供します。
クレジットとライセンス
ビルダーコードは MIT ライセンスです。生成されたバイナリはアップストリームのライセンスを保持します。THIRD_PARTY_NOTICES.md を参照してください。