
Android 앱 복제 샌드박스로, Frida 스타일 CLI를 통해 복제된 앱을 실행하거나 여기에 연결하고 Gum Interceptor와 Stalker 훅을 사용하여 QuickJS 스크립트를 주입합니다.

Spindle은 명령줄 클라이언트입니다. 스크립트를 BBA 호스트나 복제된 앱 하나로 보내고 로그를 다시 출력합니다. 플래그는 Frida 명령줄을 따릅니다: -f로 스폰, -n 또는 -p로 어태치, -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을 대신 실행해 줍니다.
기기 하나를 연결한 상태에서, 저장소 루트에서:
# 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는 스폰입니다. 클라이언트가 스크립트를 보낸 다음 UNLOCK을 보냅니다. 복제본은 그 프레임이 도착할 때까지 시작 경로에서 대기하므로, 스크립트는 Application.onCreate 전에 자리를 잡습니다. -f는 항상 user 0을 사용합니다.
-n과 -p는 어태치입니다. 프로세스가 이미 등록되어 있어야 합니다. 이름은 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는 연결을 선택합니다. 이 중 하나만 전달하세요. -f, -n, -p 중에서도 하나만 전달하세요.
클라이언트는 프로세스가 종료되거나, 서버가 끊기거나, 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로 응답합니다.
스크립트가 로드된 후 export를 호출하세요. --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일에 만료됩니다.
