frida
¿Qué es?
Al analizar el apk, probablemente querramos modificar algo del aplicativo durante el runtime o hacer que otros flujos se ejecuten. Para esto podemos usar FRIDA
Frida se encuentra dentro de pip, por lo que podemos instalarla de la siguiente forma:
pip3 install frida-tools
Para ver que version de frida se tiene, basta con ejecutar
frida --version
De igual forma objection se puede instalar con pip
pip3 install objection
Correr FRIDA
Objection
Hay multiples formas de correr frida en el dispositivo, una de ellas es inyectar frida directamente en el apk. Esto lo podemos hacer con objection:
objection patchapk -s apk_name.apk
Objection extraerá, parcheará, volverá a empaquetar, alineará y firmará la aplicación, por lo que es una forma muy rápida y sencilla de ejecutar Frida.
Algo importante es que la aplicación esperará a que Frida se conecte a ella cuando se inicie, por lo que para iniciar la aplicación se tiene que ejecutar:
frida -U FridaTarget
(La flag -U indica que nos conectaremos por USB)
Patching Manual
Si objection falla, es posible patchear el APK manualmente:
Primeramente, decompilamos el apk con apktool
apktool d FridaTarget.apk -o frida_target
Posterior a ello, se tiene que buscar la main activity:
<activity android:exported="true" android:label="@string/app_name" android:name="io.hextree.fridatarget.MainActivity" android:theme="@style/Theme.FridaTarget.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
Con el nombre de la clase, se debe buscar en las clases smali.
De igual forma se requiere el frida-gadget (https://github.com/frida/frida/releases). Hay que verificar la arquitectura del dispositivo donde se instalara la app, en este caso arm64.
Hay que colocar dicho frida-gadget.so dentro de lib/arm64-v8a.
Posterior a ello, se requiere editar el AndroidManifest.xml editando extractNativeLibs en true. Esto hara que el android package manager descomprima las librerias nativas en el caso de que se encuentren comprimidas. Si no se activa, fallara la app.
Finalmente lo que se hace es llamar a la libreria nativa cuando se inicia la app. Esto se hace facilmente copiando las siguientes lineas y pegandolas despues de onCreate dentro del apk:
const-string v0, "frida-gadget"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
Ejemplo de patching:
.method protected onCreate(Landroid/os/Bundle;)V
.locals 9
.param p1, "savedInstanceState" # Landroid/os/Bundle;
.line 26
invoke-super {p0, p1}, Landroidx/appcompat/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V
# Injected Gadget here
const-string v0, "frida-gadget"
invoke-static {v0}, Ljava/lang/System;->loadLibrary(Ljava/lang/String;)V
.line 28
invoke-virtual {p0}, Lio/hextree/fridatarget/MainActivity;->getLayoutInflater()Landroid/view/LayoutInflater;
move-result-object v0
...
Ya que se haya llevado a cabo el patching, se debe volver a construir el apk:
apktool b frida_target -o FridaTargetPatched.apk
Posteriormente llevar a cabo la alineación:
zipalign -p 4 FridaTargetPatched.apk FridaTargetAligned.apk
Y finalmente llevar a cabo el firmado con la keystore
keytool -genkey -v -keystore HEXTREE.keystore -alias HEXTREE -keyalg RSA -keysize 2048 -validity 10000
apksigner sign -v --ks ./HEXTREE.keystore --ks-key-alias HEXTREE --v2-signing-enabled true FridaTargetAligned.apk