
ソースから検出回避Fridaサーバをビルド。約90のパッチが16の検出ベクトルをカバー、毎週ランダムな名前で自動ビルド。
phantom-frida は、Android Frida Server と Gadget をソースからビルドし、対象となる一連の観測可能なランタイム識別子を変更します。これはビルダー兼検証ハーネスであり、すべてのアプリケーション固有の検出方法が打ち負かされることを約束するものではありません。
現在の互換性ターゲットは、Android 上の Frida 17.16.4 です。他の Frida バージョンは、ソース契約、完全なビルド、およびルート化デバイスの受理が繰り返されるまでは意図的に未検証として扱われます。
このプロジェクトは、あなたが所有するかテストを許可されたアプリケーションとデバイスでのみ使用してください。
リポジトリは3種類のエビデンスを区別します:
build.py --verify は Server と Gadget の両方を必要とし、ステージングされた Gadget をストリップし、その後、いずれかのアーティファクトを公開する前に既知の禁止ランタイムマーカーを拒否します。scripts/android_smoke.py は、1台のルート化デバイス上でビルドされたアーティファクトを実行します。認証された abstract-UNIX トランスポート、標準クライアント RPC、spawn、attach、Java ブリッジアサーション、/proc チェック、外部ルートメモリスキャン、および個別にロードされた Gadget を含みます。ソーステストまたはバイトスキャンに合格しても、ランタイムステルスと同等ではありません。Android の動作に関する主張には、生成された編集済みのスモークテストレポートを含める必要があります。
Actions タブから Build Custom Frida を実行します。再利用可能なビルドワークフロー:
build-info.json と SHA256SUMS を含めます。週次ワークフローは、認証された GitHub API を介して最新リリースを解決し、同じ読み取り専用ビルドワークフローを呼び出し、ダウンロードしたアーティファクトを検証して証明し、最終ジョブにのみリリース書き込み権限を付与します。
要件:
android.jar と D8 を含む Android SDK プラットフォームおよびビルドツール;--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/ は検証エラーであり、独立して名前が変更されます。
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
--temp-fixes はランタイム動作を変更し、オプトインのままです。--strict-wx は、Android インジェクターの実行可能コードを書き込み可能なデータおよびスタックページから分離し、Gum の永続的な RWX コードプールを無効にし、GumJS の NativeCallback クロージャコードを専用の RX ページに配置し、libffi ストレージを RW に保ち、新しく生成されたコードを RX として確定します。一致するリモート libc が利用できない場合、Android インジェクターはアップストリームの RWX フォールバックを使用する代わりに、クローズ状態で失敗します。既に RWX であったページは保持され、ユーザースクリプトによる明示的な RWX メモリ要求は拒否されません。ランタイムの /proc/maps サンプルは、実行可能コードのパッチ中に一時的な RWX 権限変更が発生しないことを証明するものではありません。frida.Compiler を使用します。Frida REPL とトレーサーは、独自のバンドルされたブリッジを提供します。ビルダーコードは MIT ライセンスです。生成されたバイナリはアップストリームのライセンスを保持します。THIRD_PARTY_NOTICES.md を参照してください。