Training: Usos avanzados de Frida
Author: Román Ramírez Dificulty: Intermediate Día : Día 1
Conceptos clave
- DBI (Dynamic Binary Instrumentation): manipular aplicaciones en tiempo de ejecución sin modificar el binario original
- Frida v17: cambio gordo en la arquitectura, keylogger de 2024 probablemente no funciona con versiones modernas
- Hooking: reescribir el entry point de funciones para interceptar ejecución → tu código primero, luego función real
- Frida inyecta trampolines en memoria: modifica los primeros 6 bytes de la función (preludio) para saltar a tu hook
- JavaScript controla código nativo remoto: ejecutas JS y eso ejecuta ensamblador en otra máquina. Esto es una locura técnica.
- Problema de Flutter: pesadilla para reversing, compila nativo + ofuscación automática, no ves símbolos de funciones
- Cada versión (2.8, 2.9...) cambia signatures → trabajo manual constante
- Si quieres proteger tu app móvil: usa Flutter
- Optimización del compilador:
printf()se convierte enputs()automáticamente → si buscas printf en el binario no lo encuentras - Convenciones de llamada: System V en Unix (registros), Win32 es un caos (múltiples ABIs en la misma app)
- Parámetros en Frida: NO recibes el valor, recibes un puntero a la dirección de memoria donde está el valor
- Tienes que hacer
.readUtf8String(),.readInt(), etc.
- Tienes que hacer
Desarrollo técnico
El flow de trabajo con Frida básicamente es:
- Cargas la app o te atachas a un proceso en ejecución
- Inyectas un script JS que contiene tu lógica de instrumentación
- Frida carga una librería dinámica en el proceso remoto
- Reemplazas syscalls/funciones con trampolines → 6 bytes de salto a tu código + retorno al offset+6 de la función original
Truco importante: cuando no tienes documentación de una API (funciones custom, ofuscadas, etc.), usa pointer o int indistintamente para los parámetros. La diferencia entre un long y un pointer es... ninguna. Es algo que apunta a memoria. Si dudas, tira de int y luego parseas la memoria manualmente.
Para funciones con parámetros variables (como printf), Frida te obliga a crear múltiples versiones: printf1(), printf2(), printf3()... cada una con distinto número de args. Alguien en Telegram sugirió usar un array de parámetros y ya está, pero Ole (creador de Frida) todavía no lo ha implementado así. El ponente usa try/catch en JS para probar hasta 20 argumentos y ver cuántos tiene realmente la función.
Reversing de Flutter: como las funciones están ofuscadas, tienes que:
- Detectar cuándo Flutter carga su librería nativa
- Calcular offsets desde el entry point de la lib
- Ir sumando offsets para localizar funciones (sin símbolos)
- Repetir esto cada puta versión de Flutter porque cambian las signatures
ASLR y offsets: aunque el sistema operativo randomice las direcciones con ASLR, el offset desde el punto de entrada siempre es el mismo. Si localizas el entry point o el constructor de la librería, sumas el offset y game over. Incluso con ofuscación, puedes buscar firmas de preludios típicos (las primeras instrucciones ensamblador de una función) y escanear memoria.
Herramientas y comandos mencionados
frida→ framework principal de DBIfrida-tools→ paquete con utilidades adicionales (frida-trace, etc.)frida-trace -S puts tester→ hookear la funciónputsen el binariotester- Web UI de Frida: interfaz gráfica nueva para instrumentación visual
objdump→ esencial para obtener offsets de funciones en binarios Unix/ELFld_preload/ld_library_path→ en Unix, cargar librerías custom antes de ejecutar programa- Microsoft Detours → librería de Microsoft para hooking (pero hay 8000 alternativas)
- Radare2 con r2frida plugin (aunque el ponente prefiere usarlos separados)
module.load()→ en Frida, fuerza la carga de una librería (cuidado con DLL hijacking)dlopen()/LoadLibraryEx()→ mejor cargar librerías manualmente que conmodule.load()para tener control total- Capstone → desensamblador en Python (también ensambla shellcode)
- LIEF → framework para manipular binarios
psfvenom→ genera payloads (ej:mt.dllpara reverse http server)- GDB con PEDA (aunque está viejuno, el ponente recomienda Radare)
Instalación y setup
- Usar
virtualenvpara gestionar versiones de Python - Instalar Frida 17.2.6 específicamente (versión crítica mencionada)
- Python 3.11 recomendado (3.12 tiene muchos paquetes rotos)
pip install frida-tools→ instala frida + plugins- GDB con PEDA o mejor aún Radare2
- Capstone para desensamblado/ensamblado en Python
- LIEF para manipulación de binarios
- Metel: versión más modificable de Meterpreter, genera firmas únicas
frida-portal→ herramienta mencionada (investigar más)
Términos técnicos importantes
- NativeFunction: objeto de Frida que representa una función nativa del sistema. Te permite invocar cualquier API de Windows/Linux desde JS
- Callback nativo: a diferencia de NativeFunction (donde TÚ llamas a la función desde JS), aquí el código nativo llama a TU código JS. Crucial para eventos asíncronos (ej: mensajes de teclado en Windows)
- Preludio de función: primeras instrucciones ensamblador de una función (típicamente push rbp, mov rsp...). Frida lo reemplaza con un salto
- ABI (Application Binary Interface): convención que define cómo se pasan parámetros (registros vs stack, orden, etc.). System V en Unix64, múltiples en Win32
- ASLR (Address Space Layout Randomization): técnica de seguridad que randomiza direcciones de memoria. Se bypasea con offsets relativos
- DLL hijacking / Side loading: cargar una DLL maliciosa antes que la legítima. Cuidado con
module.load()de Frida
Conclusiones
Frida es una máquina de matar para post-explotación. El concepto de ejecutar JS y que eso ejecute ensamblador en remoto es brutal. Lo importante:
- Siempre documenta el ABI/convención de llamada: sin eso estás perdido con los parámetros
- El compilador optimiza: lo que ves en código fuente no es lo que hay en el binario (
printf→puts) - Frida te da punteros, no valores: tienes que leer la memoria manualmente con
.readX() - Flutter es el enemigo: si vas a hacer una app móvil que no quieras que sea reverseada, úsalo
- Carga librerías manualmente: mejor
dlopen()quemodule.load()para evitar side loading - Offsets son tu amigo: aunque haya ASLR, el offset desde entry point es constante
El discurso de Darth Vader del principio es importante: cuando tienes herramientas de post-explotación (exploits, meterpreter...), estás jugando con armas termonucleares. La corrupción no pasa de la noche a la mañana. Cada vez que das Enter y pasan cosas a 3000km de distancia, reflexiona. Es un proceso gradual convertirte en un monstruo.
Para aplicaciones prácticas: keylogger actualizado (ahora con cambios de v17), bootloader hooking (por diversión), y manipulación de librerías nativas en móviles/desktop.
Para investigar más
- Web UI de Frida: explorar features visuales
frida-portal: qué es exactamente y casos de uso- Metel vs Meterpreter: diferencias técnicas en generación de firmas
- Grupo de Telegram/Discord de Frida: OLE (creador) es muy accesible y responde dudas
- R2Frida plugin: aunque el ponente no lo usa, puede ser útil para workflows integrados
- Radare2 + Pancake: ambos están en NowSecure con OLE
- Documentación oficial: https://docs.claude.com (aunque esto es para Claude API, no Frida lol)
- Proyecto Hack the Music: iniciativa cultural de Rooted con live coding + música
- Fundación Good Job: integración de personas con discapacidad en hacking/tech
Duda pendiente: ¿Cómo manipula Frida los registros exactamente en 64 bits? Usa copias en memoria intermedia y restaura al salir del trampolín, pero profundizar en el mecanismo interno.
-
RAW
ldlpreload
Instalación
- Usar virtualenv (porque así puedes usar cualqueir versioin)
- Instalacion de frida 17.2.6
pip install frida-toolsprincipalemente para instalar frida y pluginspython 3.12muchos paquetes rotos,3.11mucho mejor- gdb con modulo de PEDA (viejuno) mejor radare.
- Instalar capston:
- Desensamblador usado en python, que además de desensamblar.
- También permite ensamblar shellcode
- LIEF: framework para manipular binarios.
- psfvenom, te daría un mt.dll para reversed http server
Metel es una versionde meterpreter más modificable. Genera firmas únicas
frida-portal
DEMO
NativeFunction en profundidad
Con esto podemos ejecutar cualquier cosa que nos permita la API de windows.
Agradecimientos

