
Androidアプリクローニングサンドボックス。Frida風のCLIを備え、クローンしたアプリを起動またはアタッチし、Gum InterceptorとStalkerフックを使ってQuickJSスクリプトを注入します。

Spindle はコマンドラインクライアントです。スクリプトを BBA ホストまたはクローンされたアプリのいずれかに送信し、ログを出力します。フラグは Frida のコマンドラインに従います。-f で spawn、-n または -p で attach、-l でファイルをロードします。
BBA 自体は Android のアプリクローンサンドボックスです。ホストパッケージは com.android.bba です。クローンされたアプリは通常のインストールではなく、そのパッケージ内で動作します。APK をインストールし、BBA UI からクローンを開いてから Spindle を使用します。スクリプトは arm64 のみで、QuickJS 上で、Frida Gum の Interceptor と Stalker を使って実行されます。

開発マシンはクローンに直接接続することはありません。127.0.0.1:2408 の com.android.bba:black とのみ通信します。ホストプロセスと各クローンはエージェントです。Binder 経由で登録し、スクリプトを受信し、ログを送り返します。USB モードでは adb forward tcp:0 tcp:2408 を代わりに実行します。
リポジトリのルートから、デバイスを 1 台接続した状態で:
# 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 は spawn です。クライアントはスクリプトを送信し、その後 UNLOCK を送ります。クローンはそのフレームが到着するまで起動パス上で待機するため、Application.onCreate の前にスクリプトが配置されます。-f は常に user 0 を使用します。
-n と -p は attach です。プロセスはすでに登録されている必要があります。名前は Spindle が記録したプロセス名で、通常はクローンされたパッケージ名です。ホスト UI プロセスは 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 は接続方法を選択します。いずれか 1 つだけを渡してください。-f、-n、-p のうちいずれか 1 つだけを渡してください。
クライアントはプロセスが終了するか、サーバーが切断されるか、Ctrl-C を押すまで起動したまま console.log を出力します。
スクリプトはプレーンな JavaScript です。これらのサンプルは tools/ にあります:
| ファイル | 内容 |
|---|---|
test_js_api.js | Memory、ポインタ、Module、Interceptor |
test_native_hook.js | Interceptor.attach("libz.so!deflate", …) |
test_java_hook.js | Activity.onCreate に対する Java.hook |
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。コードは 2026 年 10 月 20 日に失効します。
