
Песочница для клонирования Android-приложений с CLI в стиле Frida, которая запускает или подключается к клонированным приложениям и внедряет скрипты QuickJS с использованием перехватчиков Gum Interceptor и Stalker.

Spindle — это клиент командной строки. Он отправляет скрипт в хост BBA или в одно клонированное приложение и выводит логи обратно. Флаги соответствуют командной строке Frida: запуск через -f, подключение через -n или -p, загрузка файла через -l.
Сам BBA — это песочница для клонирования Android-приложений. Пакет хоста — com.android.bba. Клонированное приложение работает внутри этого пакета, а не как обычная установка. Установите APK, откройте клон из интерфейса BBA, затем используйте Spindle. Скрипты выполняются только на arm64, в QuickJS, с Interceptor и Stalker из Frida Gum.

Машина разработчика никогда не подключается к клону напрямую. Она общается только с com.android.bba:black на 127.0.0.1:2408. Процесс хоста и каждый клон являются агентами: они регистрируются через Binder, получают скрипт и отправляют логи обратно. Режим USB выполняет adb forward tcp:0 tcp:2408 за вас.
Из корня репозитория, с одним подключённым устройством:
# Остановить клон на пользователе 0, запустить его, внедрить, затем продолжить
python3 tools/spindle -U -f com.example.app -l tools/test_js_api.js
# Подключиться к уже запущенному клону
python3 tools/spindle -U -n com.example.app -l tools/test_native_hook.js
# Подключиться к pid, включая процесс хоста com.android.bba
python3 tools/spindle -U -p 12345 -l tools/test_js_api.js
# Одна строка скрипта, без файла
python3 tools/spindle -U -n com.example.app -e 'console.log("hi")'
# Зарегистрированные процессы, JSON
python3 tools/spindle -U --list
# Тот же список, в виде таблицы
python3 tools/spindle-ps -U
-f — это запуск. Клиент отправляет скрипт, затем UNLOCK. Клон ожидает на пути запуска, пока не придёт этот фрейм, поэтому скрипт оказывается на месте до Application.onCreate. -f всегда использует пользователя 0.
-n и -p подключаются. Процесс уже должен быть зарегистрирован. Имя — это имя процесса, записанное Spindle, обычно имя клонированного пакета. Процесс интерфейса хоста — com.android.bba.
Более одного телефона:
python3 tools/spindle -D <serial> -n com.example.app -l tools/test_js_api.js
Если порт уже перенаправлен, пропустите adb:
python3 tools/spindle -H 127.0.0.1:2408 -n com.example.app -l tools/test_js_api.js
-H, -U и -D выбирают соединение. Передавайте только один из них. Передавайте только один из -f, -n и -p.
Клиент остаётся активным и выводит console.log, пока процесс не завершится, сервер не отключится или вы не нажмёте Ctrl-C.
Скрипт — это обычный JavaScript. Эти примеры находятся в tools/:
| Файл | Что он делает |
|---|---|
test_js_api.js | Memory, указатели, Module, Interceptor |
test_native_hook.js | Interceptor.attach("libz.so!deflate", …) |
test_java_hook.js | Java.hook на Activity.onCreate |
test_stalker.js | Stalker.follow изнутри хука |
test_rpc.js | rpc.exports, вызываемый из командной строки |
console.log возвращается как строка лога. На armeabi-v7a нет среды выполнения; RPC там отвечает js runtime is not in bba.
Вызовите экспорт после загрузки скрипта. --args — это массив JSON, и он сопоставляется с соответствующим --call:
python3 tools/spindle -U -n com.example.app -l tools/test_rpc.js --call ping --args '["hi"]'
Это выводит pong hi, затем продолжает ожидать логи.
Групповой чат: openbba. Код истекает 20 октября 2026 года.
