19 KiB
Tutorial de Frida
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- ¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Obtén el swag oficial de PEASS y HackTricks
- Únete al 💬 grupo de Discord o al grupo de Telegram o sígueme en Twitter 🐦@carlospolopm.
- Comparte tus trucos de hacking enviando PRs al repositorio de hacktricks y al repositorio de hacktricks-cloud.
Consejo para recompensas por errores: regístrate en Intigriti, una plataforma premium de recompensas por errores creada por hackers, para hackers. ¡Únete a nosotros en https://go.intigriti.com/hacktricks hoy mismo y comienza a ganar recompensas de hasta $100,000!
{% embed url="https://go.intigriti.com/hacktricks" %}
Instalación
Instala las herramientas de Frida:
pip install frida-tools
pip install frida
Descarga e instala en el dispositivo Android el servidor de Frida (Descarga la última versión).
Una línea de comando para reiniciar adb en modo root, conectarse a él, cargar frida-server, otorgar permisos de ejecución y ejecutarlo en segundo plano:
{% code overflow="wrap" %}
adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &"
{% endcode %}
Comprueba si está funcionando:
frida-ps -U #List packages and processes
frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name
Tutoriales
Tutorial 1
Desde: https://medium.com/infosec-adventures/introduction-to-frida-5a3f51595ca1
APK: https://github.com/t0thkr1s/frida-demo/releases
Código fuente: https://github.com/t0thkr1s/frida-demo
Sigue el enlace para leerlo.
Tutorial 2
Desde: https://11x256.github.io/Frida-hooking-android-part-2/ (Partes 2, 3 y 4)
APKs y código fuente: https://github.com/11x256/frida-android-examples
Sigue el enlace para leerlo.
Tutorial 3
Desde: https://joshspicer.com/android-frida-1
APK: https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk
Sigue el enlace para leerlo.
Puedes encontrar algunos scripts increíbles de Frida aquí: https://codeshare.frida.re/
Ejemplos rápidos
Aquí puedes encontrar las funcionalidades más básicas e interesantes de Frida para crear un script rápido:
Llamando a Frida desde la línea de comandos
frida-ps -U
#Basic frida hooking
frida -l disableRoot.js -f owasp.mstg.uncrackable1
#Hooking before starting the app
frida -U --no-pause -l disableRoot.js -f owasp.mstg.uncrackable1
#The --no-pause and -f options allow the app to be spawned automatically,
#frozen so that the instrumentation can occur, and the automatically
#continue execution with our modified code.
Script básico de Python
import frida
# Attach to the target process
session = frida.attach("com.example.app")
# Define the JavaScript code to be injected
js_code = """
Java.perform(function () {
// Find the target method
var targetMethod = Java.use("com.example.app.TargetClass.targetMethod");
// Hook the target method
targetMethod.implementation = function () {
// Print the arguments passed to the method
console.log("Arguments: " + Array.prototype.slice.call(arguments));
// Call the original method
var result = this.targetMethod.apply(this, arguments);
// Print the result of the method
console.log("Result: " + result);
// Modify the result if needed
// result = "Modified result";
// Return the result
return result;
};
});
"""
# Create the script
script = session.create_script(js_code)
# Load the script into the target process
script.load()
# Detach from the target process
session.detach()
Script básico de Python
import frida
# Adjuntarse al proceso objetivo
session = frida.attach("com.example.app")
# Definir el código JavaScript a inyectar
js_code = """
Java.perform(function () {
// Encontrar el método objetivo
var targetMethod = Java.use("com.example.app.TargetClass.targetMethod");
// Enganchar el método objetivo
targetMethod.implementation = function () {
// Imprimir los argumentos pasados al método
console.log("Argumentos: " + Array.prototype.slice.call(arguments));
// Llamar al método original
var result = this.targetMethod.apply(this, arguments);
// Imprimir el resultado del método
console.log("Resultado: " + result);
// Modificar el resultado si es necesario
// result = "Resultado modificado";
// Devolver el resultado
return result;
};
});
"""
# Crear el script
script = session.create_script(js_code)
# Cargar el script en el proceso objetivo
script.load()
# Desadjuntarse del proceso objetivo
session.detach()
import frida, sys
jscode = open(sys.argv[0]).read()
process = frida.get_usb_device().attach('infosecadventures.fridademo')
script = process.create_script(jscode)
print('[ * ] Running Frida Demo application')
script.load()
sys.stdin.read()
Enganchando funciones sin parámetros
Engancha la función a()
de la clase sg.vantagepoint.a.c
Java.perform(function () {
; rootcheck1.a.overload().implementation = function() {
rootcheck1.a.overload().implementation = function() {
send("sg.vantagepoint.a.c.a()Z Root check 1 HIT! su.exists()");
return false;
};
});
Hook java exit()
Introduction
In this tutorial, we will learn how to hook the exit()
method in a Java application using Frida. By hooking this method, we can intercept the application's exit calls and perform additional actions before the application terminates.
Prerequisites
Before getting started, make sure you have the following:
- A rooted Android device or an emulator
- Frida installed on your machine
- Basic knowledge of JavaScript and Java
Steps
Follow the steps below to hook the exit()
method:
-
Launch the target application on your Android device or emulator.
-
Open a terminal and start the Frida server by running the following command:
frida-server
-
Create a new JavaScript file, for example,
hook.js
, and add the following code:Java.perform(function () { var System = Java.use('java.lang.System'); var Runtime = Java.use('java.lang.Runtime'); // Hook the exit() method System.exit.overload('int').implementation = function (status) { console.log('Exit status: ' + status); // Perform additional actions here // Call the original exit() method this.exit(status); }; });
-
Save the
hook.js
file. -
In the terminal, navigate to the directory where the
hook.js
file is located. -
Run the following command to start the Frida script:
frida -U -l hook.js -f <package_name>
Replace
<package_name>
with the package name of the target application. -
You should see the output of the
console.log()
statement whenever theexit()
method is called in the target application. -
Customize the code inside the
implementation
function to perform your desired actions before the application exits.
Conclusion
By hooking the exit()
method using Frida, we can intercept and modify the behavior of an application when it tries to exit. This technique can be useful for various purposes, such as analyzing the application's termination process or preventing it from exiting under certain conditions.
var sysexit = Java.use("java.lang.System");
sysexit.exit.overload("int").implementation = function(var_0) {
send("java.lang.System.exit(I)V // We avoid exiting the application :)");
};
Tutorial de Frida: Enganchando .onStart()
y .onCreate()
de MainActivity
En este tutorial, aprenderemos cómo utilizar Frida para enganchar los métodos .onStart()
y .onCreate()
de la clase MainActivity en una aplicación de Android. Esto nos permitirá interceptar y modificar el comportamiento de estos métodos en tiempo de ejecución.
Requisitos previos
Antes de comenzar, asegúrate de tener instalado lo siguiente:
- Frida Server en el dispositivo Android objetivo.
- Frida CLI en tu máquina local.
Paso 1: Conectarse al dispositivo
Primero, debemos conectarnos al dispositivo Android objetivo utilizando Frida CLI. Ejecuta el siguiente comando en tu terminal:
frida-ps -U
Esto mostrará una lista de los procesos en ejecución en el dispositivo. Asegúrate de que la aplicación que deseas pentestar esté en la lista.
Paso 2: Crear el script de Frida
A continuación, crearemos un script de Frida para enganchar los métodos .onStart()
y .onCreate()
de la clase MainActivity. Crea un archivo llamado hook.js
y pega el siguiente código:
Java.perform(function() {
var MainActivity = Java.use('com.example.app.MainActivity');
MainActivity.onStart.implementation = function() {
console.log('Método onStart() enganchado');
// Agrega aquí tu código personalizado
this.onStart();
};
MainActivity.onCreate.implementation = function() {
console.log('Método onCreate() enganchado');
// Agrega aquí tu código personalizado
this.onCreate();
};
});
Paso 3: Ejecutar el script de Frida
Ahora, ejecutaremos el script de Frida para enganchar los métodos .onStart()
y .onCreate()
. Ejecuta el siguiente comando en tu terminal:
frida -U -l hook.js -f com.example.app
Esto iniciará la aplicación de Android objetivo y enganchará los métodos especificados en el script de Frida.
Paso 4: Verificar la salida
Finalmente, verifica la salida en la terminal para confirmar que los métodos .onStart()
y .onCreate()
han sido enganchados con éxito. También puedes agregar tu propio código personalizado dentro de los métodos enganchados para modificar su comportamiento.
¡Felicidades! Ahora sabes cómo utilizar Frida para enganchar los métodos .onStart()
y .onCreate()
de la clase MainActivity en una aplicación de Android. Esto te permitirá realizar pruebas de penetración y modificar el comportamiento de la aplicación en tiempo de ejecución.
var mainactivity = Java.use("sg.vantagepoint.uncrackable1.MainActivity");
mainactivity.onStart.overload().implementation = function() {
send("MainActivity.onStart() HIT!!!");
var ret = this.onStart.overload().call(this);
};
mainactivity.onCreate.overload("android.os.Bundle").implementation = function(var_0) {
send("MainActivity.onCreate() HIT!!!");
var ret = this.onCreate.overload("android.os.Bundle").call(this,var_0);
};
Hook android .onCreate()
En este tutorial, aprenderás cómo realizar un hook en el método .onCreate()
de una aplicación Android utilizando Frida.
Requisitos previos
- Dispositivo Android rooteado o emulador con acceso de root.
- Frida Server instalado en el dispositivo objetivo.
- Conocimientos básicos de JavaScript.
Pasos
-
Abre una terminal y ejecuta el siguiente comando para iniciar el servidor Frida en el dispositivo objetivo:
frida-server
-
Asegúrate de que el dispositivo objetivo y tu máquina estén conectados a la misma red.
-
En tu máquina, crea un nuevo archivo JavaScript llamado
hook.js
y ábrelo en un editor de texto. -
Agrega el siguiente código al archivo
hook.js
:Java.perform(function() { var targetClass = Java.use('com.example.app.MainActivity'); targetClass.onCreate.implementation = function() { console.log('Hook exitoso en el método onCreate()'); this.onCreate(); }; });
-
Guarda el archivo
hook.js
. -
Ejecuta el siguiente comando en la terminal para iniciar el script de Frida:
frida -U -l hook.js com.example.app
Asegúrate de reemplazar
com.example.app
con el nombre del paquete de la aplicación que deseas pentestar. -
Abre la aplicación en el dispositivo objetivo y verás que se muestra el mensaje "Hook exitoso en el método onCreate()" en la terminal.
¡Felicidades! Has realizado un hook en el método .onCreate()
de una aplicación Android utilizando Frida. Esto te permitirá interceptar y modificar el comportamiento de la aplicación en este punto específico.
var activity = Java.use("android.app.Activity");
activity.onCreate.overload("android.os.Bundle").implementation = function(var_0) {
send("Activity HIT!!!");
var ret = this.onCreate.overload("android.os.Bundle").call(this,var_0);
};
Enganchando funciones con parámetros y recuperando el valor
Enganchando una función de desencriptación. Imprimir la entrada, llamar a la función original para desencriptar la entrada y finalmente, imprimir los datos en texto plano:
function getString(data){
var ret = "";
for (var i=0; i < data.length; i++){
ret += data[i].toString();
}
return ret
}
var aes_decrypt = Java.use("sg.vantagepoint.a.a");
aes_decrypt.a.overload("[B","[B").implementation = function(var_0,var_1) {
send("sg.vantagepoint.a.a.a([B[B)[B doFinal(enc) // AES/ECB/PKCS7Padding");
send("Key : " + getString(var_0));
send("Encrypted : " + getString(var_1));
var ret = this.a.overload("[B","[B").call(this,var_0,var_1);
send("Decrypted : " + ret);
var flag = "";
for (var i=0; i < ret.length; i++){
flag += String.fromCharCode(ret[i]);
}
send("Decrypted flag: " + flag);
return ret; //[B
};
Enganchando funciones y llamándolas con nuestra entrada
Engancha una función que recibe una cadena y llámala con otra cadena (desde aquí)
var string_class = Java.use("java.lang.String"); // get a JS wrapper for java's String class
my_class.fun.overload("java.lang.String").implementation = function(x){ //hooking the new function
var my_string = string_class.$new("My TeSt String#####"); //creating a new String by using `new` operator
console.log("Original arg: " +x );
var ret = this.fun(my_string); // calling the original function with the new String, and putting its return value in ret variable
console.log("Return value: "+ret);
return ret;
};
Obteniendo un objeto ya creado de una clase
Si deseas extraer algún atributo de un objeto creado, puedes utilizar esto.
En este ejemplo, verás cómo obtener el objeto de la clase my_activity y cómo llamar a la función .secret() que imprimirá un atributo privado del objeto:
Java.choose("com.example.a11x256.frida_test.my_activity" , {
onMatch : function(instance){ //This function will be called for every instance found by frida
console.log("Found instance: "+instance);
console.log("Result of secret func: " + instance.secret());
},
onComplete:function(){}
});
Consejo de recompensa por errores: ¡regístrate en Intigriti, una plataforma premium de recompensas por errores creada por hackers, para hackers! ¡Únete a nosotros en https://go.intigriti.com/hacktricks hoy mismo y comienza a ganar recompensas de hasta $100,000!
{% embed url="https://go.intigriti.com/hacktricks" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- ¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Descubre La Familia PEASS, nuestra colección exclusiva de NFTs
- Obtén el swag oficial de PEASS y HackTricks
- Únete al 💬 grupo de Discord o al grupo de Telegram o sígueme en Twitter 🐦@carlospolopm.
- Comparte tus trucos de hacking enviando PRs al repositorio de hacktricks y al repositorio de hacktricks-cloud.