
Costruisci server Frida anti-rilevamento dal sorgente. ~90 patch che coprono 16 vettori di rilevamento, build automatiche settimanali con nomi casuali.
phantom-frida costruisce Android Frida Server e Gadget dal codice sorgente modificando un insieme mirato di identificatori runtime osservabili. È un builder e un harness di verifica, non una garanzia che ogni metodo di rilevamento specifico dell'applicazione venga sconfitto.
L'obiettivo di compatibilità corrente è Frida 17.16.4 su Android. Altre versioni di Frida sono intenzionalmente considerate non verificate fino a quando i loro contratti sorgente, la build completa e l'accettazione su dispositivo rooted non saranno stati ripetuti.
Usa questo progetto solo su applicazioni e dispositivi di tua proprietà o che sei autorizzato a testare.
Il repository separa tre tipi di prove:
build.py --verify richiede sia Server che Gadget, spoglia il Gadget preparato, quindi rifiuta i marcatori runtime vietati noti prima di pubblicare l'artefatto.scripts/android_smoke.py testa un artefatto costruito su un dispositivo rooted: trasporto UNIX astratto autenticato, RPC del client stock, spawn, attach, asserzioni del bridge Java, controlli /proc, una scansione della memoria root esterna e un Gadget caricato separatamente.Un test sorgente o una scansione byte superati non equivalgono a furtività runtime. Le affermazioni sul comportamento di Android dovrebbero includere il rapporto del smoke test generato e oscurato.
Esegui Build Custom Frida dalla scheda Actions. Il flusso di lavoro build riutilizzabile:
build-info.json e SHA256SUMS in un unico artefatto di build.Il flusso di lavoro settimanale risolve l'ultima release attraverso l'API GitHub autenticata, chiama lo stesso flusso di lavoro di build di sola lettura, verifica l'artefatto scaricato, lo attesta e concede il permesso di scrittura della release solo al lavoro finale.
Requisiti:
android.jar e D8;Se --ndk-path viene omesso, il builder scarica Android NDK r29 sotto build/. Una build arm64 verificata con input bloccati è:
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
Opzioni utili:
--version, -v Versione semantica esatta di Frida (obbligatoria)
--name, -n Nome sostitutivo in minuscolo, 3-20 caratteri
--arch, -a Una o più architetture Android supportate
--port, -p Porta di ascolto; omessa mantiene 27042
--extended, -e Applica le trasformazioni estese opzionali degli identificatori
--strict-wx Indurisce le mappature RWX persistenti anonime di proprietà di Frida su Android
--temp-fixes Applica modifiche di stabilità opt-in specifiche del dispositivo
--verify Rifiuta i marcatori vietati noti negli artefatti finali
--skip-build Applica le patch al sorgente senza compilare
--skip-clone Usa un albero sorgente esistente nella directory di lavoro
--ndk-path Usa una directory esistente di Android NDK r29
Per l'esempio sopra, output/ contiene:
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 registra i commit esatti del builder, di Frida e di frida-core, la versione dell'NDK, l'ora UTC di build, le architetture, il nome, la porta, la modalità strict W^X del pool di codice e l'URL del flusso di lavoro quando costruito in Actions. Verifica i file binari scaricati prima dell'uso:
cd output
sha256sum --check SHA256SUMS
python3 -m json.tool build-info.json >/dev/null
Le release pubbliche settimanali ricevono anche un'attestazione di provenienza della build GitHub. SHA256SUMS identifica un insieme di output; gli hash binari non dovrebbero corrispondere tra diversi host di build.
Il builder preserva le interfacce del protocollo D-Bus sotto re.frida.*, il percorso /re/frida/GadgetSession, le stringhe pubbliche dell'API JavaScript Frida in maiuscolo e i simboli ABI C generati richiesti dai client stock. Rinominare quei valori romperebbe il normale contratto client/server di Frida.
L'identificatore del servizio D-Bus, il pacchetto JNI helper, il prefisso del socket zymbiote, gli identificatori selezionati di processo/libreria/percorso, i nomi di thread selezionati e una porta personalizzata opzionale sono dettagli di implementazione separati che il builder può trasformare. Il verificatore di output rifiuta questo insieme esplicito di marcatori:
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
La stringa esatta dell'API pubblica Frida\0 e gli identificatori del protocollo re.frida.* nella whitelist rimangono intenzionalmente preservati. Il prefisso HTTP/Inspector Frida/ è un fallimento del verificatore e viene rinominato indipendentemente.
Installa il binding Python esatto registrato in build-info.json, installa la dipendenza del bridge Java fissata e collega esattamente un dispositivo Android rooted:
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
Il pacchetto deve essere un'applicazione Java installata che sei autorizzato a testare. L'harness compila test_comprehensive.js con il frida-java-bridge esplicito richiesto da Frida 17. Server e Gadget ascoltano ciascuno su un socket UNIX astratto autenticato casuale; le loro porte TCP host esistono solo come inoltri ADB e nessun listener TCP del dispositivo è esposto. L'harness compila anche una sonda root abbinata all'ABI che scansiona le immagini dell'agente e del Gadget mappati attraverso /proc/<pid>/mem, al di fuori della vista del processo di Frida. Pulisce i suoi processi, inoltri e directory di test remota all'uscita. Il gate /proc rifiuta anche i nomi di descrittori di file linjector legacy e un TracerPid diverso da zero.
La configurazione di Frida Gadget deve essere nominata accanto alla libreria come lib<name>-gadget.config.so; l'harness genera e distribuisce questo file.
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]
Vedi CONTRIBUTING.md per i requisiti completi delle prove.
build.py Clona, applica patch, compila, verifica e raccoglie artefatti
patches.py Trasformazioni del codice sorgente e binarie a lunghezza fissa
namegen.py Generazione di nome di build e porta basata su seed
scripts/android_smoke.py Harness di accettazione per Server/Gadget su Android rooted
test_comprehensive.js Asserzioni strutturate del bridge Java Frida 17
tests/ Test unitari, di contratto, fixture e di flusso di lavoro
.github/workflows/ CI, CodeQL, build riutilizzabile e isolamento delle release
--temp-fixes modifica il comportamento runtime e rimane opt-in.--strict-wx separa il codice eseguibile dell'iniettore Android dai dati e dalle pagine stack, disabilita i pool di codice RWX persistenti di Gum, posiziona il codice di chiusura di GumJS NativeCallback su pagine RX dedicate mantenendo l'archiviazione libffi RW, e finalizza il codice appena generato come RX. Se una libc remota corrispondente non è disponibile, l'iniettore Android fallisce in modo bloccato invece di usare il suo fallback RWX upstream. Preserva le pagine che erano già RWX e non rifiuta una richiesta esplicita dello script utente per memoria RWX. Un campione runtime di /proc/maps non prova che non si verifichi alcun cambiamento transitorio del permesso RWX mentre il codice eseguibile viene patchato.frida.Compiler; il REPL di Frida e il tracer forniscono i propri bridge raggruppati.Il codice del builder è con licenza MIT. I binari generati mantengono la licenza upstream; vedi THIRD_PARTY_NOTICES.md.