
Rende più semplice il reverse engineering delle app Android, automatizzando compiti ripetitivi come il pulling, il decoding, il rebuilding e il patching di un APK.
apk.sh è uno script Bash che semplifica il reverse engineering delle app Android, automatizzando alcune operazioni ripetitive come l'estrazione, la decodifica, la ricostruzione e l'applicazione di patch a un APK.
apk.sh utilizza fondamentalmente apktool per disassemblare, decodificare e ricostruire le risorse e un po' di bash per automatizzare il processo di iniezione del gadget frida. Supporta anche app bundle/APK split.
⬅️ Estrarre un APK da un dispositivo è semplice come eseguire ./apk.sh pull <package_name>
🔧 Decodificare un APK è semplice come eseguire ./apk.sh decode <apk_name>
🔩 Ricostruire un APK è semplice come eseguire ./apk.sh build <apk_dir>
apk.sh pull estrae un APK da un dispositivo.
Supporta app bundle/APK split, il che significa che gli APK split verranno uniti in un unico APK (utile per l'applicazione di patch).
Se il pacchetto è un app bundle/APK split, apk.sh combinerà gli APK in un unico APK, correggendo tutti gli identificatori delle risorse pubbliche.
apk.sh patch applica una patch a un APK per caricare frida-gadget.so all'avvio.
frida-gadget.so è una libreria condivisa di Frida destinata a essere caricata dai programmi da strumentare (quando la modalità di funzionamento Injected non è adatta). Caricando semplicemente la libreria ti permetterà di interagire con essa utilizzando strumenti esistenti basati su Frida come frida-trace. Supporta anche un approccio completamente autonomo in cui può eseguire script dal filesystem senza alcuna comunicazione esterna.
Applicare una patch a un APK è semplice come eseguire ./apk.sh patch <apk_name> --arch arm.
Puoi anche specificare una configurazione del gadget Frida in un json ./apk.sh patch <apk_name> --arch arm --gadget-conf <config.json>
Se incontri errori apktool d di "already interned" come in #30, puoi passare il flag --only-main-classes, che verrà passato ad apktool durante la decodifica del tuo APK.
Nell'interazione predefinita, Frida Gadget espone un'interfaccia compatibile con frida-server, in ascolto su localhost:27042 per impostazione predefinita. Per ottenere una strumentazione anticipata, Frida fa sì che la funzione costruttore del Gadget si blocchi finché non ti attach() al processo o chiami resume() dopo aver eseguito i passaggi usuali spawn() -> attach() -> ...applica strumentazione....
Se non desideri questo comportamento bloccante e vuoi lasciare che il programma si avvii subito, o preferisci che ascolti su un'interfaccia o porta diversa, puoi personalizzarlo tramite un file di configurazione json.
La configurazione predefinita è:
{
"interaction": {
"type": "listen",
"address": "127.0.0.1",
"port": 27042,
"on_port_conflict": "fail",
"on_load": "wait"
}
}
Puoi passare il file di configurazione del gadget a apk.sh con l'opzione --gadget-conf.
Una configurazione tipicamente suggerita potrebbe essere:
{
"interaction": {
"type": "script",
"path": "/data/local/tmp/script.js",
"on_change":"reload"
}
}
script.js potrebbe essere qualcosa del genere:
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
Aggiungi il seguente codice per stampare su logcat l'output console.log di qualsiasi script dal frida codeshare quando si utilizza il tipo di interazione Script.
// 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 Estrae un apk dal dispositivo/emulatore.
decode Decodifica un apk.
build Ricostruisce un apk.
patch Applica una patch a un apk.
rename Rinomina il pacchetto dell'apk.
-a, --arch <arch> Specifica l'architettura di destinazione, obbligatorio durante l'applicazione di patch.
-g, --gadget-conf <json_file> Specifica un file di configurazione per frida-gadget, opzionale durante l'applicazione di patch.
-n, --net Aggiunge una configurazione di sicurezza di rete permissiva durante la costruzione, opzionale. Può essere utilizzato anche con patch, pull e rename.
-r, --no-res Non decodificare le risorse durante la decodifica (es. apktool -r), opzionale. Può essere utilizzato durante l'applicazione di patch.
-s, --no-src Non disassemblare il dex durante la decodifica (es. apktool -s), opzionale. Può essere utilizzato durante l'applicazione di patch.
https://lief-project.github.io/doc/latest/tutorials/09_frida_lief.html
https://koz.io/using-frida-on-android-without-root/
https://github.com/sensepost/objection/
https://github.com/NickstaDB/patch-apk/
https://neo-geo2.gitbook.io/adventures-on-security/frida-scripting-guide/frida-scripting-guide