>_
Terminal
guest@dsr: ~
guest@dsr:~$ ./welcome.sh
guest@dsr:~$ cat 2025-10-24-traning.md
Última modificación: 24-10-2025

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 en puts() 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.

Desarrollo técnico

El flow de trabajo con Frida básicamente es:

  1. Cargas la app o te atachas a un proceso en ejecución
  2. Inyectas un script JS que contiene tu lógica de instrumentación
  3. Frida carga una librería dinámica en el proceso remoto
  4. 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:

  1. Detectar cuándo Flutter carga su librería nativa
  2. Calcular offsets desde el entry point de la lib
  3. Ir sumando offsets para localizar funciones (sin símbolos)
  4. 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 DBI
  • frida-tools → paquete con utilidades adicionales (frida-trace, etc.)
  • frida-trace -S puts tester → hookear la función puts en el binario tester
  • Web UI de Frida: interfaz gráfica nueva para instrumentación visual
  • objdump → esencial para obtener offsets de funciones en binarios Unix/ELF
  • ld_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 con module.load() para tener control total
  • Capstone → desensamblador en Python (también ensambla shellcode)
  • LIEF → framework para manipular binarios
  • psfvenom → genera payloads (ej: mt.dll para reverse http server)
  • GDB con PEDA (aunque está viejuno, el ponente recomienda Radare)

Instalación y setup

  • Usar virtualenv para 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:

  1. Siempre documenta el ABI/convención de llamada: sin eso estás perdido con los parámetros
  2. El compilador optimiza: lo que ves en código fuente no es lo que hay en el binario (printfputs)
  3. Frida te da punteros, no valores: tienes que leer la memoria manualmente con .readX()
  4. Flutter es el enemigo: si vas a hacer una app móvil que no quieras que sea reverseada, úsalo
  5. Carga librerías manualmente: mejor dlopen() que module.load() para evitar side loading
  6. 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

    1. Usar virtualenv (porque así puedes usar cualqueir versioin)
    2. Instalacion de frida 17.2.6
    3. pip install frida-tools principalemente para instalar frida y plugins
    4. python 3.12 muchos paquetes rotos, 3.11 mucho mejor
    5. gdb con modulo de PEDA (viejuno) mejor radare.
    6. Instalar capston:
      1. Desensamblador usado en python, que además de desensamblar.
      2. También permite ensamblar shellcode
    7. LIEF: framework para manipular binarios.
    8. 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

    1. oleavr
    2. leonjza
    3. lief-proyecto/LIEF

IMG_2448.jpeg

IMG_2448.jpeg


<< cd ..

>_