
Android-App-Cloning-Sandbox mit einer Frida-ähnlichen CLI, die geklonte Apps startet oder sich an sie anhängt und QuickJS-Skripte über Gum Interceptor und Stalker-Hooks injiziert.

Spindle ist der Kommandozeilen-Client. Er sendet ein Skript in den BBA-Host oder in eine geklonte App und gibt die Logs zurück aus. Die Flags folgen der Frida-Kommandozeile: Spawn mit -f, Attach mit -n oder -p, eine Datei laden mit -l.
BBA selbst ist eine Android-App-Cloning-Sandbox. Das Host-Paket ist com.android.bba. Eine geklonte App läuft innerhalb dieses Pakets, nicht als normale Installation. Installiere die APK, öffne den Klon aus der BBA-UI und verwende dann Spindle. Skripte laufen nur auf arm64, in QuickJS, mit Frida Gums Interceptor und Stalker.

Die Entwicklungsmaschine verbindet sich nie direkt mit einem Klon. Sie spricht nur mit com.android.bba:black auf 127.0.0.1:2408. Der Host-Prozess und jeder Klon sind Agents: Sie registrieren sich über Binder, empfangen das Skript und senden Logs zurück. Der USB-Modus führt adb forward tcp:0 tcp:2408 für dich aus.
Vom Repo-Root aus, mit einem angeschlossenen Gerät:
# 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 ist Spawn. Der Client sendet das Skript und dann UNLOCK. Der Klon wartet auf dem Startpfad, bis dieser Frame ankommt, sodass das Skript vor Application.onCreate platziert ist. -f verwendet immer Benutzer 0.
-n und -p hängen sich an. Der Prozess muss sich bereits registriert haben. Ein Name ist der von Spindle aufgezeichnete Prozessname, üblicherweise der Name des geklonten Pakets. Der Host-UI-Prozess ist com.android.bba.
Mehr als ein Telefon:
python3 tools/spindle -D <serial> -n com.example.app -l tools/test_js_api.js
Wenn der Port bereits weitergeleitet ist, überspringe adb:
python3 tools/spindle -H 127.0.0.1:2408 -n com.example.app -l tools/test_js_api.js
-H, -U und -D wählen die Verbindung. Übergib nur eines davon. Übergib nur eines von -f, -n und -p.
Der Client bleibt aktiv und gibt console.log aus, bis der Prozess beendet wird, der Server die Verbindung trennt oder du Strg-C drückst.
Ein Skript ist reines JavaScript. Diese Beispiele liegen in tools/:
| Datei | Was sie tut |
|---|---|
test_js_api.js | Memory, Pointer, Module, Interceptor |
test_native_hook.js | Interceptor.attach("libz.so!deflate", …) |
test_java_hook.js | Java.hook auf Activity.onCreate |
test_stalker.js | Stalker.follow aus einem Hook heraus |
test_rpc.js | rpc.exports, aufgerufen von der Kommandozeile |
console.log kommt als Log-Zeile zurück. Auf armeabi-v7a gibt es keine Runtime; ein RPC dort antwortet mit js runtime is not in bba.
Rufe einen Export auf, nachdem das Skript geladen wurde. --args ist ein JSON-Array und entspricht dem passenden --call:
python3 tools/spindle -U -n com.example.app -l tools/test_rpc.js --call ping --args '["hi"]'
Das gibt pong hi aus und wartet dann weiter auf Logs.
Gruppenchat: openbba. Der Code läuft am 20. Oktober 2026 ab.
