Analizar en tu propio dispositivo
Normalmente el análisis dinámico corre en nuestro sandbox: pulsas un botón y listo. Esta guía es para cuando quieres que corra en tu máquina: tu emulador, tu red, tu hardware. La muestra no sale de tu equipo — a Droidwatch sólo viajan los hallazgos, y aparecen en el mismo informe que ya tienes.
Son unos 20 minutos la primera vez. Después, un comando.
Probablemente no. En droidwatch.app pulsas Ejecutar análisis dinámico y ya: se crea una máquina Android desechable para tu muestra y se destruye al terminar. Nada que instalar, nada que enchufar.
Merece la pena montarlo si la muestra no puede salir de tu red (cumplimiento, una app bajo NDA, un laboratorio aislado) o si necesitas algo que el sandbox todavía no hace: grabación de pantalla en vídeo, mitmproxy, mock C2, volcado de dex o el bypass de anti-VM.
Cómo funciona
Lo que necesitas
| Para qué | Compruébalo | |
|---|---|---|
adb |
Hablar con el dispositivo | adb version |
frida |
Instrumentar la app | frida --version |
| Un emulador sin Google Play | Ejecutar la muestra | ver el paso 2 |
| Una clave de API de Droidwatch | Subir el resultado | Perfil → API keys |
Un móvil normal no vale. Frida necesita root, y un teléfono de tienda no lo tiene. Usa un emulador — es además lo correcto para malware, y lo que recomienda la sección de Seguridad.
Paso 1 · Instala las herramientas
# macOS
brew install --cask android-platform-tools
python3 -m pip install --user frida-tools
# Debian / Ubuntu
sudo apt install -y android-tools-adb
python3 -m pip install --user frida-tools
Comprueba que los dos responden:
adb version # Android Debug Bridge version 1.0.41
frida --version # 17.9.7
Si
fridadice «command not found», no es que falle la instalación.pip install --userdeja el ejecutable en una carpeta que en macOS no está en elPATHpor defecto. Es lo primero con lo que tropieza casi todo el mundo. Añádela:
bash echo 'export PATH="$(python3 -m site --user-base)/bin:$PATH"' >> ~/.zshrc export PATH="$(python3 -m site --user-base)/bin:$PATH" frida --versionLa primera línea lo deja para siempre; la segunda arregla la terminal que ya tienes abierta. (En bash, cambia
~/.zshrcpor~/.bashrc.)
Apunta la versión de frida. La vas a necesitar en el paso 3, y tiene que
coincidir exactamente.
Paso 2 · Crea y arranca un emulador
Desde Android Studio: Device Manager → Create device. O por línea de comandos:
sdkmanager "system-images;android-30;google_apis;arm64-v8a"
avdmanager create avd -n dw-test -k "system-images;android-30;google_apis;arm64-v8a"
emulator -avd dw-test -no-snapshot-load
Elige una imagen sin Google Play. En Android Studio, las que ponen (Google Play) no sirven: van firmadas como producción y no permiten root, que es lo que Frida necesita. Busca las que ponen (Google APIs) a secas.
Con el emulador arrancado, comprueba que adb lo ve:
adb devices
List of devices attached
emulator-5554 device
Tiene que decir device. Si dice offline, aún está arrancando: espera.
Paso 3 · Instala frida-server en el emulador
Es un programa que corre dentro del emulador. Dos cosas tienen que
coincidir: su versión con la de tu frida, y su arquitectura con la del
emulador.
frida --version # p. ej. 17.9.7
adb shell getprop ro.product.cpu.abi # p. ej. arm64-v8a
Descarga el que corresponda de las releases de Frida:
Si abi dice |
Descarga |
|---|---|
arm64-v8a |
frida-server-<versión>-android-arm64.xz |
x86_64 |
frida-server-<versión>-android-x86_64.xz |
armeabi-v7a |
frida-server-<versión>-android-arm.xz |
Instálalo y arráncalo:
unxz frida-server-17.9.7-android-arm64.xz
adb push frida-server-17.9.7-android-arm64 /data/local/tmp/frida-server
adb shell chmod 755 /data/local/tmp/frida-server
adb root
adb shell /data/local/tmp/frida-server &
No imprime nada. Es correcto: se queda corriendo en segundo plano.
Se apaga al reiniciar el emulador. Cada vez que lo arranques, repite las dos últimas líneas. Si un día el análisis falla diciendo frida-server not reachable, es esto casi siempre.
Paso 4 · Comprueba que Frida ve el dispositivo
frida-ps -Ua
PID Name Identifier
----- --------------- ----------------------------
2118 Calendar com.android.calendar
1893 Settings com.android.settings
Si sale esa lista, ya está lo difícil. Si este comando falla, para aquí: lo que viene no va a funcionar, y el problema está en los pasos 2 o 3.
Paso 5 · Crea tu clave y consigue el agente
Primero la clave, en droidwatch.app: Perfil → API keys → crear una. Cópiala en cuanto aparezca, sólo se muestra una vez.
export DROIDWATCH_API_KEY=dw_...
Después bájate el agente con ella. No está en ningún índice público: tu clave es lo que te da el fichero, y deja de funcionar cuando deja de hacerlo tu plan.
curl -H "X-API-Key: $DROIDWATCH_API_KEY" \
https://droidwatch.app/api/agent/download -o droidwatch-agent.pyz
Comprueba lo que te has bajado. Vas a ejecutar algo que conduce tu dispositivo y maneja malware, así que verifícalo en vez de fiarte:
shasum -a 256 droidwatch-agent.pyz # macOS
sha256sum droidwatch-agent.pyz # Linux
Y compáralo con el que declara el servidor:
curl -H "X-API-Key: $DROIDWATCH_API_KEY" https://droidwatch.app/api/agent/version
Es un único fichero de unos 15 KB y sin ninguna dependencia: corre con el
python3 que ya tienes del paso 2. No hay nada que instalar ni nada que
desinstalar — borras el fichero y se acabó.
python3 droidwatch-agent.pyz --help
Paso 6 · Ejecuta el análisis
Deja el agente corriendo en una terminal. Se queda callado hasta que le pidas algo:
python3 droidwatch-agent.pyz --api-key $DROIDWATCH_API_KEY
dispositivo: Pixel 2 · Android 11 · arm64-v8a (emulator-5554)
agente 0.1.0 en marcha contra https://droidwatch.app
Si tienes más de un dispositivo conectado, se para y te pide que elijas con
--serial. Es a propósito: con un AVD rooteable, otro con Play Store y otro de
32 bits encima de la mesa, «el primero» es una lotería y la muestra acaba
corriendo donde no tocaba.
Ahora vete a droidwatch.app. Sube tu APK como siempre, espera al análisis estático y abre la pestaña Dynamic. El desplegable te ofrece Mi dispositivo, con el modelo, la versión de Android y la ABI del emulador que ve el agente — así sabes contra qué vas a lanzar la muestra antes de lanzarla.
Pulsa Ejecutar análisis dinámico. La barra de progreso es la misma que la de nuestro sandbox, porque es el mismo análisis: lo único que cambia es la máquina. Deja el emulador a la vista: verás la app instalarse y arrancar.
La muestra se instala en tu emulador y lo que hace ocurre en tu red. Al terminar, el agente sube sólo los hallazgos y los artefactos, y el informe se rellena — marcado como aportado por el analista, porque nosotros no vimos correr ese análisis.
Si tu plan no incluye análisis dinámico, el agente te lo dice y se para: la comprobación vive en el servidor, no en el agente.
Paso 7 · Mira los resultados
Vuelve a la pestaña Dynamic del informe y refresca. Ahí tienes lo que hizo la app: las URLs que llamó, los SMS que leyó, las claves que construyó en memoria, las capturas de pantalla y la captura de red.
Junto a tu nombre y la fecha. No es un castigo ni una limitación: ese análisis ocurrió en tu equipo, nosotros no lo vimos correr, y un informe de Droidwatch puede compartirse en público. Quien lo lea merece saber quién produjo la evidencia que está mirando — y a ti te conviene, porque distingue tu trabajo del automático.
Si algo falla
| Lo que ves | Qué pasa | Qué hacer |
|---|---|---|
no adb device connected |
El emulador no está arrancado, o adb no lo ve. |
Vuelve al paso 2. adb kill-server && adb devices resuelve la mayoría de los casos. |
no online adb device (states: …) |
Hay un dispositivo pero no está listo. Entre paréntesis dice por qué: offline es que sigue arrancando; unauthorized, que falta aceptar un aviso en su pantalla. |
Espera, o mira la pantalla del emulador. |
frida-server not reachable on the device |
adb llega pero Frida no. Casi siempre: frida-server no está corriendo (lo mató un reinicio) o su versión no coincide con la de tu frida. |
Repite el paso 3 y compara las dos versiones. |
frida CLI not found in PATH |
El CLI de Frida no está donde se le busca. Casi siempre: pip install --user lo dejó fuera del PATH. |
Es el aviso del paso 1. Ojo: which frida no sirve para diagnosticarlo — no devuelve nada justamente cuando falta. |
adb binary not found in PATH |
Igual, con adb. |
Instala platform-tools (paso 1). |
El servidor responde 402 |
Tu plan no incluye análisis dinámico. | Es una función de Pro en adelante. |
El servidor responde 413 |
El bundle pasa de 200 MB. | Baja --duration, o desactiva la grabación de vídeo. |
Todo lo de arriba se reproduce con dos comandos en tu terminal: adb devices y
frida-ps -Ua. Si esos dos funcionan y aun así falla, cuéntanoslo con la salida
de ambos.
Seguridad
Vas a instalar malware y ejecutarlo. Tres reglas:
- Nunca en tu móvil. Usa un emulador. Una muestra que consiga root puede sobrevivir incluso a un reseteo de fábrica.
- Aísla la red. Mientras corre, la muestra alcanza todo lo que alcance el dispositivo: tu NAS, la administración de tu router, tus otras máquinas.
- Restaura el emulador después. El CLI desinstala la app al terminar, pero una muestra que ganó persistencia no se va con un desinstalar. Haz un snapshot antes y restáuralo después: es la única limpieza fiable.