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.

¿Y un sandbox alojado?
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

El análisis corre en tu máquina contra tu emulador; a Droidwatch sólo suben los hallazgos droidwatch-agent + adb + frida + el APK tu emulador la muestra frida-server droidwatch tu informe tu máquina — la muestra no sale de aquí instala observa
El APK se queda en tu máquina. Lo que se sube es el resultado: la salida de Frida, el logcat, las capturas y la captura de red.

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 frida dice «command not found», no es que falle la instalación. pip install --user deja el ejecutable en una carpeta que en macOS no está en el PATH por 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 --version

La primera línea lo deja para siempre; la segunda arregla la terminal que ya tienes abierta. (En bash, cambia ~/.zshrc por ~/.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.

La sección aparece marcada como aportada por el analista.

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: