
Costruisci server Frida anti-rilevamento dal sorgente. ~90 patch che coprono 16 vettori di rilevamento, build automatiche settimanali con nomi casuali.
# phantom-frida `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. ## Cosa è verificato Il repository separa tre tipi di prove: 1. I test unitari e di fixture convalidano la gestione degli input, i contratti esatti delle patch del sorgente di Frida 17.16.4, la ricostruzione DEX, la promozione degli artefatti, i metadati, i flussi di lavoro e il comportamento in caso di errore. 2. `build.py --verify` richiede sia Server che Gadget, spoglia il Gadget preparato, quindi rifiuta i marcatori runtime vietati noti prima di pubblicare l'artefatto. 3. `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. ## Build con GitHub Actions Esegui **Build Custom Frida** dalla scheda Actions. Il flusso di lavoro build riutilizzabile: - convalida ogni input di build controllato dall'utente; - scarica Android NDK r29 da Google e verifica il checksum pubblicato; - clona un albero sorgente upstream fresco invece di memorizzare nella cache il sorgente patchato; - spoglia i simboli del Gadget e carica solo dopo che l'artefatto duro e i cancelli dei marcatori sono stati superati; - include `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. ## Build locale Requisiti: - Ubuntu 22.04 o successivo (WSL è supportato); - Python 3.10 o successivo; - Git, curl, unzip, una toolchain C/C++, JDK 17 e Node.js 18 o successivo (CI usa Node.js 24.13.1); - Piattaforma Android SDK e build-tools contenenti `android.jar` e D8; - circa 20 GB di spazio libero su disco. Se `--ndk-path` viene omesso, il builder scarica Android NDK r29 sotto `build/`. Una build arm64 verificata con input bloccati è: ```bash 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: ```text --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 ``` ## Output e provenienza Per l'esempio sopra, `output/` contiene: ```text 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: ```bash 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. ## Compatibilità con il client stock 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: ```text 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. ## Accettazione su Android rooted Installa il binding Python esatto registrato in `build-info.json`, installa la dipendenza del bridge Java fissata e collega esattamente un dispositivo Android rooted: ```bash 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. ## Controlli di sviluppo ```bash 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](https://github.com/theqmaks/phantom-frida/blob/master/CONTRIBUTING.md) per i requisiti completi delle prove. ## Struttura del repository ```text 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 ``` ## Limiti noti - Solo Frida 17.16.4 è l'obiettivo di verifica corrente; il supporto non è dedotto per tutte le release 17.x o 16.x. - `--temp-fixes` modifica il comportamento runtime e rimane opt-in. - L'assenza di marcatori non prova la resistenza a rilevamenti comportamentali, di integrità, temporali o specifici dell'applicazione. - La compatibilità con il client stock preserva il comportamento pubblico di ABI/protocollo. Il probing attivo del protocollo e i controlli di integrità del codice possono ancora identificare la strumentazione. - Questo builder non nasconde il root, l'avvio automatico dell'app, le modifiche al codice di Interceptor, le stringhe dello script utente o i guasti segnalati dall'attestazione remota. - `--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. - Il gate di memoria esterna scansiona le immagini mappate dell'agente/Gadget per il suo insieme esplicito di marcatori; non è una scansione generica di ogni pagina heap anonima. - Gli agent raw di Frida 17 necessitano di importazioni esplicite del bridge o del raggruppamento. L'harness usa `frida.Compiler`; il REPL di Frida e il tracer forniscono i propri bridge raggruppati. ## Crediti e licenze - [Frida](https://frida.re/) di Ole André Ravnas e contributori - [ajeossida](https://github.com/hackcatml/ajeossida) di hackcatml Il codice del builder è con licenza MIT. I binari generati mantengono la licenza upstream; vedi [THIRD_PARTY_NOTICES.md](https://github.com/theqmaks/phantom-frida/blob/master/THIRD_PARTY_NOTICES.md).