
صندوق حماية لتنسخ تطبيقات Android مع واجهة سطر أوامر بنمط 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 نيابة عنك.
من جذر المستودع، مع توصيل جهاز واحد:
# 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 دائمًا المستخدم 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.
