APK.SH es un script bash que facilita las aplicaciones de Android de ingeniería inversa, automatizando algunas tareas repetitivas como extraer, decodificar, reconstruir y parchear un APK.
APK.SH básicamente usa APKTool para desmontar, decodificar y reconstruir recursos y algunas bases para automatizar el proceso de inyección de los dispositivos Frida. También admite paquetes de aplicaciones/APK divididos.
⬅️ Tirar de un APK de un dispositivo es simple como en ejecución ./apk.sh pull <package_name>
? La decodificación de un APK es simple como en ejecución ./apk.sh decode <apk_name>
? La reconstrucción de un APK es simple como en ejecución ./apk.sh build <apk_dir>
apk.sh pull de un APK de un dispositivo. Admite paquetes de aplicaciones/apks divididos, lo que significa que los APK divididos se unirán en un solo APK (esto es útil para parchear). Si el paquete es un paquete de aplicaciones/APK dividido, APK.SH combinará los APK en un solo APK, arreglando todos los identificadores de recursos públicos.
apk.sh patch Patch Un APK para cargar Frida-Gadget.
Frida-Gadget. So es una biblioteca compartida de Frida destinada a ser cargada por programas para ser instrumentados (cuando el modo de operación inyectado no es adecuado). Simplemente cargando la biblioteca, le permitirá interactuar con ella utilizando herramientas existentes basadas en Frida como Frida-Trace. También admite un enfoque totalmente autónomo donde puede ejecutar scripts en el sistema de archivos sin ninguna comunicación externa.
Parchear un APK es simple como en ejecución ./apk.sh patch <apk_name> --arch arm .
Puede especificar una configuración de gadget de Frida en un JSON ./apk.sh patch <apk_name> --arch arm --gadget-conf <config.json>
Si se encuentra con los errores apktool d "ya internado" como en el #30, puede pasar el indicador --only-main-classes , que se pasará a apktool al decodificar su APK.
En la interacción predeterminada, Frida Gadget expone una interfaz compatible con el servidor Frida, escuchando en Localhost: 27042 de forma predeterminada. Para lograr la instrumentación temprana frida, deje bloquear la función del constructor de Gadget hasta que se attach() al proceso, o llame resume() después de pasar por el spawn() -> attach() -> ...apply instrumentation... pasos.
Si no desea este comportamiento de bloqueo y desea dejar que el programa se inicie, o si prefiere escuchar en una interfaz o puerto diferente, puede personalizar esto a través de un archivo de configuración JSON.
La configuración predeterminada es:
{
"interaction" : {
"type" : " listen " ,
"address" : " 127.0.0.1 " ,
"port" : 27042 ,
"on_port_conflict" : " fail " ,
"on_load" : " wait "
}
} Puede pasar el archivo de configuración del gadget a apk.sh con la opción --gadget-conf .
Una configuración típicamente sugerida podría ser:
{
"interaction" : {
"type" : " script " ,
"path" : " /data/local/tmp/script.js " ,
"on_change" : " reload "
}
}script.js podría ser algo así como:
var android_log_write = new NativeFunction (
Module . getExportByName ( null , '__android_log_write' ) ,
'int' ,
[ 'int' , 'pointer' , 'pointer' ]
) ;
var tag = Memory . allocUtf8String ( "[frida-script][ax]" ) ;
var work = function ( ) {
setTimeout ( function ( ) {
android_log_write ( 3 , tag , Memory . allocUtf8String ( "ping @ " + Date . now ( ) ) ) ;
work ( ) ;
} , 1000 ) ;
}
work ( ) ;
android_log_write ( 3 , tag , Memory . allocUtf8String ( ">--(O.o)-<" ) ) ; adb push script.js /data/local/tmp
./apk.sh patch <apk_name> --arch arm --gadget-conf <config.json>
adb install file.gadget.apk
Agregue el siguiente código para imprimir para registrar la salida de la console.log .
// print to logcat the console.log output
// see: https://github.com/frida/frida/issues/382
var android_log_write = new NativeFunction (
Module . getExportByName ( null , '__android_log_write' ) ,
'int' ,
[ 'int' , 'pointer' , 'pointer' ]
) ;
var tag = Memory . allocUtf8String ( "[frida-script][ax]" ) ;
console . log = function ( str ) {
android_log_write ( 3 , tag , Memory . allocUtf8String ( str ) ) ;
} apk.sh [SUBCOMMAND] [APK FILE|APK DIR|PKG NAME] [FLAGS]
apk.sh pull [PKG NAME] [FLAGS]
apk.sh decode [APK FILE] [FLAGS]
apk.sh build [APK DIR] [FLAGS]
apk.sh patch [APK FILE] [FLAGS]
apk.sh rename [APK FILE] [PKG NAME] [FLAGS]
pull Pull an apk from device/emulator.
decode Decode an apk.
build Re-build an apk.
patch Patch an apk.
rename Rename the apk package.
-a, --arch <arch> Especifique la arquitectura de destino, obligatoria cuando se parche.
-g, --gadget-conf <json_file> Especifique un archivo de configuración de frida-gadget, opcional al parche.
-n, --net Agregue una configuración de seguridad de red permisiva al construir, opcional. Se puede usar con Patch, Pull and Cambisame también.
-s, --safe no decodifique los recursos al decodificar (es decir, apktool -r). No se puede usar al parchear.
-d, --no-dis no desmontar DEX, opcional al decodificar (es decir, apktool -s). No se puede usar al parchear.
https://frida.re/docs/gadget/
https://lief-project.github.io/doc/latest/tutorials/09_frida_lief.html
https://koz.io/Using-frida-on-doid-without-root/
https://github.com/sensepost/obyection/
https://github.com/nickstadb/patch-apk/
https://neo-geo2.gitbook.io/adventures-on-security/frida-scripting-guide/frida-scripting-guide