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.

¿Necesitas esto?
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

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 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: 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.

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 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: