apk.sh es un script de Bash que facilita la ingeniería inversa de aplicaciones Android, automatizando algunas tareas repetitivas como extraer, decodificar, reconstruir y aplicar parches a un APK.

Características
apk.sh básicamente usa apktool para desensamblar, decodificar y reconstruir recursos, y algunos comandos bash para automatizar el proceso de inyección de frida-gadget. También admite paquetes de aplicaciones/APKs divididos.
- Aplicar parches a APKs para cargar frida-gadget.so al inicio.
- Compatibilidad con paquetes de aplicaciones/APKs divididos.
- Desensamblar recursos a una forma casi original con apktool.
- Reconstruir recursos decodificados a APK/JAR binario con apktool.
- Firma digital del apk con apksigner.
- Soporte para múltiples arquitecturas (arm, arm64, x86, x86_64).
- No se necesita un dispositivo Android rooteado.
Para empezar
Extraer un APK de un dispositivo es tan simple como ejecutar ./apk.sh pull <nombre_del_paquete>
Decodificar un APK es tan simple como ejecutar ./apk.sh decode <nombre_del_apk>
Reconstruir un APK es tan simple como ejecutar ./apk.sh build <directorio_del_apk>
apk.sh pull
apk.sh pull extrae un APK de un dispositivo. Admite paquetes de aplicaciones/APKs divididos, lo que significa que los APKs divididos se unirán en un solo APK (esto es útil para aplicar parches). Si el paquete es un paquete de aplicaciones/APK dividido, apk.sh combinará los APKs en un solo APK, corrigiendo todos los identificadores de recursos públicos.
apk.sh patch
apk.sh patch aplica un parche a un APK para cargar frida-gadget.so al inicio.
frida-gadget.so es una biblioteca compartida de Frida destinada a ser cargada por programas que se van a instrumentar (cuando el modo de funcionamiento Inyectado no es adecuado). Simplemente cargando la biblioteca, podrá interactuar con ella utilizando herramientas basadas en Frida existentes como frida-trace. También admite un enfoque totalmente autónomo donde puede ejecutar scripts desde el sistema de archivos sin ninguna comunicación externa.
Aplicar un parche a un APK es tan simple como ejecutar ./apk.sh patch <nombre_del_apk> --arch arm
.
También puede especificar una configuración de frida-gadget en un archivo json ./apk.sh patch <nombre_del_apk> --arch arm --gadget-conf <config.json>
Configuraciones de Frida’s Gadget
En la interacción predeterminada, Frida Gadget expone una interfaz compatible con frida-server, escuchando en localhost:27042 de forma predeterminada. Para lograr una instrumentación temprana, Frida permite que la función constructora de Gadget bloquee hasta que se adjunte() al proceso o se llame a resume() después de pasar por los pasos habituales spawn() -> attach() -> …aplicar instrumentación…
Si no desea este comportamiento de bloqueo y desea que el programa arranque inmediatamente, o si prefiere que escuche 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 de gadget a apk.sh con la opción --gadget-conf
.
Interacción de scripts
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 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 <nombre_del_apk> --arch arm --gadget-conf <config.json>
adb install file.gadget.apk
Nota
Agregue el siguiente código para imprimir en logcat la salida de console.log de cualquier script de frida codeshare cuando use el tipo de interacción Script.
// Imprimir en logcat la salida de console.log
// Ver: 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));
}
Requisitos
- apktool
- apksigner
- unxz
- zipalign
- aapt
- adb
Uso
SINOPSIS
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]
SUBCOMANDOS
pull //Extraer un apk desde un dispositivo/emulador.
decode //Decodificar un apk.
build //Reconstruir un apk.
patch //Aplicar un parche a un apk.
rename //Renombrar el paquete apk.
FLAGS
- -a, –arch <arch> Especificar la arquitectura de destino, obligatorio al aplicar parches.
- -g, –gadget-conf Especificar un archivo de configuración de frida-gadget, opcional al aplicar parches.
- -n, –net Agregar una configuración de seguridad de red permisiva al construir, opcional. Se puede usar también con patch, pull y rename.
- -s, –safe No decodificar recursos al decodificar (es decir, apktool -r). No se puede usar al aplicar parches.
- -d, –no-dis No desensamblar dex, opcional al decodificar (es decir, apktool -s). No se puede usar al aplicar parches.