Files
FridaBox/ARCHITECTURE.md
T

58 lines
1.9 KiB
Markdown
Raw Normal View History

2026-07-19 23:33:52 +03:30
# Architecture
FridaBox extends the existing BlackBox virtual package, process, Binder, file,
identity, signature, and lifecycle implementation. It does not introduce a
second plugin framework and never creates a replacement `DexClassLoader` for a
guest.
```text
Host launcher process
|
| import original APK
v
BlackBox virtual package manager
|
| allocate :pN virtual process
v
BActivityThread.handleBindApplication()
|
| create guest Context / LoadedApk / ClassLoader
| initialize virtual runtime and IO redirection
| populate GuestRuntimeRegistry
| load Frida Gadget and wait
v
Frida controller attaches
|
| select guest ClassLoader
| install Java/native hooks
v
Guest makeApplication()
|
v
Guest Application.onCreate()
|
v
Guest Activity
```
## Runtime boundary
`GuestRuntimeRegistry` is volatile, process-local state. Each normal BlackBox
virtual process populates it after `VirtualRuntime.setupRuntime`, `NativeCore.init`,
and IO redirection, using the `LoadedApk` ClassLoader. `FridaGadgetLoader` then
performs one synchronized `System.loadLibrary("frida-gadget")` attempt in that
Linux process. The static Gadget configuration pauses that call until a
controller connects. Only afterward does BlackBox call `makeApplication`.
The host status screen uses a small SharedPreferences snapshot because the host
launcher cannot directly read another process's static registry. The Frida
controller reads the authoritative process-local registry through Java.
## Import boundary
The host copies a document-provider stream once into `files/imported-apks`,
computes SHA-256 while copying, inspects the ZIP ABI entries, parses package
metadata, verifies the stored hash, marks the file read-only, and passes the path
only to BlackBox's virtual package manager. No real package installer Intent or
PackageInstaller session is used.