Frida Tutorial

Aprende a hackear AWS desde cero hasta convertirte en un experto con htARTE (Experto en Red Team de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:

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, y comienza a ganar recompensas de hasta $100,000!

Instalación

Instala las herramientas de frida:

pip install frida-tools
pip install frida

Descarga e instala en el dispositivo Android el servidor frida (Descarga la última versión). Una línea para reiniciar adb en modo root, conectarse a él, cargar frida-server, dar permisos de ejecución y ejecutarlo en segundo plano:

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 &"

Verificar 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

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.

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.

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 más scripts increíbles de Frida aquí: https://codeshare.frida.re/

Ejemplos Rápidos

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, 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()

Enganchar funciones sin parámetros

Enganchar 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;
};
});

Enganchar java exit()

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  :)");
};

Enganchar MainActivity .onStart() & .onCreate()

Para enganchar los métodos onStart() y onCreate() de MainActivity, podemos usar el siguiente script de Frida:

Java.perform(function() {
    var MainActivity = Java.use('com.example.MainActivity');
    
    MainActivity.onStart.implementation = function() {
        console.log('onStart() called');
        this.onStart();
    };
    
    MainActivity.onCreate.implementation = function() {
        console.log('onCreate() called');
        this.onCreate();
    };
});
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);
};

Enganchar .onCreate() de Android

Puede usar Frida para enganchar el método .onCreate() de una aplicación Android y realizar acciones personalizadas. Aquí hay un ejemplo de cómo lograrlo:

Java.perform(function() {
    var MainActivity = Java.use('com.example.MainActivity');
    MainActivity.onCreate.implementation = function() {
        console.log('onCreate() enganchado');
        this.onCreate();
    };
});
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);
};

Enganchar funciones con parámetros y recuperar el valor

Enganchar una función de descifrado. Imprimir la entrada, llamar a la función original para descifrar 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
};

Enganchar funciones y llamarlas con nuestra entrada

Enganchar una función que recibe una cadena y llamarla con otra cadena (de 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;
};

Obtener un objeto de una clase ya creada

Si deseas extraer algún atributo de un objeto creado, puedes usar 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(){}
});

Otros tutoriales de Frida

Consejo de recompensa por errores: Regístrate en Intigriti, una plataforma de recompensas por errores premium creada por hackers, para hackers. ¡Únete a nosotros en https://go.intigriti.com/hacktricks hoy y comienza a ganar recompensas de hasta $100,000!

Aprende a hackear AWS de cero a héroe con htARTE (Experto en Red de HackTricks AWS)!

Otras formas de apoyar a HackTricks:

Última actualización