Analizar en tu propio dispositivo
El análisis dinámico —ejecutar la muestra y observar lo que hace— corre en tu máquina: tu emulador, tu red, tu hardware, conducido por el agente de Droidwatch. 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.
Nuestro sandbox en la nube todavía no está disponible para todos: hoy ninguna muestra se ejecuta en la infraestructura de Droidwatch. Con un plan de pago puedes solicitar acceso desde la pestaña Dinámico; hasta que se active en tu cuenta, esta guía es la forma de hacer análisis dinámico.
Tu propio emulador es además el sitio adecuado si la muestra no puede salir de tu red (cumplimiento, una app bajo NDA, un laboratorio aislado). Incluye grabación de pantalla en vídeo, mitmproxy, mock C2, volcado de dex y 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 0 · Deja que el agente te diga qué te falta
Todo lo de abajo es el camino largo. El agente puede mirar tu máquina y decirte exactamente qué falta y el comando para arreglarlo en tu sistema:
python3 droidwatch-agent.pyz doctor
✓ python python 3.11.9
✓ adb Android Debug Bridge version 1.0.41
✓ dispositivo 1 dispositivo(s): emulator-5554
✓ imagen del sistema API 30 · arm64-v8a · root disponible
! sdkmanager el SDK está instalado pero no en el PATH
→ export PATH="$HOME/Library/Android/sdk/cmdline-tools/latest/bin:$PATH"
✗ clave y plan no hay clave de API
→ se crea en droidwatch.app → Mi perfil → Claves de API
Comprueba e instruye; no instala nada. Un agente de 25 KB que ejecuta
brew install en tu máquina no es algo que debas aceptar de una herramienta que
acabas de descargar, y harías bien en desconfiar.
El agente se descarga en el paso 5, así que el orden habitual es: lee los pasos
1 y 2, consigue el agente, y deja que doctor te guíe el resto.
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: Mi perfil → Claves de API. Ponle un
nombre que reconozcas luego (droidwatch-agent), deja el ámbito en
read + analyze —el que viene por defecto— y pulsa + Create key.
Con «read only» no basta: el agente tiene que pedir trabajo, informar del progreso y devolver el resultado, y eso son escrituras. Una clave de sólo lectura se rechaza.
Copia la clave en cuanto aparezca — se muestra una sola vez y no hay forma de volver a verla. Si la pierdes, bórrala y crea otra.
Las claves de API requieren plan Pro o superior.
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 cualquier otro análisis; la diferencia es que la máquina es tuya. 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 403 en todas las llamadas |
La clave se creó read only, y conducir un dispositivo es escribir. | Crea otra con el ámbito read + analyze (paso 5). |
unable to intercept function at 0x… |
Estás en una imagen AOSP pura (;default;) y Frida 17 no puede instrumentarla. Medido: falla hasta contra com.android.settings, así que es la imagen y no la muestra. |
Usa frida-server 16.7.19 con su cliente a juego, o cambia el AVD a una imagen google_apis. |
El servidor responde 413 |
El bundle pasa de 200 MB. | En la pestaña Dynamic, baja la duración o quita las capturas. El agente no tiene ninguna opción para esto: los ajustes viajan con el trabajo. |
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 agente 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.