Todos los pasos mencionados a continuación están en macOS Mojave
Instalar frida-tools
con pip3
Ejecute el comando $ pip --version
y $ pip3 --version
para verificar de qué pip proviene Python 3x . Por ejemplo, debería ver información de la versión como se muestra a continuación:
$ pip 19.0.3 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
Luego ejecute el comando pip correcto para instalar frida-tools
, por ejemplo, pip3
$ pip3 install frida-tools
Resultados exitosos:
....
Successfully built frida-tools frida
Installing collected packages: colorama, frida, six, wcwidth, prompt-toolkit, pygments, frida-tools
Successfully installed colorama-0.4.1 frida-12.4.7 frida-tools-1.3.2 prompt-toolkit-2.0.9 pygments-2.3.1 six-1.12.0 wcwidth-0.1.7
Probando su instalación
Copie el binario cat
a una carpeta temporal, por ejemplo, /tmp/cat
y luego ejecute cat
desde ese directorio:
$ mkdir ~ /frida
$ cp /bin/cat /frida/cat
$ /frida/cat
En otra terminal, cree un archivo example.py
con el siguiente contenido:
import frida
def on_message ( message , data ):
print ( "[on_message] message:" , message , "data:" , data )
session = frida . attach ( "cat" )
script = session . create_script ( """'use strict';
rpc.exports.enumerateModules = function () {
return Process.enumerateModulesSync();
};
""" )
script . on ( "message" , on_message )
script . load ()
print ([ m [ "name" ] for m in script . exports . enumerate_modules ()])
Luego ejecute el script example.py
con el siguiente comando
$ python3 example.py
El resultado debería ser algo similar a esto (dependiendo de su plataforma y versiones de la biblioteca):
[ u'cat' , …, u'ld-2.15.so' ]
Comando adb
de Android
Asegúrese de que adb
pueda ver su dispositivo:
$ adb devices -l
Esto también asegurará que el demonio adb se esté ejecutando en su escritorio, lo que le permite a Frida descubrir y comunicarse con su dispositivo independientemente de si lo tiene conectado a través de USB o WiFi.
frida-server
en el emulador (o dispositivo real)Los pasos a continuación se basan en el emulador de Android Nexus 6P (x86) api 23 en macOS Majave.
En primer lugar, descargue la última versión frida-server
para Android desde la página de lanzamientos de frida-server, por ejemplo, para el emulador de Android x86
, debe descargar frida-server-12.4.7-android-x86.xz y ejecutarlo en su emulador:
$ adb root # might be required
$ adb push frida-server /data/local/tmp/
$ adb shell " chmod 755 /data/local/tmp/frida-server "
$ adb shell " /data/local/tmp/frida-server & "
Para el último paso, si ve el siguiente error:
Unable to load SELinux policy from the kernel: Failed to open file “/sys/fs/selinux/policy”: Permission denied
Luego necesitas ejecutar frida-server
usando el shell raíz, por ejemplo
$ adb shell
angler:/ $ su
angler:/ # /data/local/tmp/frida-server &
[1] 12089
angler:/ #
[1] 12089
es la identificación del proceso de frida-server
.
Ahora, en tu escritorio, es momento de asegurarte de que lo básico esté funcionando. Correr:
frida-ps -U
Esto debería darle una lista de procesos similar a:
PID Name
----- ---------------------------------------------------
721 ATFWD-daemon
4450 adbd
730 [email protected]
407 [email protected]
408 [email protected]
409 [email protected]
410 [email protected]
406 [email protected]
Para alterar un valor Boolean
dentro del código fuente de Java, es decir, el Boolean bTamperingSucces = false;
, o algún otro código que le interese.
apktool
se puede obtener del sitio web de Apktool. Simplemente siga los pasos dentro de esta página para instalar apktool.
adb
se envía con el SDK de Android, se puede encontrar en el directorio <your-some-path>/Android/sdk/platform-tools/adb
apksigner
consiste en firmar su apk con un archivo de almacén de claves. Esta herramienta se puede encontrar en el directorio <ANDROID_HOME>/Android/sdk/build-tools/28.0.3/apksigner
y el uso está documentado en apksigner de línea de comandos.
Clona el proyecto de ejemplo de DecompileApk.
Busque el archivo apk ya compilado DecompileApk/app/release/app-release.apk
.
Descompílelo usando apktool .
$ cd < your-path > /DecompileApk/app/release/
$ apktool d --no-res -f app-release.apk
Verá los resultados a continuación
I: Using Apktool 2.4.0 on app-release.apk
I: Copying raw resources...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
Busque DecompileApk/app/release/app-release/smali/com/arophix/decompileapk/MainActivity.smali
en el directorio de códigos pequeños y busque el siguiente código
const / 4 p1 , 0x0
Simplemente cambie 0x0
(que significa false
) a 0x1
(que significa true
) y guarde el archivo.
Usando apktool para construir el apk manipulado.
apktool b app - release
Deberías ver los resultados a continuación
I: Using Apktool 2.4.0
I: Checking whether sources has changed...
I: Smaling smali folder into classes.dex...
I: Checking whether resources has changed...
I: Copying raw resources...
I: Copying libs... (/lib)
I: Building apk file...
I: Copying unknown files/dir...
I: Built apk...
Busque el apk recién creado en el directorio dist
DecompileApk/app/release/app-release/dist/app-release.apk
Firme el apk usando apksigner y el almacén de claves ubicado en DecompileApk/app/decompileapk.jks
(modifique las rutas para el almacén de claves y el apk según su caso en consecuencia).
$ < ANDROID_HOME > /sdk/build-tools/28.0.3/apksigner sign --ks ../decompileapk.jks app-release.apk
Debería ver los resultados a continuación e ingresar la contraseña 123456
Keystore password for signer # 1:
Instale el apk firmado usando el comando adb.
$ adb install < path-to-the-tampered-apk > /app-release.apk
En lugar de ver "Hello from C++"
en la pantalla, ahora deberías ver "Hello, Android reverse engineer!"
.
Enganchando el código fuente de Java de Android usando Frida.
Busque el script en hook_java_methods.py y ejecútelo usando el siguiente comando, y luego haga clic en el botón de su aplicación de Android iniciada.
$ python3 hook_java_methods.py
[ * ] Running CTF
[ * ] onClick
[ * ] Called - isPhoneRooted ()
[ * ] onClick
[ * ] Called - isPhoneRooted ()
Si ve un error como el siguiente:
$ frida.ServerNotRunningError: unable to connect to remote frida-server: closed
Recuerda que has iniciado frida-server
en tu emulador.
Mientras tanto, en la pantalla de su emulador, debería ver el mensaje del brindis cambiado a Device not rooted
si tiene éxito.
Enganchando el código fuente de Android C usando Frida.
Descompilar APK
En primer lugar, descompile el apk usando apktool para extraer la biblioteca compartida, es decir, libnative-lib.so
.
$ cd DecompileApk/app/release
$ apktool d --no-res app-release.apk
Encuentre el método JNI de destino
En segundo lugar, utilice el siguiente comando para encontrar la función JNI que desea conectar.
$ nm --demangle --dynamic app-release/lib/x86/libnative-lib.so
Debería ver los siguientes resultados:
00004d80 T Java_com_arophix_decompileapk_MainActivity_stringFromJNI
000090b0 T std::bad_typeid::what () const
00005cf0 T std::bad_exception::what () const
00005e70 T std::bad_array_length::what () const
00005df0 T std::bad_array_new_length::what () const
00008ff0 T std::bad_cast::what () const
...
Función Hook C por nombre
Busque el script en hooknative-by-function-name.py y ejecútelo usando el siguiente comando, y luego haga clic en el botón de su aplicación de Android iniciada.
$ python3 hooknative-by-function-name.py
[ * ] Running Arophix Hook Test ...
Java_com_arophix_decompileapk_MainActivity_stringFromJNI called with:
ret: 0x200019
Si ve un error como el siguiente:
$ frida.ServerNotRunningError: unable to connect to remote frida-server: closed
Recuerda que has iniciado frida-server
en tu emulador.
Mientras tanto, en la pantalla de su emulador, debería ver el texto cambiado a Frida is hooking this displayed text from Native layer by function name.
si éxito.
Función Hook C por dirección
Busque el script en hooknative-by-function-address.py y ejecútelo usando el siguiente comando, y luego haga clic en el botón de su aplicación de Android iniciada.
$ python3 hooknative-by-function-address.py
[ * ] Running Arophix Hook Test ...
[+] membase: 0xb2acd000
[+] addressOfStringFromJni: 0xb2ad1d80
[++] addressOfStringFromJni: 0xb2ad1d80
ret: 0x19
Si ve un error como el siguiente:
$ frida.ServerNotRunningError: unable to connect to remote frida-server: closed
Recuerda que has iniciado frida-server
en tu emulador.
Mientras tanto, en la pantalla de su emulador, debería ver el texto cambiado a Frida is hooking this displayed text from Native layer by function address.
si éxito.