
Bac à sable de clonage d'applications Android avec une CLI de style Frida qui lance ou s'attache à des applications clonées et injecte des scripts QuickJS à l'aide de Gum Interceptor et de hooks Stalker.

Spindle est le client en ligne de commande. Il envoie un script dans l'hôte BBA ou dans une application clonée et renvoie les logs. Les options suivent la ligne de commande Frida : spawn avec -f, attach avec -n ou -p, charger un fichier avec -l.
BBA lui-même est un bac à sable de clonage d'applications Android. Le paquet hôte est com.android.bba. Une application clonée s'exécute à l'intérieur de ce paquet, et non comme une installation normale. Installez l'APK, ouvrez le clone depuis l'interface BBA, puis utilisez Spindle. Les scripts s'exécutent uniquement sur arm64, dans QuickJS, avec l'Interceptor et le Stalker de Frida Gum.

La machine de développement ne se connecte jamais directement à un clone. Elle ne communique qu'avec com.android.bba:black sur 127.0.0.1:2408. Le processus hôte et chaque clone sont des agents : ils s'enregistrent via Binder, reçoivent le script et renvoient les logs. Le mode USB exécute adb forward tcp:0 tcp:2408 pour vous.
Depuis la racine du dépôt, avec un appareil branché :
# Stop the clone on user 0, start it, inject, then let it continue
python3 tools/spindle -U -f com.example.app -l tools/test_js_api.js
# Attach to a clone that is already running
python3 tools/spindle -U -n com.example.app -l tools/test_native_hook.js
# Attach to a pid, including the host process com.android.bba
python3 tools/spindle -U -p 12345 -l tools/test_js_api.js
# One line of script, no file
python3 tools/spindle -U -n com.example.app -e 'console.log("hi")'
# Registered processes, JSON
python3 tools/spindle -U --list
# Same list, as a table
python3 tools/spindle-ps -U
-f est le spawn. Le client envoie le script, puis UNLOCK. Le clone attend sur le chemin de démarrage jusqu'à l'arrivée de cette trame, de sorte que le script est en place avant Application.onCreate. -f utilise toujours l'utilisateur 0.
-n et -p attachent. Le processus doit déjà s'être enregistré. Un nom est le nom de processus enregistré par Spindle, généralement le nom du paquet cloné. Le processus hôte de l'interface est com.android.bba.
Plusieurs téléphones :
python3 tools/spindle -D <serial> -n com.example.app -l tools/test_js_api.js
Si le port est déjà redirigé, ignorez adb :
python3 tools/spindle -H 127.0.0.1:2408 -n com.example.app -l tools/test_js_api.js
-H, -U et -D choisissent la connexion. N'en passez qu'un seul. Ne passez qu'un seul de -f, -n et -p.
Le client reste actif et affiche console.log jusqu'à ce que le processus se termine, que le serveur se déconnecte, ou que vous fassiez Ctrl-C.
Un script est du JavaScript simple. Ces exemples se trouvent dans tools/ :
| Fichier | Ce qu'il fait |
|---|---|
test_js_api.js | Memory, pointeurs, Module, Interceptor |
test_native_hook.js | Interceptor.attach("libz.so!deflate", …) |
test_java_hook.js | Java.hook sur Activity.onCreate |
test_stalker.js | Stalker.follow depuis l'intérieur d'un hook |
test_rpc.js | rpc.exports appelé depuis la ligne de commande |
console.log revient sous forme de ligne de log. Sur armeabi-v7a, il n'y a pas de runtime ; un RPC y répond avec js runtime is not in bba.
Appelez un export après le chargement du script. --args est un tableau JSON et correspond au --call associé :
python3 tools/spindle -U -n com.example.app -l tools/test_rpc.js --call ping --args '["hi"]'
Cela affiche pong hi, puis continue d'attendre les logs.
Groupe de discussion : openbba. Le code expire le 20 octobre 2026.
